Skip to content

Commit

Permalink
build_system: build dronecore_server (including grpc) for iOS and And…
Browse files Browse the repository at this point in the history
…roid

* Needed to fork gRPC for now (in http://github.com/dronecore/grpc)
* Added boringssl as a dependency to not rely on the system openssl libs
* Plugins need to be built as static libraries for iOS
  • Loading branch information
JonasVautherin committed Feb 10, 2018
1 parent f092683 commit 8430308
Show file tree
Hide file tree
Showing 20 changed files with 370 additions and 110 deletions.
20 changes: 11 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.1)

set(CMAKE_INSTALL_PREFIX "../install" CACHE PATH "default cache path")

list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_BINARY_DIR}/third_party)

set(CMAKE_CXX_STANDARD 11)

project(dronecore)
Expand Down Expand Up @@ -92,8 +94,8 @@ if(ANDROID)
set(CURL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/core/third_party/curl-android-ios/prebuilt-with-ssl/android/include)
set(CURL_LIBRARY ${CMAKE_SOURCE_DIR}/core/third_party/curl-android-ios/prebuilt-with-ssl/android/${ANDROID_ABI}/libcurl.a)
elseif(IOS)
set(CURL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/core/third_party/curl-android-ios/prebuilt-with-ssl/ios/include)
set(CURL_LIBRARY ${CMAKE_SOURCE_DIR}/core/third_party/curl-android-ios/prebuilt-with-ssl/ios/libcurl.a)
set(CURL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/core/third_party/curl-android-ios/prebuilt-with-ssl/iOS/include)
set(CURL_LIBRARY ${CMAKE_SOURCE_DIR}/core/third_party/curl-android-ios/prebuilt-with-ssl/iOS/libcurl.a)
elseif(MSVC)
# You need to call cmake with -DWIN_CURL_INCLUDE_DIR:STRING="C:\\curl-7.54.1\\include"
if(NOT WIN_CURL_INCLUDE_DIR)
Expand Down Expand Up @@ -131,14 +133,14 @@ if (DEFINED EXTERNAL_DIR AND NOT EXTERNAL_DIR STREQUAL "")
)
endif()

if(NOT IOS AND NOT ANDROID)
if (CMAKE_BUILD_DRONECORESERVER)
message(STATUS "Building dronecore server")
add_subdirectory(grpc/server)
else()
message(STATUS "BUILD_DRONECORESERVER not set: not building dronecore server")
endif()
if (CMAKE_BUILD_DRONECORESERVER)
message(STATUS "Building dronecore server")
add_subdirectory(grpc/server)
else()
message(STATUS "BUILD_DRONECORESERVER not set: not building dronecore server")
endif()

if(NOT IOS AND NOT ANDROID)
enable_testing()
add_subdirectory(${CMAKE_SOURCE_DIR}/third_party/gtest EXCLUDE_FROM_ALL)

Expand Down
7 changes: 3 additions & 4 deletions core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ include_directories(
)

if(IOS OR MSVC)
set(library_type "STATIC")
set(LIBRARY_TYPE "STATIC")
else()
set(library_type "SHARED")
set(LIBRARY_TYPE "SHARED")
endif()

if(IOS OR MSVC OR APPLE)
Expand All @@ -20,7 +20,7 @@ elseif(ANDROID)
add_subdirectory(third_party/tinyxml2 EXCLUDE_FROM_ALL)
endif()

