diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ea8f5d6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,130 @@ +cmake_minimum_required(VERSION 3.1.0) +cmake_policy(SET CMP0054 NEW) + +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 (MSVC) + if(NOT CMAKE_MSVC_RUNTIME) + set(CMAKE_MSVC_RUNTIME "MD") + endif() + 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 +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() + +# 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 +## +######################################################################## + +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +## libpbc.a +set(LIBNAME "pbc") +add_subdirectory(src) + +add_custom_target(lib ALL DEPENDS ${LIBNAME}) + +## 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) +if (Protobuf_FOUND) + message(STATUS "Test: protobuf found at ${Protobuf_PROTOC_EXECUTABLE}, enable test sub-project now.") + add_subdirectory(test) +endif() + + +## Lua - binding +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}") + + ## 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/README.md b/README.md index 5ab319c..0ac53a9 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 +mkdir -p build && cd build && ./build_ios.sh -r .. + +# add LUA_INCLUDE_DIR and LUA_VERSION_STRING for build lua binding +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 + +### 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 +mkdir -p build && cd build && ./build_android.sh -r .. -n + +# 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 -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 + + ## Question ? * Send me email : http://www.codingnow.com/2000/gmail.gif diff --git a/binding/lua/CMakeLists.txt b/binding/lua/CMakeLists.txt new file mode 100644 index 0000000..d5173e9 --- /dev/null +++ b/binding/lua/CMakeLists.txt @@ -0,0 +1,27 @@ +include_directories(${LUA_INCLUDE_DIR}) + +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( + 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/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/CMakeLists.txt b/binding/lua53/CMakeLists.txt new file mode 100644 index 0000000..164f2c6 --- /dev/null +++ b/binding/lua53/CMakeLists.txt @@ -0,0 +1,27 @@ +include_directories(${LUA_INCLUDE_DIR}) + +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( + 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/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 diff --git a/build_android.sh b/build_android.sh new file mode 100644 index 0000000..39f3410 --- /dev/null +++ b/build_android.sh @@ -0,0 +1,187 @@ +#!/bin/bash + +# +########################################################################### +# +# Don't change anything here +WORKING_DIR="$PWD"; + +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= ; # +LUAINCDIR= ; +LUALIBDIR= ; +LUALIBNAME=("libluajit-*.so" "liblua.a" "liblua.so" "liblua.so.*" "libtolua.so" "libtolua.so.*"); +BUILD_TYPE="RelWithDebInfo" ; + +# ======================= options ======================= +while getopts "a:b:c:f:hi:l:n:r:t:u:-" OPTION; do + case $OPTION in + a) + ARCHS="$OPTARG"; + ;; + b) + BUILD_TYPE="$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 "-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 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 "-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; + ;; + l) + ANDROID_NATIVE_API_LEVEL=$OPTARG; + ;; + r) + SOURCE_DIR="$OPTARG"; + ;; + t) + ANDROID_TOOLCHAIN="$OPTARG"; + ;; + i) + LUAINCDIR="$OPTARG"; + ;; + u) + LUALIBDIR="$OPTARG"; + ;; + f) + LUALIBNAME=($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)"; +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)"; + +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}" + + # 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/prebuilt/$ARCH"; + + 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[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 + 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[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" ] && [ ! -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"; + else + ARCH_LUAVER="5.1"; + 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_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=$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_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=$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 "$@"; + fi + cmake --build . --target install +done + +echo "Building done."; diff --git a/build_ios.sh b/build_ios.sh index 4ad4e01..facd88f 100644 --- a/build_ios.sh +++ b/build_ios.sh @@ -9,18 +9,22 @@ 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"; +BUILD_TYPE="RelWithDebInfo" ; +OTHER_CFLAGS="-fPIC" ; # ======================= options ======================= -while getopts "a:d:hs:-" OPTION; do +while getopts "a:b:d:hi:r:s:-" OPTION; do case $OPTION in a) ARCHS="$OPTARG"; ;; + b) + BUILD_TYPE="$OPTARG"; + ;; d) DEVELOPER_ROOT="$OPTARG"; ;; @@ -28,11 +32,24 @@ while getopts "a:d:hs:-" 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 "-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"; 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"; + ;; s) SDKVERSION="$SDKVERSION"; ;; @@ -49,6 +66,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}"; @@ -75,27 +98,51 @@ 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_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 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 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..348abd4 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +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 "${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 "${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}) + + 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_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() +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 new file mode 100644 index 0000000..35e777b --- /dev/null +++ b/tool/CMakeLists.txt @@ -0,0 +1,6 @@ + +add_executable(dump + dump.c +) + +target_link_libraries(dump ${LIBNAME}) \ No newline at end of file