Skip to content
This repository was archived by the owner on Nov 28, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()
55 changes: 55 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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=<install dir> 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=<where has lua.h> -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 <ndk_root>

# add -i and -u options to build lua binding
mkdir -p build && cd build && ./build_android.sh -r .. -n <ndk_root> -i <where has lua.h or ARCHITECTURE/lua.h> -u <where ARCHITECTURE/[library pattern] in it>

# 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
Expand Down
27 changes: 27 additions & 0 deletions binding/lua/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
119 changes: 0 additions & 119 deletions binding/lua/build_ios.sh

This file was deleted.

27 changes: 27 additions & 0 deletions binding/lua53/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
Loading