add_library(dronecore ${library_type}
add_library(dronecore ${LIBRARY_TYPE}
call_every_handler.cpp
connection.cpp
curl_wrapper.cpp
Expand Down Expand Up @@ -127,4 +127,3 @@ if(NOT IOS AND NOT ANDROID)
unit_tests_runner
)
endif()

18 changes: 0 additions & 18 deletions grpc/server/cmake/external/cares/CMakeLists.txt

This file was deleted.

23 changes: 0 additions & 23 deletions grpc/server/cmake/external/grpc/CMakeLists.txt

This file was deleted.

20 changes: 0 additions & 20 deletions grpc/server/cmake/external/protobuf/CMakeLists.txt

This file was deleted.

15 changes: 15 additions & 0 deletions grpc/server/cmake/helpers/build_boringssl.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
set(DRONECORESERVER_BORINGSSL_SOURCE_DIR "${DRONECORESERVER_EXTERNAL_SOURCE_DIR}/boringssl")
set(DRONECORESERVER_BORINGSSL_BINARY_DIR "${DRONECORESERVER_EXTERNAL_BINARY_DIR}/boringssl")

include(cmake/helpers/build_target.cmake)
build_target(${DRONECORESERVER_BORINGSSL_SOURCE_DIR} ${DRONECORESERVER_BORINGSSL_BINARY_DIR})

# Manually install boringssl
set(OPENSSL_ROOT_DIR ${DRONECORESERVER_BORINGSSL_BINARY_DIR}/install)

file(MAKE_DIRECTORY ${OPENSSL_ROOT_DIR})

file(COPY ${DRONECORESERVER_BORINGSSL_BINARY_DIR}/build/boringssl/src/boringssl/include/openssl DESTINATION ${OPENSSL_ROOT_DIR})
file(COPY ${DRONECORESERVER_BORINGSSL_BINARY_DIR}/build/boringssl/src/boringssl-build/ssl/libssl.a DESTINATION ${OPENSSL_ROOT_DIR}/lib)
file(COPY ${DRONECORESERVER_BORINGSSL_BINARY_DIR}/build/boringssl/src/boringssl-build/crypto/libcrypto.a DESTINATION ${OPENSSL_ROOT_DIR}/lib)
file(REMOVE ${OPENSSL_ROOT_DIR}/openssl/opensslv.h)
4 changes: 1 addition & 3 deletions grpc/server/cmake/helpers/build_cares.cmake
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
# Set c-ares variables
set(DRONECORESERVER_CARES_SOURCE_DIR "${DRONECORESERVER_EXTERNAL_SOURCE_DIR}/cares")
set(DRONECORESERVER_CARES_BINARY_DIR "${DRONECORESERVER_EXTERNAL_BINARY_DIR}/cares")
set(ENV{DRONECORESERVER_CARES_BINARY_DIR} ${DRONECORESERVER_CARES_BINARY_DIR})

# Actually build c-ares
include(cmake/helpers/build_target.cmake)
build_target(${DRONECORESERVER_CARES_SOURCE_DIR} ${DRONECORESERVER_CARES_BINARY_DIR})

# Update CMAKE_PREFIX_PATH accordingly
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}:${DRONECORESERVER_CARES_BINARY_DIR}")
set(ENV{CMAKE_PREFIX_PATH} ${CMAKE_PREFIX_PATH})
list(APPEND CMAKE_PREFIX_PATH /cares/lib/cmake/c-ares)
5 changes: 3 additions & 2 deletions grpc/server/cmake/helpers/build_external.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
set(DRONECORESERVER_EXTERNAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake/external")
set(DRONECORESERVER_EXTERNAL_BINARY_DIR "${CMAKE_BINARY_DIR}/external")
set(DRONECORESERVER_EXTERNAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake/third_party")
set(DRONECORESERVER_EXTERNAL_BINARY_DIR "${CMAKE_BINARY_DIR}/third_party")

include(cmake/helpers/build_boringssl.cmake)
include(cmake/helpers/build_protobuf.cmake)
include(cmake/helpers/build_cares.cmake)
include(cmake/helpers/build_grpc.cmake)
5 changes: 0 additions & 5 deletions grpc/server/cmake/helpers/build_grpc.cmake
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# Set gRPC variables
set(DRONECORESERVER_GRPC_SOURCE_DIR "${DRONECORESERVER_EXTERNAL_SOURCE_DIR}/grpc")
set(DRONECORESERVER_GRPC_BINARY_DIR "${DRONECORESERVER_EXTERNAL_BINARY_DIR}/grpc")
set(ENV{DRONECORESERVER_GRPC_BINARY_DIR} ${DRONECORESERVER_GRPC_BINARY_DIR})

# Actually build gRPC
include(cmake/helpers/build_target.cmake)
Expand All @@ -18,7 +17,3 @@ if(NOT DRONECORESERVER_GRPC_CMAKE_CONFIG)
endif()

include(${DRONECORESERVER_GRPC_CMAKE_CONFIG})

# Update CMAKE_PREFIX_PATH accordingly
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}:${DRONECORESERVER_GRPC_BINARY_DIR}")
set(ENV{CMAKE_PREFIX_PATH} ${CMAKE_PREFIX_PATH})
16 changes: 1 addition & 15 deletions grpc/server/cmake/helpers/build_protobuf.cmake
Original file line number Diff line number Diff line change
@@ -1,24 +1,10 @@
# Set protobuf variables
set(DRONECORESERVER_PROTOBUF_SOURCE_DIR "${DRONECORESERVER_EXTERNAL_SOURCE_DIR}/protobuf")
set(DRONECORESERVER_PROTOBUF_BINARY_DIR "${DRONECORESERVER_EXTERNAL_BINARY_DIR}/protobuf")
set(ENV{DRONECORESERVER_PROTOBUF_BINARY_DIR} ${DRONECORESERVER_PROTOBUF_BINARY_DIR})

# Actually build protobuf
include(cmake/helpers/build_target.cmake)
build_target(${DRONECORESERVER_PROTOBUF_SOURCE_DIR} ${DRONECORESERVER_PROTOBUF_BINARY_DIR})

# Include protobuf-config.cmake
find_file(
DRONECORESERVER_PROTOBUF_CMAKE_CONFIG protobuf-config.cmake
PATHS ${DRONECORESERVER_PROTOBUF_BINARY_DIR}/lib/cmake/protobuf ${DRONECORESERVER_PROTOBUF_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/cmake/protobuf
)

if(NOT DRONECORESERVER_PROTOBUF_CMAKE_CONFIG)
message(FATAL_ERROR "Protobuf config file (protobuf-config.cmake) not found!")
endif()

include(${DRONECORESERVER_PROTOBUF_CMAKE_CONFIG})

# Update CMAKE_PREFIX_PATH accordingly
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}:${DRONECORESERVER_PROTOBUF_BINARY_DIR}")
set(ENV{CMAKE_PREFIX_PATH} ${CMAKE_PREFIX_PATH})
list(APPEND CMAKE_PREFIX_PATH /protobuf/lib/cmake/protobuf)
10 changes: 9 additions & 1 deletion grpc/server/cmake/helpers/build_target.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ function(build_target SRC_DIR TARGET_DIR)
COMMAND ${CMAKE_COMMAND}
-G${CMAKE_GENERATOR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
"-DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}"
"-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DBINARY_DIR=${TARGET_DIR}
-DANDROID_ABI=${ANDROID_ABI}
-DANDROID_STL=${ANDROID_STL}
-DIOS_PLATFORM=${IOS_PLATFORM}
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
${SRC_DIR}
WORKING_DIRECTORY ${TARGET_DIR}/build
WORKING_DIRECTORY "${TARGET_DIR}/build"
)

execute_process(COMMAND ${CMAKE_COMMAND} --build .
Expand Down
68 changes: 68 additions & 0 deletions grpc/server/cmake/third_party/boringssl/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
cmake_minimum_required(VERSION 3.1)

project(external-boringssl)

include(ExternalProject)

set(ARG_GIT_REPOSITORY https://github.com/google/boringssl.git)
set(ARG_GIT_TAG 38c20fe8d514a5328f5db404e116af8e9136c7f8)

if(ANDROID)
message(STATUS "Preparing external project \"boringssl\" for Android...")
message(STATUS " -- CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS " -- ANDROID_ABI: ${ANDROID_ABI}")
message(STATUS " -- ANDROID_STL: ${ANDROID_STL}")

ExternalProject_add(
boringssl
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX boringssl
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=${BINARY_DIR}
-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}
-DANDROID_ABI:STRING=${ANDROID_ABI}
-DANDROID_STL:STRING=${ANDROID_STL}
INSTALL_COMMAND true)
elseif(IOS)
message(STATUS "Preparing external project \"boringssl\" for iOS...")
message(STATUS " -- CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS " -- IOS_PLATFORM: ${IOS_PLATFORM}")

ExternalProject_add(
boringssl
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX boringssl
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=${BINARY_DIR}
-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}
-DIOS_PLATFORM=${IOS_PLATFORM}
-DOPENSSL_NO_ASM=ON # Note: https://github.com/grpc/grpc/issues/9440
INSTALL_COMMAND true)
else()
# We disable ASM optimizations for MSVC and iOS (see above for iOS), which
# might have a performance impact on secure communications.
# This should be benchmarked/evaluated before we decide if it is worth
# enabling them or not in our case.
#
# More information here: https://github.com/grpc/grpc/issues/9440
if (MSVC)
set(OPENSSL_NO_ASM ON)
else()
set(OPENSSL_NO_ASM OFF)
endif()

message(STATUS "Preparing external project \"boringssl\"...")

ExternalProject_add(
boringssl
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX boringssl
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=${BINARY_DIR}
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DOPENSSL_NO_ASM=${OPENSSL_NO_ASM}
INSTALL_COMMAND true)
endif()
62 changes: 62 additions & 0 deletions grpc/server/cmake/third_party/cares/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
cmake_minimum_required(VERSION 3.1)

project(external-cares)

include(ExternalProject)

set(ARG_GIT_REPOSITORY https://github.com/c-ares/c-ares.git)
set(ARG_GIT_TAG cares-1_13_0)

if(ANDROID)
message(STATUS "Preparing external project \"c-ares\" for Android...")
message(STATUS " -- CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS " -- ANDROID_ABI: ${ANDROID_ABI}")
message(STATUS " -- ANDROID_STL: ${ANDROID_STL}")

ExternalProject_add(
cares
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX cares
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=${BINARY_DIR}
-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}
-DANDROID_ABI:STRING=${ANDROID_ABI}
-DANDROID_STL:STRING=${ANDROID_STL}
-DCARES_STATIC=ON
-DCARES_SHARED=OFF
-DCARES_STATIC_PIC=ON
UPDATE_COMMAND "")
elseif(IOS)
message(STATUS "Preparing external project \"c-ares\" for iOS...")
message(STATUS " -- CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS " -- IOS_PLATFORM: ${IOS_PLATFORM}")

ExternalProject_add(
cares
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX cares
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=${BINARY_DIR}
-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}
-DIOS_PLATFORM=${IOS_PLATFORM}
-DCARES_STATIC=ON
-DCARES_SHARED=OFF
-DCARES_STATIC_PIC=ON
UPDATE_COMMAND "")
else()
message(STATUS "Preparing external project \"c-ares\"...")

ExternalProject_add(
cares
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX cares
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=${BINARY_DIR}
-DCARES_STATIC=ON
-DCARES_SHARED=OFF
-DCARES_STATIC_PIC=ON
UPDATE_COMMAND "")
endif()
Loading

0 comments on commit 8430308

Please sign in to comment.