Support build script for Windows 31/183031/5
authorJunghoon Park <jh9216.park@samsung.com>
Mon, 2 Jul 2018 01:01:32 +0000 (10:01 +0900)
committerJunghoon Park <jh9216.park@samsung.com>
Mon, 2 Jul 2018 04:37:20 +0000 (13:37 +0900)
Prep
 sudo apt-get install mingw-w64

Build
 ./build.sh build_win

Change-Id: Ie73f72be7916d3625e560ccdee73e635a681fe87
Signed-off-by: Junghoon Park <jh9216.park@samsung.com>
CMakeLists.txt
build.sh
idlc/CMakeLists.txt
idlc/main.cc

index 6e3d1f6..fd0ec2d 100644 (file)
@@ -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)
index 29b8201..13bc25b 100755 (executable)
--- 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 ;;
index 16bb81e..7f870c4 100644 (file)
@@ -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)
 
index 7487cae..19b4df5 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include <glib.h>
+#include <getopt.h>
 
 #include <iostream>
 #include <cstring>
@@ -37,6 +37,7 @@ namespace {
 
 class Options {
  public:
+  Options();
   ~Options() = default;
 
   static std::unique_ptr<Options> 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> 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<Options>(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<Options>(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<Options>(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<Options>(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> 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<Options>(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> Options::Parse(int argc, char** argv) {
   }
 
   options->isProxy_ = cmd[CMD_PROXY] ? true : false;
-  options->language_ = static_cast<char*>(opt[OPT_LANGUAGE]);
-  options->input_ = static_cast<char*>(opt[OPT_INPUT]);
-  options->output_ = static_cast<char*>(opt[OPT_OUTPUT]);
   options->hasNamespace_ = opt[OPT_NAMESPACE] ? true : false;
   options->hasRpcPortLib_ = opt[OPT_RPCLIB] ? true : false;