summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunghoon Park <jh9216.park@samsung.com>2018-07-02 10:01:32 +0900
committerJunghoon Park <jh9216.park@samsung.com>2018-07-02 13:37:20 +0900
commit0330c7a8044849d9efd0dd89d0e27559dcfcdcac (patch)
tree6ed1728ef38e9b4fba61ff574beb22a899e4b8f4
parent6c407bda1ac0d9408c27ffa9182abdb539f3f9d4 (diff)
downloadtidl-0330c7a8044849d9efd0dd89d0e27559dcfcdcac.tar.gz
tidl-0330c7a8044849d9efd0dd89d0e27559dcfcdcac.tar.bz2
tidl-0330c7a8044849d9efd0dd89d0e27559dcfcdcac.zip
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 <jh9216.park@samsung.com>
-rw-r--r--CMakeLists.txt5
-rwxr-xr-xbuild.sh14
-rw-r--r--idlc/CMakeLists.txt11
-rw-r--r--idlc/main.cc151
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 <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;