From 0330c7a8044849d9efd0dd89d0e27559dcfcdcac Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Mon, 2 Jul 2018 10:01:32 +0900 Subject: [PATCH] Support build script for Windows Prep sudo apt-get install mingw-w64 Build ./build.sh build_win Change-Id: Ie73f72be7916d3625e560ccdee73e635a681fe87 Signed-off-by: Junghoon Park --- CMakeLists.txt | 5 +- build.sh | 14 ++++- idlc/CMakeLists.txt | 11 ++-- idlc/main.cc | 151 +++++++++++++++++++++++++++++++--------------------- 4 files changed, 115 insertions(+), 66 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e3d1f6..fd0ec2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,12 +6,15 @@ INCLUDE(FindPkgConfig) FIND_PACKAGE(BISON REQUIRED) FIND_PACKAGE(FLEX REQUIRED) +IF(NOT DEFINED MINIMUM_BUILD) ENABLE_TESTING() SET(TIDL_UNIT_TESTS tidl-unit-tests) ADD_TEST(NAME ${TIDL_UNIT_TESTS} COMMAND ${TIDL_UNIT_TESTS} test.tidl test_error.tidl WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/unit_tests) +ENDIF(NOT DEFINED MINIMUM_BUILD) ADD_SUBDIRECTORY(idlc) +IF(NOT DEFINED MINIMUM_BUILD) ADD_SUBDIRECTORY(unit_tests) - ADD_DEPENDENCIES(${TIDL_UNIT_TESTS} ${PROJECT_NAME}) +ENDIF(NOT DEFINED MINIMUM_BUILD) diff --git a/build.sh b/build.sh index 29b8201..13bc25b 100755 --- a/build.sh +++ b/build.sh @@ -14,6 +14,7 @@ usage() { echo "Usage: $0 [command]" echo "Commands:" echo " build Build the package" + echo " build_win Build the package for Windows" echo " clean Clean all artifacts" echo " clean_build Clean & Build the package" } @@ -23,7 +24,17 @@ cmd_build() { mkdir -p $SCRIPT_DIR/$BUILD_DIR cd $SCRIPT_DIR/$BUILD_DIR VER=`cat ../packaging/tidl.spec | grep 'Version' | sed 's/Version://' | tr -d ' \r'` - cmake .. -DFULLVER=$VER + cmake .. -DFULLVER=$VER -DMINIMUM_BUILD="yes" + make clean + make +} + +cmd_build_win() { + echo "[TIDL] Build the package" + mkdir -p $SCRIPT_DIR/$BUILD_DIR + cd $SCRIPT_DIR/$BUILD_DIR + VER=`cat ../packaging/tidl.spec | grep 'Version' | sed 's/Version://' | tr -d ' \r'` + cmake .. -DFULLVER=$VER -DMINIMUM_BUILD="yes" -DBUILD_WIN="yes" make clean make } @@ -46,6 +57,7 @@ cmd_clean_build() { cmd=$1; shift; case "$cmd" in build|--build|-b) cmd_build $@ ;; + build_win|--build_win|-bw) cmd_build_win $@ ;; clean|--clean|-c) cmd_clean $@ ;; clean_build |--clean_build |-cb) cmd_clean_build $@ ;; *) usage ;; diff --git a/idlc/CMakeLists.txt b/idlc/CMakeLists.txt index 16bb81e..7f870c4 100644 --- a/idlc/CMakeLists.txt +++ b/idlc/CMakeLists.txt @@ -1,19 +1,22 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) -PKG_CHECK_MODULES(LIBPKGS REQUIRED glib-2.0) - FOREACH(flag ${LIBPKGS_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) LINK_DIRECTORIES(${LIBPKGS_LIBRARY_DIRS}) +IF(DEFINED BUILD_WIN) +SET(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-g++") +SET(EXE_STATIC "-static") +ENDIF(DEFINED BUILD_WIN) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wno-unused-function -Wno-sign-compare") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") -SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIE") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -std=c++11") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") +SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") ADD_DEFINITIONS("-DFULLVER=\"${FULLVER}\"") @@ -33,7 +36,7 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${CPP_GEN_SOURCES} ${SOURCES} ) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIBPKGS_LIBRARIES}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIBPKGS_LIBRARIES} ${EXE_STATIC}) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/idlc/main.cc b/idlc/main.cc index 7487cae..19b4df5 100644 --- a/idlc/main.cc +++ b/idlc/main.cc @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include #include #include @@ -37,6 +37,7 @@ namespace { class Options { public: + Options(); ~Options() = default; static std::unique_ptr Parse(int argc, char** argv); @@ -52,6 +53,7 @@ class Options { CMD_PROXY, CMD_STUB, CMD_VERSION, + CMD_HELP, CMD_MAX }; @@ -77,6 +79,28 @@ class Options { bool hasRpcPortLib_ = false; }; +Options::Options() { + help_ = R"__option_cb( +Usage: + tidlc [OPTION...] + +Help Options: + -h, --help Show help options + +Additional Options: + -l, --language=LANGUAGE Select generating language (C, C++, C#). + -i, --input=INPUT A tidl interface file. + -o, --output=OUTPUT The generated interface file. + -n, --namespace Add the prefix in the funtion name as output file name (C language only). + -r, --rpclib Generate C# library for rpc-port (C# language only). + +Application Options: + -p, --proxy Generate proxy code + -s, --stub Generate stub code + -v, --version Show version information +)__option_cb"; +} + void Options::PrintUsage() { std::cerr << help_ << std::endl; } @@ -86,74 +110,84 @@ void Options::PrintVersion() { } std::unique_ptr Options::Parse(int argc, char** argv) { - gpointer cmd[CMD_MAX] = { 0, }; - static GOptionEntry cmdEntries[] = { - { "proxy", 'p', 0, G_OPTION_ARG_NONE, &cmd[CMD_PROXY], - "Generate proxy code", NULL }, - { "stub", 's', 0, G_OPTION_ARG_NONE, &cmd[CMD_STUB], - "Generate stub code", NULL }, - { "version", 'v', 0, G_OPTION_ARG_NONE, &cmd[CMD_VERSION], - "Show version information", NULL }, - { NULL } - }; - gpointer opt[OPT_MAX] = { 0, }; - static GOptionEntry optEntries[] = { - { "language", 'l', 0, G_OPTION_ARG_STRING, &opt[OPT_LANGUAGE], - "Select generating language (C, C++, C#).", "LANGUAGE" }, - { "input", 'i', 0, G_OPTION_ARG_STRING, &opt[OPT_INPUT], - "A tidl interface file.", "INPUT" }, - { "output", 'o', 0, G_OPTION_ARG_STRING, &opt[OPT_OUTPUT], - "The generated interface file.", "OUTPUT" }, - { "namespace", 'n', 0, G_OPTION_ARG_NONE, &opt[OPT_NAMESPACE], - "Add the prefix in the funtion name as output file name " \ - "(C language only).", - NULL }, - { "rpclib", 'r', 0, G_OPTION_ARG_NONE, &opt[OPT_RPCLIB], - "Generate C# library for rpc-port " \ - "(C# language only).", - NULL }, - { NULL } + int cmd[CMD_MAX] = { 0, }; + int opt[OPT_MAX] = { 0, }; + auto options = std::unique_ptr(new Options()); + int option_index = 0; + + struct option long_options[] = { + {"proxy", no_argument, NULL, 'p'}, + {"stub", no_argument, NULL, 's'}, + {"version", no_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {"language", required_argument, NULL, 'l'}, + {"input", required_argument, NULL, 'i'}, + {"output", required_argument, NULL, 'o'}, + {"namespace", no_argument, NULL, 'n'}, + {"rpclib", no_argument, NULL, 'r'}, + {0, 0, 0, 0} }; - GOptionContext* context = g_option_context_new(NULL); - if (!context) { - std::cerr << "Failed to create context" << std::endl; - return std::unique_ptr(nullptr); - } - g_option_context_add_main_entries(context, cmdEntries, NULL); + while (true) { + int c = getopt_long(argc, argv, "psvhl:i:o:nr", long_options, + &option_index); + if (c == -1) + break; - GOptionGroup* optGroup = g_option_group_new("option", "Additional Options:", - "Additional options", NULL, NULL); - if (!optGroup) { - std::cerr << "Failed to create option group" << std::endl; - g_option_context_free(context); - return std::unique_ptr(nullptr); - } - g_option_group_add_entries(optGroup, optEntries); - g_option_context_add_group(context, optGroup); - - GError* err = NULL; - if (!g_option_context_parse(context, &argc, &argv, &err)) { - std::cerr << argv[0] << ": " << err->message << std::endl; - g_option_context_free(context); - g_clear_error(&err); - return std::unique_ptr(nullptr); - } + switch (c) { + case 0: + break; + + case 'p': + cmd[CMD_PROXY] = 1; + break; + + case 's': + cmd[CMD_STUB] = 1; + break; + + case 'v': + cmd[CMD_VERSION] = 1; + break; + + case 'h': + cmd[CMD_HELP] = 1; + break; - gchar* help = g_option_context_get_help(context, TRUE, NULL); + case 'n': + opt[OPT_NAMESPACE] = 1; + break; - std::unique_ptr options(new Options()); - options->help_ = help; + case 'r': + opt[OPT_RPCLIB] = 1; + break; - g_free(help); - g_option_context_free(context); + case 'l': + opt[OPT_LANGUAGE] = 1; + options->language_ = optarg; + break; + + case 'i': + opt[OPT_INPUT] = 1; + options->input_ = optarg; + break; + + case 'o': + opt[OPT_OUTPUT] = 1; + options->output_ = optarg; + break; + + default: + cmd[CMD_HELP] = 1; + } + } if (cmd[CMD_VERSION]) { options->PrintVersion(); return std::unique_ptr(nullptr); } - if ((!cmd[CMD_PROXY] && !cmd[CMD_STUB]) || + if (cmd[CMD_HELP] || (!cmd[CMD_PROXY] && !cmd[CMD_STUB]) || !opt[OPT_LANGUAGE] || !opt[OPT_INPUT] || !opt[OPT_OUTPUT]) { options->PrintUsage(); @@ -161,9 +195,6 @@ std::unique_ptr Options::Parse(int argc, char** argv) { } options->isProxy_ = cmd[CMD_PROXY] ? true : false; - options->language_ = static_cast(opt[OPT_LANGUAGE]); - options->input_ = static_cast(opt[OPT_INPUT]); - options->output_ = static_cast(opt[OPT_OUTPUT]); options->hasNamespace_ = opt[OPT_NAMESPACE] ? true : false; options->hasRpcPortLib_ = opt[OPT_RPCLIB] ? true : false; -- 2.7.4