From 58c3b86a91ffb76321e618dc35f198e014710a49 Mon Sep 17 00:00:00 2001 From: owt5008137 Date: Sun, 9 Apr 2017 22:29:06 +0800 Subject: [PATCH 01/13] add cmake for pbc --- CMakeLists.txt | 104 ++++++++++++++++++++++++++++++++++++++++++++ build_android.sh | 100 ++++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 12 +++++ test/CMakeLists.txt | 43 ++++++++++++++++++ tool/CMakeLists.txt | 6 +++ 5 files changed, 265 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 build_android.sh create mode 100644 src/CMakeLists.txt create mode 100644 test/CMakeLists.txt create mode 100644 tool/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c0eb75b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,104 @@ +cmake_minimum_required(VERSION 3.1.0) +cmake_policy(SET CMP0054 NEW) + +enable_testing() +project(pbc C) + +##################################################################### +# output +set(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin") +set(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib") + +# compiler +if( ${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_C_COMPILER_ID} STREQUAL "Clang") + add_definitions(-Wall) + + if(NOT WIN32 AND NOT CYGWIN AND NOT MINGW) + add_definitions(-fPIC) + endif() + + # just for gcc + if( ${CMAKE_C_COMPILER_ID} STREQUAL "GNU") + include(CheckCCompilerFlag) + message(STATUS "Check Flag: -rdynamic -- running") + CHECK_C_COMPILER_FLAG(-rdynamic, C_FLAGS_RDYNAMIC_AVAILABLE) + if(C_FLAGS_RDYNAMIC_AVAILABLE) + message(STATUS "Check Flag: -rdynamic -- yes") + add_definitions(-rdynamic) + else() + message(STATUS "Check Flag: -rdynamic -- no") + endif() + + # gcc 4.9 and output with color + if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER "4.9.0" OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL "4.9.0" ) + add_definitions(-fdiagnostics-color=auto) + endif() + endif() +endif() + +# Compile flags +if ( NOT MSVC ) + list(APPEND CMAKE_C_FLAGS_DEBUG -ggdb -O0) + #list(APPEND CMAKE_C_FLAGS_RELEASE) + list(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO -ggdb) + #list(APPEND CMAKE_C_FLAGS_MINSIZEREL) +else() + if(NOT CMAKE_MSVC_RUNTIME) + set(CMAKE_MSVC_RUNTIME "MD") + endif() + list(APPEND CMAKE_C_FLAGS_DEBUG /Od /${CMAKE_MSVC_RUNTIME}d) + list(APPEND CMAKE_C_FLAGS_RELEASE /O2 /${CMAKE_MSVC_RUNTIME} /D NDEBUG) + list(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO /O2 /${CMAKE_MSVC_RUNTIME}d) + list(APPEND CMAKE_C_FLAGS_MINSIZEREL /Ox /${CMAKE_MSVC_RUNTIME} /D NDEBUG) +endif() + +# add custom define +macro(add_compiler_define) + foreach(def ${ARGV}) + if ( NOT MSVC ) + add_definitions(-D${def}) + else() + add_definitions("/D ${def}") + endif() + endforeach() +endmacro(add_compiler_define) + + +if(NOT CMAKE_BUILD_TYPE) + #set(CMAKE_BUILD_TYPE "Debug") + set(CMAKE_BUILD_TYPE "RelWithDebInfo") +endif() + +######################################################################## +## +## archives and executable files +## +######################################################################## + +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +## libpbc.a +set(LIBNAME "pbc") +add_subdirectory(src) + +add_custom_target(lib ALL DEPENDS ${LIBNAME}) + +## tool +add_subdirectory(tool) + +## test +find_package(Protobuf) +if (Protobuf_FOUND) + message(STATUS "Test: protobuf found at ${Protobuf_PROTOC_EXECUTABLE}, enable test sub-project now.") + add_subdirectory(test) +endif() + + +## Lua - binding +find_package(Lua) +if (LUA_FOUND) + message(STATUS "Lua: ${LUA_VERSION_STRING} found.INC=${LUA_INCLUDE_DIR},EXE=${LUA_LIBRARIES}") +endif() +## Lua 5.1 +## LuaJIT +## Lua 5.3 \ No newline at end of file diff --git a/build_android.sh b/build_android.sh new file mode 100644 index 0000000..9ba4e96 --- /dev/null +++ b/build_android.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# +########################################################################### +# +# Don't change anything here +WORKING_DIR="$(cd $(dirname $0))"; +cd "$WORKING_DIR"; + +ARCHS="x86 x86_64 armeabi armeabi-v7a arm64-v8a"; +NDK_ROOT=$NDK_ROOT; +SOURCE_DIR="$PWD"; +ANDROID_NATIVE_API_LEVEL=16 ; +ANDROID_TOOLCHAIN=clang ; +ANDROID_STL=c++_shared ; # + +# ======================= options ======================= +while getopts "a:c:n:hl:m:o:r:t:-" OPTION; do + case $OPTION in + a) + ARCHS="$OPTARG"; + ;; + c) + ANDROID_STL="$OPTARG"; + ;; + n) + NDK_ROOT="$OPTARG"; + ;; + h) + echo "usage: $0 [options] -n NDK_ROOT -r SOURCE_DIR [-- [cmake options]]"; + echo "options:"; + echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; + echo "-c [android stl] stl used by ndk(default: $ANDROID_STL, available: system, stlport_static, stlport_shared, gnustl_static, gnustl_shared, c++_static, c++_shared, none)"; + echo "-n [ndk root directory] ndk root directory.(default: $DEVELOPER_ROOT)"; + echo "-l [api level] API level, see $NDK_ROOT/platforms for detail.(default: $ANDROID_NATIVE_API_LEVEL)"; + echo "-r [source dir] root directory of this library"; + echo "-t [toolchain] ANDROID_TOOLCHAIN.(gcc/clang, default: $ANDROID_TOOLCHAIN)"; + echo "-h help message."; + exit 0; + ;; + r) + SOURCE_DIR="$OPTARG"; + ;; + t) + ANDROID_TOOLCHAIN="$OPTARG"; + ;; + l) + ANDROID_NATIVE_API_LEVEL=$OPTARG; + ;; + -) + break; + break; + ;; + ?) #当有不认识的选项的时候arg为? + echo "unkonw argument detected"; + exit 1; + ;; + esac +done + +shift $(($OPTIND-1)); + +########## +if [ ! -e "$SOURCE_DIR/CMakeLists.txt" ]; then + echo "$SOURCE_DIR/CMakeLists.txt not found"; + exit -2; +fi +SOURCE_DIR="$(cd "$SOURCE_DIR" && pwd)"; + +mkdir -p "$WORKING_DIR/lib"; + +for ARCH in ${ARCHS}; do + echo "================== Compling $ARCH =================="; + echo "Building mbedtls for android-$ANDROID_NATIVE_API_LEVEL ${ARCH}" + + # sed -i.bak '4d' Makefile; + echo "Please stand by..." + if [ -e "$WORKING_DIR/build/$ARCH" ]; then + rm -rf "$WORKING_DIR/build/$ARCH"; + fi + mkdir -p "$WORKING_DIR/build/$ARCH"; + cd "$WORKING_DIR/build/$ARCH"; + + mkdir -p "$WORKING_DIR/lib/$ARCH"; + + cmake "$SOURCE_DIR" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES $@; + make -j4; +done + +cd "$WORKING_DIR"; +echo "Copying include files..."; + +if [ "$WORKING_DIR" != "$SOURCE_DIR" ]; then + if [ -e "$WORKING_DIR/include" ]; then + rm -rf "$WORKING_DIR/include"; + fi + + cp -rf "$SOURCE_DIR/include" "$WORKING_DIR/include"; +fi +echo "Building done."; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..b5c0007 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,12 @@ +aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) + +add_library(${LIBNAME} STATIC ${LIBSRCS}) + +### install header +install(FILES "${CMAKE_CURRENT_LIST_DIR}/../pbc.h" DESTINATION "include") + +### install library +install(TARGETS ${LIBNAME} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..486599f --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,43 @@ +set(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/test") + +unset(TEST_PROTO_PBS) +## compile protocols +file(GLOB TEST_PROTO_LIST *.proto) +foreach(TEST_PROTO_FILE IN LISTS TEST_PROTO_LIST) + get_filename_component(TEST_PROTO_BIN_NAME ${TEST_PROTO_FILE} NAME_WE) + + add_custom_command(OUTPUT "${TEST_PROTO_BIN_NAME}.pb" COMMAND + ${Protobuf_PROTOC_EXECUTABLE} + -o "${TEST_PROTO_BIN_NAME}.pb" + -I ${CMAKE_CURRENT_LIST_DIR} "${CMAKE_CURRENT_LIST_DIR}/${TEST_PROTO_FILE}" + DEPENDS "${CMAKE_CURRENT_LIST_DIR}/${TEST_PROTO_FILE}" + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + ) + + list(APPEND TEST_PROTO_PBS "${TEST_PROTO_BIN_NAME}.pb") +endforeach() + + +## compile tests +file(GLOB TEST_SRC_LIST *.c) +foreach(TEST_SRC_FILE IN LISTS TEST_SRC_LIST) + get_filename_component(TEST_SRC_BIN_NAME ${TEST_SRC_FILE} NAME_WE) + + add_executable(${TEST_SRC_BIN_NAME} EXCLUDE_FROM_ALL ${TEST_SRC_FILE}) + target_link_libraries(${TEST_SRC_BIN_NAME} ${LIBNAME}) + + add_dependencies(${TEST_SRC_BIN_NAME} ${TEST_PROTO_PBS}) + + if(WIN32) + add_test(NAME "run_test_${TEST_SRC_BIN_NAME}" COMMAND + "${TEST_SRC_BIN_NAME}.exe" + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + ) + else() + add_test(NAME "run_test_${TEST_SRC_BIN_NAME}" COMMAND + "./${TEST_SRC_BIN_NAME}" + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + ) + endif() + add_dependencies("run_test_${TEST_SRC_BIN_NAME}" ${TEST_SRC_BIN_NAME}) +endforeach() \ No newline at end of file diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt new file mode 100644 index 0000000..2c7e7ec --- /dev/null +++ b/tool/CMakeLists.txt @@ -0,0 +1,6 @@ + +add_executable(dump + "${CMAKE_CURRENT_LIST_DIR}/dump.h" +) + +target_link_libraries(dump ${LIBNAME}) \ No newline at end of file From a73a19706fddfaa45cc16b9b3b81a0a1222c4e84 Mon Sep 17 00:00:00 2001 From: owt5008137 Date: Sun, 9 Apr 2017 23:43:48 +0800 Subject: [PATCH 02/13] add cmake support for pbc and fix some warning in modern compiler --- CMakeLists.txt | 39 +++++++++++++++++++++++++++------------ test/CMakeLists.txt | 39 ++++++++++++++++++++++++++------------- test/test.c | 2 +- test/varint.c | 7 ++++++- tool/CMakeLists.txt | 2 +- 5 files changed, 61 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c0eb75b..a031dc3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 3.1.0) cmake_policy(SET CMP0054 NEW) -enable_testing() project(pbc C) ##################################################################### @@ -37,19 +36,20 @@ if( ${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_C_COMPILER_ID} STREQUAL "Cl endif() # Compile flags -if ( NOT MSVC ) - list(APPEND CMAKE_C_FLAGS_DEBUG -ggdb -O0) - #list(APPEND CMAKE_C_FLAGS_RELEASE) - list(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO -ggdb) - #list(APPEND CMAKE_C_FLAGS_MINSIZEREL) -else() +if (MSVC) if(NOT CMAKE_MSVC_RUNTIME) set(CMAKE_MSVC_RUNTIME "MD") endif() - list(APPEND CMAKE_C_FLAGS_DEBUG /Od /${CMAKE_MSVC_RUNTIME}d) - list(APPEND CMAKE_C_FLAGS_RELEASE /O2 /${CMAKE_MSVC_RUNTIME} /D NDEBUG) - list(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO /O2 /${CMAKE_MSVC_RUNTIME}d) - list(APPEND CMAKE_C_FLAGS_MINSIZEREL /Ox /${CMAKE_MSVC_RUNTIME} /D NDEBUG) + list(APPEND CMAKE_C_FLAGS /TP) # force using c++ compiler + list(APPEND CMAKE_C_FLAGS_DEBUG /${CMAKE_MSVC_RUNTIME}d) + list(APPEND CMAKE_C_FLAGS_RELEASE /${CMAKE_MSVC_RUNTIME} /D NDEBUG) + list(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO /${CMAKE_MSVC_RUNTIME}d) + list(APPEND CMAKE_C_FLAGS_MINSIZEREL /${CMAKE_MSVC_RUNTIME} /D NDEBUG) +else() + list(APPEND CMAKE_C_FLAGS_DEBUG -ggdb) + #list(APPEND CMAKE_C_FLAGS_RELEASE) + list(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO -ggdb) + #list(APPEND CMAKE_C_FLAGS_MINSIZEREL) endif() # add custom define @@ -69,6 +69,18 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo") endif() +# convert list to parameters +string(REPLACE ";" " " CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") +string(REPLACE ";" " " CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") +string(REPLACE ";" " " CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") +string(REPLACE ";" " " CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}") +string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +string(REPLACE ";" " " CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") +string(REPLACE ";" " " CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") +string(REPLACE ";" " " CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") +string(REPLACE ";" " " CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}") +string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + ######################################################################## ## ## archives and executable files @@ -84,7 +96,10 @@ add_subdirectory(src) add_custom_target(lib ALL DEPENDS ${LIBNAME}) ## tool -add_subdirectory(tool) +if(CYGWIN OR MINGW OR UNIX) + # it use getopt which is only available in UNIX like environment + add_subdirectory(tool) +endif() ## test find_package(Protobuf) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 486599f..348abd4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,43 +1,56 @@ set(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/test") +add_custom_target(run_test) + unset(TEST_PROTO_PBS) ## compile protocols file(GLOB TEST_PROTO_LIST *.proto) foreach(TEST_PROTO_FILE IN LISTS TEST_PROTO_LIST) get_filename_component(TEST_PROTO_BIN_NAME ${TEST_PROTO_FILE} NAME_WE) - add_custom_command(OUTPUT "${TEST_PROTO_BIN_NAME}.pb" COMMAND - ${Protobuf_PROTOC_EXECUTABLE} - -o "${TEST_PROTO_BIN_NAME}.pb" - -I ${CMAKE_CURRENT_LIST_DIR} "${CMAKE_CURRENT_LIST_DIR}/${TEST_PROTO_FILE}" - DEPENDS "${CMAKE_CURRENT_LIST_DIR}/${TEST_PROTO_FILE}" + add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/${TEST_PROTO_BIN_NAME}.pb" + COMMAND ${Protobuf_PROTOC_EXECUTABLE} + -o "${EXECUTABLE_OUTPUT_PATH}/${TEST_PROTO_BIN_NAME}.pb" + --proto_path ${CMAKE_CURRENT_LIST_DIR} + ${TEST_PROTO_FILE} + DEPENDS ${TEST_PROTO_FILE} + COMMENT "Run: ${Protobuf_PROTOC_EXECUTABLE} -o ${TEST_PROTO_BIN_NAME}.pb -I ${CMAKE_CURRENT_LIST_DIR} ${TEST_PROTO_FILE}" WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} ) - list(APPEND TEST_PROTO_PBS "${TEST_PROTO_BIN_NAME}.pb") + list(APPEND TEST_PROTO_PBS "${EXECUTABLE_OUTPUT_PATH}/${TEST_PROTO_BIN_NAME}.pb") endforeach() ## compile tests file(GLOB TEST_SRC_LIST *.c) +include_directories("${CMAKE_CURRENT_LIST_DIR}/../src") foreach(TEST_SRC_FILE IN LISTS TEST_SRC_LIST) get_filename_component(TEST_SRC_BIN_NAME ${TEST_SRC_FILE} NAME_WE) + set(TEST_SRC_BIN_NAME "test_${TEST_SRC_BIN_NAME}") add_executable(${TEST_SRC_BIN_NAME} EXCLUDE_FROM_ALL ${TEST_SRC_FILE}) target_link_libraries(${TEST_SRC_BIN_NAME} ${LIBNAME}) - add_dependencies(${TEST_SRC_BIN_NAME} ${TEST_PROTO_PBS}) - - if(WIN32) - add_test(NAME "run_test_${TEST_SRC_BIN_NAME}" COMMAND - "${TEST_SRC_BIN_NAME}.exe" + if(MSVC) + add_custom_target("run_${TEST_SRC_BIN_NAME}" COMMAND + "${CMAKE_BUILD_TYPE}/${TEST_SRC_BIN_NAME}.exe" + DEPENDS ${TEST_SRC_BIN_NAME} ${TEST_PROTO_PBS} + COMMENT "Run Test: ${TEST_SRC_BIN_NAME}" WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + USES_TERMINAL ) + + add_dependencies(run_test "run_${TEST_SRC_BIN_NAME}") else() - add_test(NAME "run_test_${TEST_SRC_BIN_NAME}" COMMAND + add_custom_target("run_${TEST_SRC_BIN_NAME}" COMMAND "./${TEST_SRC_BIN_NAME}" + DEPENDS ${TEST_SRC_BIN_NAME} ${TEST_PROTO_PBS} + COMMENT "Run Test: ${TEST_SRC_BIN_NAME}" WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + USES_TERMINAL ) + + add_dependencies(run_test "run_${TEST_SRC_BIN_NAME}") endif() - add_dependencies("run_test_${TEST_SRC_BIN_NAME}" ${TEST_SRC_BIN_NAME}) endforeach() \ No newline at end of file diff --git a/test/test.c b/test/test.c index 450a866..caff422 100644 --- a/test/test.c +++ b/test/test.c @@ -39,5 +39,5 @@ main() { test(env); pbc_delete(env); - return 0; + return ret; } diff --git a/test/varint.c b/test/varint.c index 5b33ddb..abd98f8 100644 --- a/test/varint.c +++ b/test/varint.c @@ -3,6 +3,11 @@ #include "varint.h" #include "pbc.h" +#define varint_encode(n, b) _pbcV_encode(n, b) +#define varint_decode(n, r) _pbcV_decode(n, r) +#define varint_zigzag(n, b) _pbcV_zigzag(n, b) +#define varint_dezigzag64(r) _pbcV_dezigzag64(r) + static void dump(uint8_t buffer[10], int s) { @@ -31,7 +36,7 @@ decode(uint8_t buffer[10]) static void zigzag(int64_t n) { - printf("%llx\n",n); + printf("%x%x\n", (int32_t)(n >> 32), (int32_t)(n & 0xFFFFFFFF)); uint8_t zigzag[10]; dump(zigzag, varint_zigzag(n,zigzag)); diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index 2c7e7ec..35e777b 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -1,6 +1,6 @@  add_executable(dump - "${CMAKE_CURRENT_LIST_DIR}/dump.h" + dump.c ) target_link_libraries(dump ${LIBNAME}) \ No newline at end of file From dc411cf38b0553c601d10aa9acceb20464c0dfbd Mon Sep 17 00:00:00 2001 From: owent Date: Mon, 10 Apr 2017 17:05:56 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0lua=E7=9A=84cmake?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 16 +++++++++++----- binding/lua/CMakeLists.txt | 23 +++++++++++++++++++++++ binding/lua53/CMakeLists.txt | 23 +++++++++++++++++++++++ build_android.sh | 27 ++++++++------------------- 4 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 binding/lua/CMakeLists.txt create mode 100644 binding/lua53/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index a031dc3..1cbbb5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,8 +112,14 @@ endif() ## Lua - binding find_package(Lua) if (LUA_FOUND) - message(STATUS "Lua: ${LUA_VERSION_STRING} found.INC=${LUA_INCLUDE_DIR},EXE=${LUA_LIBRARIES}") -endif() -## Lua 5.1 -## LuaJIT -## Lua 5.3 \ No newline at end of file + message(STATUS "Lua: ${LUA_VERSION_STRING} found.INC=${LUA_INCLUDE_DIR},LIB=${LUA_LIBRARIES}") + + ## Lua 5.3 + if ("5.2" VERSION_LESS ${LUA_VERSION_STRING}) + message(STATUS "Lua Binding: using binding/lua53 for lua-binding") + add_subdirectory(binding/lua53) + else() ## Lua 5.1 or LuaJIT + message(STATUS "Lua Binding: using binding/lua for lua-binding") + add_subdirectory(binding/lua) + endif() +endif() \ No newline at end of file diff --git a/binding/lua/CMakeLists.txt b/binding/lua/CMakeLists.txt new file mode 100644 index 0000000..8a7c9ab --- /dev/null +++ b/binding/lua/CMakeLists.txt @@ -0,0 +1,23 @@ +aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) + +set(CMAKE_SHARED_LIBRARY_PREFIX "") +set(CMAKE_STATIC_LIBRARY_PREFIX "") +if(CMAKE_OSX_ARCHITECTURES AND NOT ${CMAKE_OSX_ARCHITECTURES} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) + add_library(protobuf STATIC ${LIBSRCS}) + target_link_libraries(protobuf ${LIBNAME}) +else() + add_library(protobuf SHARED ${LIBSRCS}) + target_link_libraries(protobuf ${LIBNAME} ${LUA_LIBRARIES}) +endif() + +file(GLOB LUA_CODE_LIST *.lua) +### install header +install( + FILES protobuf.lua parser.lua + DESTINATION "lib/lua") + +### install library +install(TARGETS protobuf + RUNTIME DESTINATION lib + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) \ No newline at end of file diff --git a/binding/lua53/CMakeLists.txt b/binding/lua53/CMakeLists.txt new file mode 100644 index 0000000..3ba4b99 --- /dev/null +++ b/binding/lua53/CMakeLists.txt @@ -0,0 +1,23 @@ +aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) + +set(CMAKE_SHARED_LIBRARY_PREFIX "") +set(CMAKE_STATIC_LIBRARY_PREFIX "") +if(CMAKE_OSX_ARCHITECTURES AND NOT ${CMAKE_OSX_ARCHITECTURES} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) + add_library(protobuf STATIC ${LIBSRCS}) + target_link_libraries(protobuf ${LIBNAME}) +else() + add_library(protobuf SHARED ${LIBSRCS}) + target_link_libraries(protobuf ${LIBNAME} ${LUA_LIBRARIES}) +endif() + +file(GLOB LUA_CODE_LIST *.lua) +### install header +install( + FILES protobuf.lua + DESTINATION "lib/lua") + +### install library +install(TARGETS protobuf + RUNTIME DESTINATION lib + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) \ No newline at end of file diff --git a/build_android.sh b/build_android.sh index 9ba4e96..4bbaca9 100644 --- a/build_android.sh +++ b/build_android.sh @@ -67,34 +67,23 @@ if [ ! -e "$SOURCE_DIR/CMakeLists.txt" ]; then fi SOURCE_DIR="$(cd "$SOURCE_DIR" && pwd)"; -mkdir -p "$WORKING_DIR/lib"; - for ARCH in ${ARCHS}; do echo "================== Compling $ARCH =================="; - echo "Building mbedtls for android-$ANDROID_NATIVE_API_LEVEL ${ARCH}" + echo "Building pbc for android-$ANDROID_NATIVE_API_LEVEL ${ARCH}" # sed -i.bak '4d' Makefile; echo "Please stand by..." - if [ -e "$WORKING_DIR/build/$ARCH" ]; then - rm -rf "$WORKING_DIR/build/$ARCH"; + if [ -e "$WORKING_DIR/build-$ARCH" ]; then + rm -rf "$WORKING_DIR/build-$ARCH"; fi - mkdir -p "$WORKING_DIR/build/$ARCH"; - cd "$WORKING_DIR/build/$ARCH"; + mkdir -p "$WORKING_DIR/build-$ARCH"; + cd "$WORKING_DIR/build-$ARCH"; - mkdir -p "$WORKING_DIR/lib/$ARCH"; + mkdir -p "$WORKING_DIR/prebuilt/$ARCH"; - cmake "$SOURCE_DIR" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES $@; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES $@; make -j4; + make install; done -cd "$WORKING_DIR"; -echo "Copying include files..."; - -if [ "$WORKING_DIR" != "$SOURCE_DIR" ]; then - if [ -e "$WORKING_DIR/include" ]; then - rm -rf "$WORKING_DIR/include"; - fi - - cp -rf "$SOURCE_DIR/include" "$WORKING_DIR/include"; -fi echo "Building done."; From 8d0507280d835f019ab2bf5b581073be52916bfe Mon Sep 17 00:00:00 2001 From: owent Date: Mon, 10 Apr 2017 20:18:55 +0800 Subject: [PATCH 04/13] build script for ios and cmake --- CMakeLists.txt | 7 +++- binding/lua/CMakeLists.txt | 12 ++++--- binding/lua53/CMakeLists.txt | 12 ++++--- build_android.sh | 5 ++- build_ios.sh | 66 +++++++++++++++++++++++++----------- 5 files changed, 70 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cbbb5d..ea8f5d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,7 +110,12 @@ endif() ## Lua - binding -find_package(Lua) +if (LUA_INCLUDE_DIR AND LUA_VERSION_STRING AND (CMAKE_OSX_SYSROOT OR LUA_LIBRARIES)) + set(LUA_FOUND YES) +else () + find_package(Lua) +endif() + if (LUA_FOUND) message(STATUS "Lua: ${LUA_VERSION_STRING} found.INC=${LUA_INCLUDE_DIR},LIB=${LUA_LIBRARIES}") diff --git a/binding/lua/CMakeLists.txt b/binding/lua/CMakeLists.txt index 8a7c9ab..d5173e9 100644 --- a/binding/lua/CMakeLists.txt +++ b/binding/lua/CMakeLists.txt @@ -1,15 +1,19 @@ -aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) +include_directories(${LUA_INCLUDE_DIR}) -set(CMAKE_SHARED_LIBRARY_PREFIX "") -set(CMAKE_STATIC_LIBRARY_PREFIX "") -if(CMAKE_OSX_ARCHITECTURES AND NOT ${CMAKE_OSX_ARCHITECTURES} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) +aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) + +if(CMAKE_OSX_ARCHITECTURES AND NOT LUA_LIBRARIES) add_library(protobuf STATIC ${LIBSRCS}) target_link_libraries(protobuf ${LIBNAME}) else() + set(CMAKE_SHARED_LIBRARY_PREFIX "") + set(CMAKE_STATIC_LIBRARY_PREFIX "") add_library(protobuf SHARED ${LIBSRCS}) target_link_libraries(protobuf ${LIBNAME} ${LUA_LIBRARIES}) endif() +add_dependencies(lib protobuf) + file(GLOB LUA_CODE_LIST *.lua) ### install header install( diff --git a/binding/lua53/CMakeLists.txt b/binding/lua53/CMakeLists.txt index 3ba4b99..164f2c6 100644 --- a/binding/lua53/CMakeLists.txt +++ b/binding/lua53/CMakeLists.txt @@ -1,15 +1,19 @@ -aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) +include_directories(${LUA_INCLUDE_DIR}) -set(CMAKE_SHARED_LIBRARY_PREFIX "") -set(CMAKE_STATIC_LIBRARY_PREFIX "") -if(CMAKE_OSX_ARCHITECTURES AND NOT ${CMAKE_OSX_ARCHITECTURES} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) +aux_source_directory(${CMAKE_CURRENT_LIST_DIR} LIBSRCS) + +if(CMAKE_OSX_ARCHITECTURES AND NOT LUA_LIBRARIES) add_library(protobuf STATIC ${LIBSRCS}) target_link_libraries(protobuf ${LIBNAME}) else() + set(CMAKE_SHARED_LIBRARY_PREFIX "") + set(CMAKE_STATIC_LIBRARY_PREFIX "") add_library(protobuf SHARED ${LIBSRCS}) target_link_libraries(protobuf ${LIBNAME} ${LUA_LIBRARIES}) endif() +add_dependencies(lib protobuf) + file(GLOB LUA_CODE_LIST *.lua) ### install header install( diff --git a/build_android.sh b/build_android.sh index 4bbaca9..6247a64 100644 --- a/build_android.sh +++ b/build_android.sh @@ -4,8 +4,7 @@ ########################################################################### # # Don't change anything here -WORKING_DIR="$(cd $(dirname $0))"; -cd "$WORKING_DIR"; +WORKING_DIR="$PWD"; ARCHS="x86 x86_64 armeabi armeabi-v7a arm64-v8a"; NDK_ROOT=$NDK_ROOT; @@ -39,7 +38,7 @@ while getopts "a:c:n:hl:m:o:r:t:-" OPTION; do exit 0; ;; r) - SOURCE_DIR="$OPTARG"; + SOURCE_DIR="$(cd "$OPTARG" && pwd)"; ;; t) ANDROID_TOOLCHAIN="$OPTARG"; diff --git a/build_ios.sh b/build_ios.sh index 4ad4e01..17d9519 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -9,14 +9,13 @@ SDKVERSION=$(xcrun -sdk iphoneos --show-sdk-version); ########################################################################### # # Don't change anything here -WORKING_DIR="$(cd $(dirname $0))"; -cd "$WORKING_DIR"; - +WORKING_DIR="$PWD"; ARCHS="i386 x86_64 armv7 armv7s arm64"; DEVELOPER_ROOT=$(xcode-select -print-path); +SOURCE_DIR="$PWD"; # ======================= options ======================= -while getopts "a:d:hs:-" OPTION; do +while getopts "a:d:hr:s:-" OPTION; do case $OPTION in a) ARCHS="$OPTARG"; @@ -30,9 +29,13 @@ while getopts "a:d:hs:-" OPTION; do echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; echo "-d [developer root directory] developer root directory, we use xcode-select -print-path to find default value.(default: $DEVELOPER_ROOT)"; echo "-s [sdk version] sdk version, we use xcrun -sdk iphoneos --show-sdk-version to find default value.(default: $SDKVERSION)"; + echo "-r [source dir] root directory of this library"; echo "-h help message."; exit 0; ;; + r) + SOURCE_DIR="$(cd "$OPTARG" && pwd)"; + ;; s) SDKVERSION="$SDKVERSION"; ;; @@ -75,27 +78,50 @@ for ARCH in ${ARCHS}; do export DEVROOT="${DEVELOPER_ROOT}/Platforms/${PLATFORM}.platform/Developer"; export SDKROOT="${DEVROOT}/SDKs/${PLATFORM}${SDKVERSION}.sdk"; export BUILD_TOOLS="${DEVELOPER_ROOT}"; - #export CC="${BUILD_TOOLS}/usr/bin/gcc -arch ${ARCH}"; - export CC=${BUILD_TOOLS}/usr/bin/gcc; - #export LD=${BUILD_TOOLS}/usr/bin/ld; - #export CPP=${BUILD_TOOLS}/usr/bin/cpp; - #export CXX=${BUILD_TOOLS}/usr/bin/g++; - export AR=${DEVELOPER_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar; - #export AS=${DEVROOT}/usr/bin/as; - #export NM=${DEVROOT}/usr/bin/nm; - #export CXXCPP=${BUILD_TOOLS}/usr/bin/cpp; - #export RANLIB=${BUILD_TOOLS}/usr/bin/ranlib; - #export LDFLAGS="-arch ${ARCH} -isysroot ${SDKROOT} "; export CFLAGS="-arch ${ARCH} -isysroot ${SDKROOT} -O2 -fPIC -Wall"; - make libpbc.a CC="$CC" AR="$AR rc" CFLAGS="$CFLAGS" $@; - mv -f build/libpbc.a "build/libpbc-$ARCH.a"; + if [ -e "$WORKING_DIR/build-$ARCH" ]; then + rm -rf "$WORKING_DIR/build-$ARCH"; + fi + mkdir -p "$WORKING_DIR/build-$ARCH"; + cd "$WORKING_DIR/build-$ARCH"; + + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/build-$ARCH" -DCMAKE_OSX_SYSROOT=$SDKROOT -DCMAKE_SYSROOT=$SDKROOT -DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_C_FLAGS="-fPIC" "$@"; + make lib -j4 install; done cd "$WORKING_DIR"; echo "Linking and packaging library..."; -for LIB_NAME in "libpbc"; do - lipo -create build/$LIB_NAME-*.a -output "build/$LIB_NAME.a"; - echo "build/$LIB_NAME.a built."; +mkdir -p "prebuilt/lib"; +if [ -e "prebuilt/include" ]; then + rm -rf "prebuilt/include"; +fi + +if [ -e "prebuilt/lib/lua" ]; then + rm -rf "prebuilt/lib/lua"; +fi + +for LIB_NAME in "libpbc.a" "libprotobuf.a"; do + LIB_FOUND=($(find build-* -name $LIB_NAME)); + if [ ${#LIB_FOUND} -gt 0 ]; then + if [ -e "prebuilt/lib/$LIB_NAME" ]; then + rm -rf "prebuilt/lib/$LIB_NAME"; + fi + echo "Run: lipo -create ${LIB_FOUND[@]} -output \"prebuilt/lib/$LIB_NAME\""; + lipo -create ${LIB_FOUND[@]} -output "prebuilt/lib/$LIB_NAME"; + echo "lib/$LIB_NAME built."; + fi done + +for ARCH_DIR in build-*; do + if [ ! -e "prebuilt/include" ] && [ -e "$ARCH_DIR/include" ]; then + echo "Copy include files from $ARCH_DIR/include"; + cp -rf "$ARCH_DIR/include" "prebuilt/include"; + fi + + if [ ! -e "prebuilt/lib/lua" ] && [ -e "$ARCH_DIR/lib/lua" ]; then + echo "Copy lua files from $ARCH_DIR/lib/lua"; + cp -rf "$ARCH_DIR/lib/lua" "prebuilt/lib/lua"; + fi +done \ No newline at end of file From 20f917805bc6005e649a62b54ea0f8e6c7aaf002 Mon Sep 17 00:00:00 2001 From: owent Date: Mon, 10 Apr 2017 22:32:39 +0800 Subject: [PATCH 05/13] build android prebuilt script --- build_android.sh | 77 ++++++++++++++++++++++++++++++++++++++++++++---- build_ios.sh | 8 ++++- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/build_android.sh b/build_android.sh index 6247a64..c088c2e 100644 --- a/build_android.sh +++ b/build_android.sh @@ -11,10 +11,13 @@ NDK_ROOT=$NDK_ROOT; SOURCE_DIR="$PWD"; ANDROID_NATIVE_API_LEVEL=16 ; ANDROID_TOOLCHAIN=clang ; -ANDROID_STL=c++_shared ; # +ANDROID_STL= ; # +LUAINCDIR= ; +LUALIBDIR= ; +LUALIBNAME=("libluajit-*.so" "liblua.a" "liblua.so" "liblua.so.*" "libtolua.so" "libtolua.so.*"); # ======================= options ======================= -while getopts "a:c:n:hl:m:o:r:t:-" OPTION; do +while getopts "a:c:n:hl:r:t:i:b:f:-" OPTION; do case $OPTION in a) ARCHS="$OPTARG"; @@ -34,17 +37,29 @@ while getopts "a:c:n:hl:m:o:r:t:-" OPTION; do echo "-l [api level] API level, see $NDK_ROOT/platforms for detail.(default: $ANDROID_NATIVE_API_LEVEL)"; echo "-r [source dir] root directory of this library"; echo "-t [toolchain] ANDROID_TOOLCHAIN.(gcc/clang, default: $ANDROID_TOOLCHAIN)"; + echo "-i [lua include dir] Lua include dir, which should has [$ARCHS/]include directory in it."; + echo "-b [lua library dir] Lua library dir, which should has [$ARCHS] which we can find a lua lib in it."; + echo "-f [lua library file pattern] Lua library search pattern for lua library file, which will be linked into protobuf.so."; echo "-h help message."; exit 0; ;; + l) + ANDROID_NATIVE_API_LEVEL=$OPTARG; + ;; r) - SOURCE_DIR="$(cd "$OPTARG" && pwd)"; + SOURCE_DIR="$OPTARG"; ;; t) ANDROID_TOOLCHAIN="$OPTARG"; ;; - l) - ANDROID_NATIVE_API_LEVEL=$OPTARG; + i) + LUAINCDIR="$OPTARG"; + ;; + b) + LUALIBDIR="$OPTARG"; + ;; + f) + LUALIBNAME=($OPTARG); ;; -) break; @@ -65,6 +80,14 @@ if [ ! -e "$SOURCE_DIR/CMakeLists.txt" ]; then exit -2; fi SOURCE_DIR="$(cd "$SOURCE_DIR" && pwd)"; +if [ -z "$NDK_ROOT" ]; then + echo "ndk root must be assigned."; + exit 0; +fi + +NDK_ROOT="$(cd "$NDK_ROOT" && pwd)"; +LUAINCDIR="$(cd "$LUAINCDIR" && pwd)"; +LUALIBDIR="$(cd "$LUALIBDIR" && pwd)"; for ARCH in ${ARCHS}; do echo "================== Compling $ARCH =================="; @@ -80,7 +103,49 @@ for ARCH in ${ARCHS}; do mkdir -p "$WORKING_DIR/prebuilt/$ARCH"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES $@; + ARCH_LUAINCDIR=""; + ARCH_LUALIBPATH=""; + ARCH_LUAVER="5.1"; + if [ ! -z "$LUAINCDIR" ] && [ ! -z "$LUALIBDIR" ]; then + if [ -e "$LUAINCDIR/$ARCH/lua.h" ]; then + ARCH_LUAINCDIR="$LUAINCDIR/$ARCH"; + elif [ -e "$LUAINCDIR/lua.h" ]; then + ARCH_LUAINCDIR="$LUAINCDIR"; + else + echo -e "\033[34m Lua header not found in $LUAINCDIR or $LUAINCDIR/$ARCH, we will skip build lua binding for $ARCH \033[0m"; + fi + + for SEARCH_PATTERN in ${LUALIBNAME[@]}; do + ARCH_LUALIBPATH=($(find "$LUALIBDIR/$ARCH" -name "$SEARCH_PATTERN")); + if [ ${#ARCH_LUALIBPATH} -gt 0 ]; then + ARCH_LUALIBPATH="${ARCH_LUALIBPATH[0]}"; + break + else + ARCH_LUALIBPATH=""; + fi + done + + if [ -z "$ARCH_LUALIBPATH" ]; then + echo -e "\033[34m Lua library not found in $LUALIBDIR/$ARCH with pattern=${LUALIBNAME[@]}, we will skip build lua binding for $ARCH \033[0m"; + fi + fi + + if [ ! -z "$ARCH_LUAINCDIR" ]; then + ARCH_LUAVER=$(grep LUA_VERSION_NUM $ARCH_LUAINCDIR/lua.h | awk '{print $3}'); + if [ $ARCH_LUAVER -ge 503 ]; then + ARCH_LUAVER="5.3"; + else + ARCH_LUAVER="5.1"; + fi + fi + + if [ ! -z "$ARCH_LUAINCDIR" ] && [ ! -z "$ARCH_LUALIBPATH" ]; then + echo -e "\033[32m Build pbc and protobuf binding($ARCH_LUAINCDIR, $ARCH_LUALIBPATH, version=$ARCH_LUAVER) \033[0m"; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES -DLUA_INCLUDE_DIR="$ARCH_LUAINCDIR" -DLUA_VERSION_STRING=$ARCH_LUAVER -DLUA_LIBRARIES="$ARCH_LUALIBPATH" $@; + else + echo -e "\033[32m Build pbc \033[0m"; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES $@; + fi make -j4; make install; done diff --git a/build_ios.sh b/build_ios.sh index 17d9519..051ef67 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -34,7 +34,7 @@ while getopts "a:d:hr:s:-" OPTION; do exit 0; ;; r) - SOURCE_DIR="$(cd "$OPTARG" && pwd)"; + SOURCE_DIR="$OPTARG"; ;; s) SDKVERSION="$SDKVERSION"; @@ -52,6 +52,12 @@ done shift $(($OPTIND-1)); +if [ ! -e "$SOURCE_DIR/CMakeLists.txt" ]; then + echo "$SOURCE_DIR/CMakeLists.txt not found"; + exit -2; +fi +SOURCE_DIR="$(cd "$SOURCE_DIR" && pwd)"; + echo "Ready to build for ios"; echo "WORKING_DIR=${WORKING_DIR}"; echo "ARCHS=${ARCHS}"; From 37b303b6d84f28b5a7b00c84b45331b13c806dce Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 11 Apr 2017 16:58:37 +0800 Subject: [PATCH 06/13] README for build using cmake --- README.md | 55 +++++++++++++++++ binding/lua/build_ios.sh | 119 ------------------------------------ binding/lua53/build_ios.sh | 120 ------------------------------------- 3 files changed, 55 insertions(+), 239 deletions(-) delete mode 100644 binding/lua/build_ios.sh delete mode 100644 binding/lua53/build_ios.sh diff --git a/README.md b/README.md index 5ab319c..b7afd69 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,61 @@ cd bindings/lua && make See https://github.com/cloudwu/pbc/tree/master/binding/lua/README.md +## Build with cmake +### Build for native library +```bash +cd REPO +mkdir build +cd build +cmake .. +# You may also add -G "Visual Studio 15 2017 Win64" for Visual Studio 2017 and win64 or -G "MSYS Makefils" for MinGW +# Or add -DCMAKE_INSTALL_PREFIX= to specify where to install when run make install + +# Then build +make -j4 # Using gcc/clang and make +MSBuild pbc.sln /verbosity:minimal /target:ALL_BUILD /p:Configuration=RelWithDebInfo /p:Platform=x64 # Using Visual Studio, usually in C:\Program Files (x86)\MSBuild\15.0 or C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\ + +# At last, install it +make install # Using gcc/clang and make +MSBuild pbc.sln /verbosity:minimal /target:INSTALL /p:Configuration=RelWithDebInfo /p:Platform=x64 # Using Visual Studio +``` + +### Build lua-binding +Just add lua include directory and library directory to cmake standard search directory. If we can find available lua, we will build lua binding for the right version. + +### Cross-Compile for iOS +Just run build_ios.sh in macOS + +**CMAKE_INSTALL_PREFIX** can not be set here + +```bash +./build_ios.sh + +# add LUA_INCLUDE_DIR and LUA_VERSION_STRING for build lua binding +./build_ios.sh -- -DLUA_INCLUDE_DIR= -DLUA_VERSION_STRING=<5.1 or 5.3> +``` + +All prebuilt static library files and lua file will be generated at $PWD/prebuilt + +### Cross-Compile for Android +Just run build_android.sh in Unix like system. We do not support MSYS or MinGW shell now. + +**CMAKE_INSTALL_PREFIX** can not be set here + +You must at least specify NDK_ROOT +```bash +./build_android.sh -n + +# add -i and -b options to build lua binding +./build_android.sh -n -i -b + +# for example, if we install NDK in /home/prebuilt/android/ndk/android-ndk-r13b, and lua.h in /home/prebuilt/lua/luajit/include/luajit-2.0/ and armeabi-v7a/libluajit-5.1.[a|so] x86/libluajit-5.1.[a|so] x86_64/libluajit-5.1.[a|so] arm64-v8a/libluajit-5.1.[a|so] .. in /home/prebuilt/lua/luajit/include/lib, we can use the command below +./build_android.sh -n /home/prebuilt/android/ndk/android-ndk-r13b -i /home/prebuilt/lua/luajit/include/luajit-2.0 -b /home/prebuilt/lua/luajit/include/lib +``` + +All prebuilt library files and lua file will be generated at $PWD/prebuilt. And library in difference architecture will be placed in $PWD/prebuilt/ARCHITECTURE + + ## Question ? * Send me email : http://www.codingnow.com/2000/gmail.gif diff --git a/binding/lua/build_ios.sh b/binding/lua/build_ios.sh deleted file mode 100644 index 706f9e8..0000000 --- a/binding/lua/build_ios.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/bash - -# Automatic build script for pbc-lua -########################################################################### -# Change values here -# -SDKVERSION=$(xcrun -sdk iphoneos --show-sdk-version); -# -########################################################################### -# -# Don't change anything here -WORKING_DIR="$(cd $(dirname $0))"; -cd "$WORKING_DIR"; - -ARCHS="i386 x86_64 armv7 armv7s arm64"; -DEVELOPER_ROOT=$(xcode-select -print-path); -ENABLE_PBC=0; - -# ======================= options ======================= -while getopts "a:d:hps:-" OPTION; do - case $OPTION in - a) - ARCHS="$OPTARG"; - ;; - d) - DEVELOPER_ROOT="$OPTARG"; - ;; - h) - echo "usage: $0 [options] [-- [LUADIR=Lua include directory] [other make options]]"; - echo "options:"; - echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; - echo "-d [developer root directory] developer root directory, we use xcode-select -print-path to find default value.(default: $DEVELOPER_ROOT)"; - echo "-p integration pbc into this lib."; - echo "-s [sdk version] sdk version, we use xcrun -sdk iphoneos --show-sdk-version to find default value.(default: $SDKVERSION)"; - echo "-h help message."; - exit 0; - ;; - p) - ENABLE_PBC=1; - ;; - s) - SDKVERSION="$SDKVERSION"; - ;; - -) - break; - ;; - ?) #当有不认识的选项的时候arg为? - echo "unkonw argument detected"; - exit 1; - ;; - esac -done - -shift $(($OPTIND-1)); - -echo "Ready to build for ios"; -echo "WORKING_DIR=${WORKING_DIR}"; -echo "ARCHS=${ARCHS}"; -echo "DEVELOPER_ROOT=${DEVELOPER_ROOT}"; -echo "SDKVERSION=${SDKVERSION}"; -echo "Integration pbc=${ENABLE_PBC}"; -echo "make options=$@"; - -########## -cp -f Makefile Makefile.bak; -perl -p -i -e "s;\\-shared;\\-c;g" Makefile; -perl -p -i -e "s;\\s\\-[lL][^\\s]*; ;g" Makefile; - -for ARCH in ${ARCHS}; do - echo "================== Compling $ARCH =================="; - if [[ "${ARCH}" == "i386" || "${ARCH}" == "x86_64" ]]; then - PLATFORM="iPhoneSimulator"; - else - PLATFORM="iPhoneOS"; - fi - - echo "Building pbc-lua for ${PLATFORM} ${SDKVERSION} ${ARCH}" ; - - echo "Please stand by..." - - export DEVROOT="${DEVELOPER_ROOT}/Platforms/${PLATFORM}.platform/Developer"; - export SDKROOT="${DEVROOT}/SDKs/${PLATFORM}${SDKVERSION}.sdk"; - export BUILD_TOOLS="${DEVELOPER_ROOT}"; - #export CC="${BUILD_TOOLS}/usr/bin/gcc -arch ${ARCH}"; - export CC=${BUILD_TOOLS}/usr/bin/gcc; - #export LD=${BUILD_TOOLS}/usr/bin/ld; - #export CPP=${BUILD_TOOLS}/usr/bin/cpp; - #export CXX=${BUILD_TOOLS}/usr/bin/g++; - export AR=${DEVELOPER_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar; - #export AS=${DEVROOT}/usr/bin/as; - #export NM=${DEVROOT}/usr/bin/nm; - #export CXXCPP=${BUILD_TOOLS}/usr/bin/cpp; - #export RANLIB=${BUILD_TOOLS}/usr/bin/ranlib; - export LDFLAGS="-arch ${ARCH} -isysroot ${SDKROOT} "; - export CFLAGS="-arch ${ARCH} -isysroot ${SDKROOT} -O2 -fPIC -Wall"; - - make clean TARGET=libprotobuf.a; - make clean TARGET=libprotobuf-$ARCH.a; - make libprotobuf.a CC="$CC" CFLAGS="$CFLAGS" TARGET=libprotobuf.a $@; - mv -f libprotobuf.a "libprotobuf-$ARCH.a"; - - if [ 0 -ne $ENABLE_PBC ]; then - ${AR} rc "libpbc-protobuf-$ARCH.a" "libprotobuf-$ARCH.a" ../../build/libpbc-${ARCH}.a ; - fi -done -mv -f Makefile.bak Makefile; - -cd "$WORKING_DIR"; -echo "Linking and packaging library..."; - -LIPO_LIBS="libprotobuf"; -if [ 0 -ne $ENABLE_PBC ]; then - LIPO_LIBS="$LIPO_LIBS libpbc-protobuf"; -fi - -for LIB_NAME in $LIPO_LIBS; do - lipo -create $LIB_NAME-*.a -output "$LIB_NAME.a"; - echo "$LIB_NAME.a built."; -done diff --git a/binding/lua53/build_ios.sh b/binding/lua53/build_ios.sh deleted file mode 100644 index 78e3447..0000000 --- a/binding/lua53/build_ios.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/bash - -# Automatic build script for pbc-lua -# for iPhoneOS and iPhoneSimulator -########################################################################### -# Change values here -# -SDKVERSION=$(xcrun -sdk iphoneos --show-sdk-version); -# -########################################################################### -# -# Don't change anything here -WORKING_DIR="$(cd $(dirname $0))"; -cd "$WORKING_DIR"; - -ARCHS="i386 x86_64 armv7 armv7s arm64"; -DEVELOPER_ROOT=$(xcode-select -print-path); -ENABLE_PBC=0; - -# ======================= options ======================= -while getopts "a:d:hps:-" OPTION; do - case $OPTION in - a) - ARCHS="$OPTARG"; - ;; - d) - DEVELOPER_ROOT="$OPTARG"; - ;; - h) - echo "usage: $0 [options] [-- [LUADIR=Lua include directory] [other make options]]"; - echo "options:"; - echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; - echo "-d [developer root directory] developer root directory, we use xcode-select -print-path to find default value.(default: $DEVELOPER_ROOT)"; - echo "-p integration pbc into this lib."; - echo "-s [sdk version] sdk version, we use xcrun -sdk iphoneos --show-sdk-version to find default value.(default: $SDKVERSION)"; - echo "-h help message."; - exit 0; - ;; - p) - ENABLE_PBC=1; - ;; - s) - SDKVERSION="$SDKVERSION"; - ;; - -) - break; - ;; - ?) #当有不认识的选项的时候arg为? - echo "unkonw argument detected"; - exit 1; - ;; - esac -done - -shift $(($OPTIND-1)); - -echo "Ready to build for ios"; -echo "WORKING_DIR=${WORKING_DIR}"; -echo "ARCHS=${ARCHS}"; -echo "DEVELOPER_ROOT=${DEVELOPER_ROOT}"; -echo "SDKVERSION=${SDKVERSION}"; -echo "Integration pbc=${ENABLE_PBC}"; -echo "make options=$@"; - -########## -cp -f Makefile Makefile.bak; -perl -p -i -e "s;\\-shared;\\-c;g" Makefile; -perl -p -i -e "s;\\s\\-[lL][^\\s]*; ;g" Makefile; - -for ARCH in ${ARCHS}; do - echo "================== Compling $ARCH =================="; - if [[ "${ARCH}" == "i386" || "${ARCH}" == "x86_64" ]]; then - PLATFORM="iPhoneSimulator" ; - else - PLATFORM="iPhoneOS" ; - fi - - echo "Building pbc-lua for ${PLATFORM} ${SDKVERSION} ${ARCH}" ; - - echo "Please stand by..." ; - - export DEVROOT="${DEVELOPER_ROOT}/Platforms/${PLATFORM}.platform/Developer" ; - export SDKROOT="${DEVROOT}/SDKs/${PLATFORM}${SDKVERSION}.sdk" ; - export BUILD_TOOLS="${DEVELOPER_ROOT}" ; - #export CC="${BUILD_TOOLS}/usr/bin/gcc -arch ${ARCH}" ; - export CC=${BUILD_TOOLS}/usr/bin/gcc ; - #export LD=${BUILD_TOOLS}/usr/bin/ld ; - #export CPP=${BUILD_TOOLS}/usr/bin/cpp ; - #export CXX=${BUILD_TOOLS}/usr/bin/g++ ; - export AR=${DEVELOPER_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar; - #export AS=${DEVROOT}/usr/bin/as ; - #export NM=${DEVROOT}/usr/bin/nm ; - #export CXXCPP=${BUILD_TOOLS}/usr/bin/cpp ; - #export RANLIB=${BUILD_TOOLS}/usr/bin/ranlib ; - export LDFLAGS="-arch ${ARCH} -isysroot ${SDKROOT} " ; - export CFLAGS="-arch ${ARCH} -isysroot ${SDKROOT} -O2 -fPIC -Wall" ; - - make clean TARGET=libprotobuf.a; - make clean TARGET=libprotobuf-$ARCH.a; - make libprotobuf.a CC="$CC" CFLAGS="$CFLAGS" TARGET=libprotobuf.a $@; - mv -f libprotobuf.a "libprotobuf-$ARCH.a"; - - if [ 0 -ne $ENABLE_PBC ]; then - ${AR} rc "libpbc-protobuf-$ARCH.a" "libprotobuf-$ARCH.a" ../../build/libpbc-${ARCH}.a ; - fi -done -mv -f Makefile.bak Makefile; - -cd "$WORKING_DIR"; -echo "Linking and packaging library..."; - -LIPO_LIBS="libprotobuf"; -if [ 0 -ne $ENABLE_PBC ]; then - LIPO_LIBS="$LIPO_LIBS libpbc-protobuf"; -fi - -for LIB_NAME in $LIPO_LIBS; do - lipo -create $LIB_NAME-*.a -output "$LIB_NAME.a"; - echo "$LIB_NAME.a built."; -done From b3e7b50c7918f2a16627656363d22580c6f9001b Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 11 Apr 2017 17:03:10 +0800 Subject: [PATCH 07/13] optimize example build script --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b7afd69..dead9a0 100644 --- a/README.md +++ b/README.md @@ -105,10 +105,10 @@ Just run build_ios.sh in macOS **CMAKE_INSTALL_PREFIX** can not be set here ```bash -./build_ios.sh +mkdir -p build && cd build && ./build_ios.sh -r .. # add LUA_INCLUDE_DIR and LUA_VERSION_STRING for build lua binding -./build_ios.sh -- -DLUA_INCLUDE_DIR= -DLUA_VERSION_STRING=<5.1 or 5.3> +mkdir -p build && cd build && ./build_ios.sh -r .. -- -DLUA_INCLUDE_DIR= -DLUA_VERSION_STRING=<5.1 or 5.3> ``` All prebuilt static library files and lua file will be generated at $PWD/prebuilt @@ -120,13 +120,13 @@ Just run build_android.sh in Unix like system. We do not support MSYS or MinGW s You must at least specify NDK_ROOT ```bash -./build_android.sh -n +mkdir -p build && cd build && ./build_android.sh -r .. -n # add -i and -b options to build lua binding -./build_android.sh -n -i -b +mkdir -p build && cd build && ./build_android.sh -r .. -n -i -b # for example, if we install NDK in /home/prebuilt/android/ndk/android-ndk-r13b, and lua.h in /home/prebuilt/lua/luajit/include/luajit-2.0/ and armeabi-v7a/libluajit-5.1.[a|so] x86/libluajit-5.1.[a|so] x86_64/libluajit-5.1.[a|so] arm64-v8a/libluajit-5.1.[a|so] .. in /home/prebuilt/lua/luajit/include/lib, we can use the command below -./build_android.sh -n /home/prebuilt/android/ndk/android-ndk-r13b -i /home/prebuilt/lua/luajit/include/luajit-2.0 -b /home/prebuilt/lua/luajit/include/lib +mkdir -p build && cd build && ./build_android.sh -r .. -n /home/prebuilt/android/ndk/android-ndk-r13b -i /home/prebuilt/lua/luajit/include/luajit-2.0 -b /home/prebuilt/lua/luajit/include/lib ``` All prebuilt library files and lua file will be generated at $PWD/prebuilt. And library in difference architecture will be placed in $PWD/prebuilt/ARCHITECTURE From 5f501687e538b7b477f70da5db3dd01ac482828c Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 11 May 2017 15:17:53 +0800 Subject: [PATCH 08/13] using cmake --build to build libraries for Android and iOS fix extend options for cmake --- build_android.sh | 7 +++---- build_ios.sh | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build_android.sh b/build_android.sh index c088c2e..ce66741 100644 --- a/build_android.sh +++ b/build_android.sh @@ -141,13 +141,12 @@ for ARCH in ${ARCHS}; do if [ ! -z "$ARCH_LUAINCDIR" ] && [ ! -z "$ARCH_LUALIBPATH" ]; then echo -e "\033[32m Build pbc and protobuf binding($ARCH_LUAINCDIR, $ARCH_LUALIBPATH, version=$ARCH_LUAVER) \033[0m"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES -DLUA_INCLUDE_DIR="$ARCH_LUAINCDIR" -DLUA_VERSION_STRING=$ARCH_LUAVER -DLUA_LIBRARIES="$ARCH_LUALIBPATH" $@; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES -DLUA_INCLUDE_DIR="$ARCH_LUAINCDIR" -DLUA_VERSION_STRING=$ARCH_LUAVER -DLUA_LIBRARIES="$ARCH_LUALIBPATH" "$@"; else echo -e "\033[32m Build pbc \033[0m"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES $@; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES "$@"; fi - make -j4; - make install; + cmake --build . --target install done echo "Building done."; diff --git a/build_ios.sh b/build_ios.sh index 051ef67..ac563cb 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -93,7 +93,8 @@ for ARCH in ${ARCHS}; do cd "$WORKING_DIR/build-$ARCH"; cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/build-$ARCH" -DCMAKE_OSX_SYSROOT=$SDKROOT -DCMAKE_SYSROOT=$SDKROOT -DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_C_FLAGS="-fPIC" "$@"; - make lib -j4 install; + cmake --build . --target lib + cmake --build . --target install done cd "$WORKING_DIR"; From 51ce22b6a3f1295262aee2524c7908fafc25e2b9 Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 11 May 2017 17:51:37 +0800 Subject: [PATCH 09/13] fix build problem for android when using cmake 3.8 --- build_android.sh | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/build_android.sh b/build_android.sh index ce66741..dae6e67 100644 --- a/build_android.sh +++ b/build_android.sh @@ -112,7 +112,8 @@ for ARCH in ${ARCHS}; do elif [ -e "$LUAINCDIR/lua.h" ]; then ARCH_LUAINCDIR="$LUAINCDIR"; else - echo -e "\033[34m Lua header not found in $LUAINCDIR or $LUAINCDIR/$ARCH, we will skip build lua binding for $ARCH \033[0m"; + echo -e "\033[34mLua header not found in $LUAINCDIR or $LUAINCDIR/$ARCH, we will skip build lua binding for $ARCH \033[0m"; + ARCH_LUAINCDIR=""; fi for SEARCH_PATTERN in ${LUALIBNAME[@]}; do @@ -126,11 +127,12 @@ for ARCH in ${ARCHS}; do done if [ -z "$ARCH_LUALIBPATH" ]; then - echo -e "\033[34m Lua library not found in $LUALIBDIR/$ARCH with pattern=${LUALIBNAME[@]}, we will skip build lua binding for $ARCH \033[0m"; + echo -e "\033[34mLua library not found in $LUALIBDIR/$ARCH with pattern=${LUALIBNAME[@]}, we will skip build lua binding for $ARCH \033[0m"; + ARCH_LUALIBPATH="" fi fi - if [ ! -z "$ARCH_LUAINCDIR" ]; then + if [ ! -z "$ARCH_LUAINCDIR" ] && [ ! -z "$ARCH_LUALIBPATH" ]; then ARCH_LUAVER=$(grep LUA_VERSION_NUM $ARCH_LUAINCDIR/lua.h | awk '{print $3}'); if [ $ARCH_LUAVER -ge 503 ]; then ARCH_LUAVER="5.3"; @@ -139,12 +141,35 @@ for ARCH in ${ARCHS}; do fi fi + # 64 bits must at least using android-21 + # @see $NDK_ROOT/build/cmake/android.toolchain.cmake + echo $ARCH | grep -E '64(-v8a)?$' ; + if [ $? -eq 0 ] && [ $ANDROID_NATIVE_API_LEVEL -lt 21 ]; then + ANDROID_NATIVE_API_LEVEL=21 ; + fi + if [ ! -z "$ARCH_LUAINCDIR" ] && [ ! -z "$ARCH_LUALIBPATH" ]; then echo -e "\033[32m Build pbc and protobuf binding($ARCH_LUAINCDIR, $ARCH_LUALIBPATH, version=$ARCH_LUAVER) \033[0m"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES -DLUA_INCLUDE_DIR="$ARCH_LUAINCDIR" -DLUA_VERSION_STRING=$ARCH_LUAVER -DLUA_LIBRARIES="$ARCH_LUALIBPATH" "$@"; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" \ + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" \ + -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \ + -DANDROID_NDK="$NDK_ROOT" -DCMAKE_ANDROID_NDK="$NDK_ROOT" \ + -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DCMAKE_ANDROID_API=$ANDROID_NATIVE_API_LEVEL \ + -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$ANDROID_TOOLCHAIN \ + -DANDROID_ABI=$ARCH -DCMAKE_ANDROID_ARCH_ABI=$ARCH \ + -DANDROID_STL=$ANDROID_STL -DCMAKE_ANDROID_STL_TYPE=$ANDROID_STL \ + -DANDROID_PIE=YES -DLUA_INCLUDE_DIR="$ARCH_LUAINCDIR" -DLUA_VERSION_STRING=$ARCH_LUAVER -DLUA_LIBRARIES="$ARCH_LUALIBPATH" "$@"; else echo -e "\033[32m Build pbc \033[0m"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" -DANDROID_NDK="$NDK_ROOT" -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DANDROID_ABI=$ARCH -DANDROID_STL=$ANDROID_STL -DANDROID_PIE=YES "$@"; + cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" \ + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" \ + -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \ + -DANDROID_NDK="$NDK_ROOT" -DCMAKE_ANDROID_NDK="$NDK_ROOT" \ + -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DCMAKE_ANDROID_API=$ANDROID_NATIVE_API_LEVEL \ + -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$ANDROID_TOOLCHAIN \ + -DANDROID_ABI=$ARCH -DCMAKE_ANDROID_ARCH_ABI=$ARCH \ + -DANDROID_STL=$ANDROID_STL -DCMAKE_ANDROID_STL_TYPE=$ANDROID_STL \ + -DANDROID_PIE=YES "$@"; fi cmake --build . --target install done From 4ac238e13a4efa8dbd8a29b28d9a792d0de55933 Mon Sep 17 00:00:00 2001 From: owent Date: Fri, 19 May 2017 11:33:30 +0800 Subject: [PATCH 10/13] 1. fix toolchain detect script for build android library 2. allow to set build type for android & ios --- README.md | 6 +++--- build_android.sh | 23 +++++++++++++++-------- build_ios.sh | 6 ++++-- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index dead9a0..0ac53a9 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,11 @@ You must at least specify NDK_ROOT ```bash mkdir -p build && cd build && ./build_android.sh -r .. -n -# add -i and -b options to build lua binding -mkdir -p build && cd build && ./build_android.sh -r .. -n -i -b +# add -i and -u options to build lua binding +mkdir -p build && cd build && ./build_android.sh -r .. -n -i -u # for example, if we install NDK in /home/prebuilt/android/ndk/android-ndk-r13b, and lua.h in /home/prebuilt/lua/luajit/include/luajit-2.0/ and armeabi-v7a/libluajit-5.1.[a|so] x86/libluajit-5.1.[a|so] x86_64/libluajit-5.1.[a|so] arm64-v8a/libluajit-5.1.[a|so] .. in /home/prebuilt/lua/luajit/include/lib, we can use the command below -mkdir -p build && cd build && ./build_android.sh -r .. -n /home/prebuilt/android/ndk/android-ndk-r13b -i /home/prebuilt/lua/luajit/include/luajit-2.0 -b /home/prebuilt/lua/luajit/include/lib +mkdir -p build && cd build && ./build_android.sh -r .. -n /home/prebuilt/android/ndk/android-ndk-r13b -i /home/prebuilt/lua/luajit/include/luajit-2.0 -u /home/prebuilt/lua/luajit/include/lib ``` All prebuilt library files and lua file will be generated at $PWD/prebuilt. And library in difference architecture will be placed in $PWD/prebuilt/ARCHITECTURE diff --git a/build_android.sh b/build_android.sh index dae6e67..eb506ac 100644 --- a/build_android.sh +++ b/build_android.sh @@ -15,9 +15,10 @@ ANDROID_STL= ; # LUAINCDIR= ; LUALIBDIR= ; LUALIBNAME=("libluajit-*.so" "liblua.a" "liblua.so" "liblua.so.*" "libtolua.so" "libtolua.so.*"); +BUILD_TYPE="RelWithDebInfo" ; # ======================= options ======================= -while getopts "a:c:n:hl:r:t:i:b:f:-" OPTION; do +while getopts "a:b:c:f:hi:l:n:r:t:u:-" OPTION; do case $OPTION in a) ARCHS="$OPTARG"; @@ -32,14 +33,15 @@ while getopts "a:c:n:hl:r:t:i:b:f:-" OPTION; do echo "usage: $0 [options] -n NDK_ROOT -r SOURCE_DIR [-- [cmake options]]"; echo "options:"; echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; + echo "-b [build type] build type(default: $BUILD_TYPE, available: Debug, Release, RelWithDebInfo, MinSizeRel)"; echo "-c [android stl] stl used by ndk(default: $ANDROID_STL, available: system, stlport_static, stlport_shared, gnustl_static, gnustl_shared, c++_static, c++_shared, none)"; echo "-n [ndk root directory] ndk root directory.(default: $DEVELOPER_ROOT)"; echo "-l [api level] API level, see $NDK_ROOT/platforms for detail.(default: $ANDROID_NATIVE_API_LEVEL)"; echo "-r [source dir] root directory of this library"; - echo "-t [toolchain] ANDROID_TOOLCHAIN.(gcc/clang, default: $ANDROID_TOOLCHAIN)"; + echo "-t [toolchain] ANDROID_TOOLCHAIN.(gcc version/clang, default: $ANDROID_TOOLCHAIN, @see CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION in cmake)"; echo "-i [lua include dir] Lua include dir, which should has [$ARCHS/]include directory in it."; - echo "-b [lua library dir] Lua library dir, which should has [$ARCHS] which we can find a lua lib in it."; echo "-f [lua library file pattern] Lua library search pattern for lua library file, which will be linked into protobuf.so."; + echo "-u [lua library dir] Lua library dir, which should has [$ARCHS] which we can find a lua lib in it."; echo "-h help message."; exit 0; ;; @@ -55,7 +57,7 @@ while getopts "a:c:n:hl:r:t:i:b:f:-" OPTION; do i) LUAINCDIR="$OPTARG"; ;; - b) + u) LUALIBDIR="$OPTARG"; ;; f) @@ -89,6 +91,11 @@ NDK_ROOT="$(cd "$NDK_ROOT" && pwd)"; LUAINCDIR="$(cd "$LUAINCDIR" && pwd)"; LUALIBDIR="$(cd "$LUALIBDIR" && pwd)"; +CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$ANDROID_TOOLCHAIN; +if [ "${ANDROID_TOOLCHAIN:0:5}" != "clang" ]; then + ANDROID_TOOLCHAIN="gcc"; +fi + for ARCH in ${ARCHS}; do echo "================== Compling $ARCH =================="; echo "Building pbc for android-$ANDROID_NATIVE_API_LEVEL ${ARCH}" @@ -150,23 +157,23 @@ for ARCH in ${ARCHS}; do if [ ! -z "$ARCH_LUAINCDIR" ] && [ ! -z "$ARCH_LUALIBPATH" ]; then echo -e "\033[32m Build pbc and protobuf binding($ARCH_LUAINCDIR, $ARCH_LUALIBPATH, version=$ARCH_LUAVER) \033[0m"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" \ + cmake "$SOURCE_DIR" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" \ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" \ -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \ -DANDROID_NDK="$NDK_ROOT" -DCMAKE_ANDROID_NDK="$NDK_ROOT" \ -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DCMAKE_ANDROID_API=$ANDROID_NATIVE_API_LEVEL \ - -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$ANDROID_TOOLCHAIN \ + -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION \ -DANDROID_ABI=$ARCH -DCMAKE_ANDROID_ARCH_ABI=$ARCH \ -DANDROID_STL=$ANDROID_STL -DCMAKE_ANDROID_STL_TYPE=$ANDROID_STL \ -DANDROID_PIE=YES -DLUA_INCLUDE_DIR="$ARCH_LUAINCDIR" -DLUA_VERSION_STRING=$ARCH_LUAVER -DLUA_LIBRARIES="$ARCH_LUALIBPATH" "$@"; else echo -e "\033[32m Build pbc \033[0m"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" \ + cmake "$SOURCE_DIR" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/prebuilt/$ARCH" \ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$WORKING_DIR/lib/$ARCH" \ -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \ -DANDROID_NDK="$NDK_ROOT" -DCMAKE_ANDROID_NDK="$NDK_ROOT" \ -DANDROID_NATIVE_API_LEVEL=$ANDROID_NATIVE_API_LEVEL -DCMAKE_ANDROID_API=$ANDROID_NATIVE_API_LEVEL \ - -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$ANDROID_TOOLCHAIN \ + -DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=$CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION \ -DANDROID_ABI=$ARCH -DCMAKE_ANDROID_ARCH_ABI=$ARCH \ -DANDROID_STL=$ANDROID_STL -DCMAKE_ANDROID_STL_TYPE=$ANDROID_STL \ -DANDROID_PIE=YES "$@"; diff --git a/build_ios.sh b/build_ios.sh index ac563cb..0ded1c2 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -13,9 +13,10 @@ WORKING_DIR="$PWD"; ARCHS="i386 x86_64 armv7 armv7s arm64"; DEVELOPER_ROOT=$(xcode-select -print-path); SOURCE_DIR="$PWD"; +BUILD_TYPE="RelWithDebInfo" ; # ======================= options ======================= -while getopts "a:d:hr:s:-" OPTION; do +while getopts "a:b:d:hr:s:-" OPTION; do case $OPTION in a) ARCHS="$OPTARG"; @@ -27,6 +28,7 @@ while getopts "a:d:hr:s:-" OPTION; do echo "usage: $0 [options] [-- [make options]]"; echo "options:"; echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; + echo "-b [build type] build type(default: $BUILD_TYPE, available: Debug, Release, RelWithDebInfo, MinSizeRel)"; echo "-d [developer root directory] developer root directory, we use xcode-select -print-path to find default value.(default: $DEVELOPER_ROOT)"; echo "-s [sdk version] sdk version, we use xcrun -sdk iphoneos --show-sdk-version to find default value.(default: $SDKVERSION)"; echo "-r [source dir] root directory of this library"; @@ -92,7 +94,7 @@ for ARCH in ${ARCHS}; do mkdir -p "$WORKING_DIR/build-$ARCH"; cd "$WORKING_DIR/build-$ARCH"; - cmake "$SOURCE_DIR" -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/build-$ARCH" -DCMAKE_OSX_SYSROOT=$SDKROOT -DCMAKE_SYSROOT=$SDKROOT -DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_C_FLAGS="-fPIC" "$@"; + cmake "$SOURCE_DIR" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/build-$ARCH" -DCMAKE_OSX_SYSROOT=$SDKROOT -DCMAKE_SYSROOT=$SDKROOT -DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_C_FLAGS="-fPIC" "$@"; cmake --build . --target lib cmake --build . --target install done From c27f79db91571dfa75346f722a31e814b6160e90 Mon Sep 17 00:00:00 2001 From: owent Date: Fri, 19 May 2017 12:36:29 +0800 Subject: [PATCH 11/13] fix missing -b option --- build_android.sh | 3 +++ build_ios.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/build_android.sh b/build_android.sh index eb506ac..39f3410 100644 --- a/build_android.sh +++ b/build_android.sh @@ -23,6 +23,9 @@ while getopts "a:b:c:f:hi:l:n:r:t:u:-" OPTION; do a) ARCHS="$OPTARG"; ;; + b) + BUILD_TYPE="$OPTARG"; + ;; c) ANDROID_STL="$OPTARG"; ;; diff --git a/build_ios.sh b/build_ios.sh index 0ded1c2..48c1be3 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -21,6 +21,9 @@ while getopts "a:b:d:hr:s:-" OPTION; do a) ARCHS="$OPTARG"; ;; + b) + BUILD_TYPE="$OPTARG"; + ;; d) DEVELOPER_ROOT="$OPTARG"; ;; From 331b7dd511b84ebed46d5015cd39d1fefae52033 Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 6 Jun 2017 18:33:02 +0800 Subject: [PATCH 12/13] add support for bitcode --- build_ios.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/build_ios.sh b/build_ios.sh index 48c1be3..2dd8f71 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -14,6 +14,7 @@ ARCHS="i386 x86_64 armv7 armv7s arm64"; DEVELOPER_ROOT=$(xcode-select -print-path); SOURCE_DIR="$PWD"; BUILD_TYPE="RelWithDebInfo" ; +OTHER_CFLAGS="-fPIC" ; # ======================= options ======================= while getopts "a:b:d:hr:s:-" OPTION; do @@ -33,11 +34,19 @@ while getopts "a:b:d:hr:s:-" OPTION; do echo "-a [archs] which arch need to built, multiple values must be split by space(default: $ARCHS)"; echo "-b [build type] build type(default: $BUILD_TYPE, available: Debug, Release, RelWithDebInfo, MinSizeRel)"; echo "-d [developer root directory] developer root directory, we use xcode-select -print-path to find default value.(default: $DEVELOPER_ROOT)"; + echo "-h help message."; + echo "-i [option] enable bitcode support(available: off, all, bitcode, marker)"; echo "-s [sdk version] sdk version, we use xcrun -sdk iphoneos --show-sdk-version to find default value.(default: $SDKVERSION)"; echo "-r [source dir] root directory of this library"; - echo "-h help message."; exit 0; ;; + i) + if [ ! -z "$OPTARG" ]; then + OTHER_CFLAGS="$OTHER_CFLAGS -fembed-bitcode=$OPTARG"; + else + OTHER_CFLAGS="$OTHER_CFLAGS -fembed-bitcode"; + fi + ;; r) SOURCE_DIR="$OPTARG"; ;; @@ -97,7 +106,7 @@ for ARCH in ${ARCHS}; do mkdir -p "$WORKING_DIR/build-$ARCH"; cd "$WORKING_DIR/build-$ARCH"; - cmake "$SOURCE_DIR" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/build-$ARCH" -DCMAKE_OSX_SYSROOT=$SDKROOT -DCMAKE_SYSROOT=$SDKROOT -DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_C_FLAGS="-fPIC" "$@"; + cmake "$SOURCE_DIR" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX="$WORKING_DIR/build-$ARCH" -DCMAKE_OSX_SYSROOT=$SDKROOT -DCMAKE_SYSROOT=$SDKROOT -DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_C_FLAGS="$OTHER_CFLAGS" "$@"; cmake --build . --target lib cmake --build . --target install done From 2798858b50b9d95f189c04aaf7d80290bf3bd7fe Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 6 Jun 2017 18:36:35 +0800 Subject: [PATCH 13/13] fix flag --- build_ios.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_ios.sh b/build_ios.sh index 2dd8f71..facd88f 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -17,7 +17,7 @@ BUILD_TYPE="RelWithDebInfo" ; OTHER_CFLAGS="-fPIC" ; # ======================= options ======================= -while getopts "a:b:d:hr:s:-" OPTION; do +while getopts "a:b:d:hi:r:s:-" OPTION; do case $OPTION in a) ARCHS="$OPTARG";