From 5590dfbadcd065900270055c8a9518ff35e2501a Mon Sep 17 00:00:00 2001 From: Axel Isouard Date: Sat, 24 Sep 2016 13:52:24 +0200 Subject: [PATCH] Define and use macros, set install directory paths --- CMakeLists.txt | 29 ++++++++++ CMakeModules/Common.cmake | 28 +++++++++ Targets/Build/CMakeLists.txt | 95 +++++++++++++++++++----------- Targets/Fetch/CMakeLists.txt | 109 +++++++++++++++++------------------ 4 files changed, 171 insertions(+), 90 deletions(-) create mode 100644 CMakeModules/Common.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c5b1ba..45514cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,13 @@ find_package(DepotTools REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +# +# Options +# + +option(BUILD_TESTS "Build test binaries" OFF) +option(BUILD_EXAMPLES "Build examples binaries" OFF) + # # Versioning # @@ -37,6 +44,28 @@ set(LIBWEBRTC_LIBRARY_PROPERTIES ${LIBWEBRTC_LIBRARY_PROPERTIES} SOVERSION "${LIBWEBRTC_API_VERSION}" ) +# +# Directories +# + +if(NOT LIBWEBRTC_INSTALL_BIN_DIR) + set(LIBWEBRTC_INSTALL_BIN_DIR "bin") +endif() +if(NOT LIBWEBRTC_INSTALL_LIB_DIR) + set(LIBWEBRTC_INSTALL_LIB_DIR "lib") +endif() +if(NOT LIBWEBRTC_INSTALL_DATA_DIR) + set(LIBWEBRTC_INSTALL_DATA_DIR "share") +endif() +if(NOT LIBWEBRTC_INSTALL_INCLUDE_DIR) + set(LIBWEBRTC_INSTALL_INCLUDE_DIR "include") +endif() +if(NOT LIBWEBRTC_INSTALL_CMAKE_DIR) + set(LIBWEBRTC_INSTALL_CMAKE_DIR "lib") +endif() + +set(LIBWEBRTC_LIBRARY ${CMAKE_STATIC_LIBRARY_PREFIX}webrtc${CMAKE_STATIC_LIBRARY_SUFFIX}) +set(LIBWEBRTC_BUILD_ROOT ${CMAKE_SOURCE_DIR}/src/out/Default) set(WEBRTC_CHROMIUM_DEPS git@github.com:aisouard/libwebrtc-chromium-deps.git) add_subdirectory(Targets) \ No newline at end of file diff --git a/CMakeModules/Common.cmake b/CMakeModules/Common.cmake new file mode 100644 index 0000000..62f19f5 --- /dev/null +++ b/CMakeModules/Common.cmake @@ -0,0 +1,28 @@ +set(LIBWEBRTC_ENV_COMMAND ${CMAKE_COMMAND} -E env \"PATH=${CMAKE_SOURCE_DIR}/Dependencies/depot_tools:$ENV{PATH}\") + +macro(add_libwebrtc_command + ARG_NAME + ARG_OUTPUT + ARG_COMMAND + ARG_WORKING_DIRECTORY + ARG_COMMENT +) + set (ARG_DEPENDENCIES ${ARGN}) + + add_custom_command( + OUTPUT ${ARG_OUTPUT} + COMMAND ${ARG_COMMAND} + WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} + COMMENT ${ARG_COMMENT} + ) + + add_custom_target( + ${ARG_NAME} ALL + DEPENDS ${ARG_OUTPUT} + ) + + list(LENGTH ARG_DEPENDENCIES NUM_ARG_DEPENDENCIES) + if (${NUM_ARG_DEPENDENCIES} GREATER 0) + add_dependencies(${ARG_NAME} ${ARG_DEPENDENCIES}) + endif () +endmacro() \ No newline at end of file diff --git a/Targets/Build/CMakeLists.txt b/Targets/Build/CMakeLists.txt index bd26a9b..37ade67 100644 --- a/Targets/Build/CMakeLists.txt +++ b/Targets/Build/CMakeLists.txt @@ -1,53 +1,82 @@ +include(Common) + # # Generate build files # -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/Nevermind - COMMAND ${CMAKE_COMMAND} -E env \"PATH=${CMAKE_SOURCE_DIR}/Dependencies/depot_tools:$ENV{PATH}\" gn gen out/Default --args='is_debug=false rtc_include_tests=false' - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Generate build files" +set(LIBWEBRTC_GEN_ARGS "") + +if(NOT CMAKE_BUILD_TYPE MATCHES DEBUG) + set(LIBWEBRTC_GEN_ARGS is_debug=false) +endif(NOT CMAKE_BUILD_TYPE MATCHES DEBUG) + +if(NOT BUILD_TESTS) + set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS} rtc_include_tests=false) +endif(NOT BUILD_TESTS) + +set(GENERATE_BUILD_DEPENDENCY libwebrtc_patch) +if(NOT BUILD_EXAMPLES) + set(GENERATE_BUILD_DEPENDENCY libwebrtc_links) +endif(NOT BUILD_EXAMPLES) + +set(GENERATE_COMMAND + ${LIBWEBRTC_ENV_COMMAND} gn gen out/Default --args='${LIBWEBRTC_GEN_ARGS}') + +add_libwebrtc_command(libwebrtc_generate_build + ${CMAKE_BINARY_DIR}/Nevermind + "${GENERATE_COMMAND}" + ${CMAKE_BINARY_DIR}/src + "Generate build files" + ${GENERATE_BUILD_DEPENDENCY} ) -add_custom_target( - webrtc_generate_build ALL - DEPENDS ${CMAKE_BINARY_DIR}/Nevermind -) +# +# Revert examples +# -add_dependencies(webrtc_generate_build webrtc_links) +if(NOT BUILD_EXAMPLES) + set(PATCH_COMMAND sed -i "s/'include_examples%': 0/'include_examples%': 1/g" src/all.gyp) + + add_libwebrtc_command(libwebrtc_revert + None + "${PATCH_COMMAND}" + ${CMAKE_BINARY_DIR} + "Reverting build definitions" + libwebrtc_generate_build + ) +endif(NOT BUILD_EXAMPLES) # # Run ninja # -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/src/out/Default/obj/root.stamp - COMMAND ${CMAKE_COMMAND} -E env \"PATH=${CMAKE_SOURCE_DIR}/Dependencies/depot_tools:$ENV{PATH}\" ninja -C out/Default - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Build WebRTC" -) +set(NINJA_DEPENDENCY libwebrtc_generate_build) +if(NOT BUILD_EXAMPLES) + set(GENERATE_BUILD_DEPENDENCY libwebrtc_revert) +endif(NOT BUILD_EXAMPLES) -add_custom_target( - webrtc_build ALL - DEPENDS ${CMAKE_BINARY_DIR}/src/out/Default/obj/root.stamp -) +set(BUILD_WEBRTC_COMMAND + ${LIBWEBRTC_ENV_COMMAND} ninja -C out/Default libjingle_peerconnection) -add_dependencies(webrtc_build webrtc_generate_build) +add_libwebrtc_command(libwebrtc_build + ${CMAKE_BINARY_DIR}/src/out/Default/obj/root.stamp + "${BUILD_WEBRTC_COMMAND}" + ${CMAKE_BINARY_DIR}/src + "Build WebRTC" + ${NINJA_DEPENDENCY} +) # # Merge libraries into a single one # -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/libwebrtc.a - COMMAND python webrtc/build/merge_libs.py out/Default ${CMAKE_BINARY_DIR}/libwebrtc.a - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Merging libraries into libwebrtc.a" -) +set(MERGE_COMMAND + python webrtc/build/merge_libs.py out/Default ${CMAKE_BINARY_DIR}/${WEBRTC_LIBRARY}) -add_custom_target( - webrtc_merge ALL - DEPENDS ${CMAKE_BINARY_DIR}/libwebrtc.a -) - -add_dependencies(webrtc_merge webrtc_build) \ No newline at end of file +add_libwebrtc_command(libwebrtc_merge + ${CMAKE_BINARY_DIR}/${WEBRTC_LIBRARY} + "${MERGE_COMMAND}" + ${CMAKE_BINARY_DIR}/src + "Merging libraries into ${WEBRTC_LIBRARY}" + libwebrtc_build +) \ No newline at end of file diff --git a/Targets/Fetch/CMakeLists.txt b/Targets/Fetch/CMakeLists.txt index 69972c9..ee0a731 100644 --- a/Targets/Fetch/CMakeLists.txt +++ b/Targets/Fetch/CMakeLists.txt @@ -1,96 +1,91 @@ +include(Common) + # # Fetch # -set(gclient_config +set(GCLIENT_CONFIG_COMMAND ${DEPOTTOOLS_GCLIENT_EXECUTABLE} config --name src https://chromium.googlesource.com/external/webrtc.git ) -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/.gclient - COMMAND ${gclient_config} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Configuring gclient to pull webrtc code" -) - -add_custom_target( - webrtc_config ALL - DEPENDS ${CMAKE_BINARY_DIR}/.gclient +add_libwebrtc_command(libwebrtc_config + ${CMAKE_BINARY_DIR}/.gclient + "${GCLIENT_CONFIG_COMMAND}" + ${CMAKE_BINARY_DIR} + "Configuring gclient to pull webrtc code" ) # # Sync # -set(gclient_sync +set(GCLIENT_SYNC_COMMAND ${DEPOTTOOLS_GCLIENT_EXECUTABLE} sync -n -D ) -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/src/all.gyp - COMMAND ${gclient_sync} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Retrieving WebRTC source code" +add_libwebrtc_command(libwebrtc_sync + ${CMAKE_BINARY_DIR}/src/all.gyp + "${GCLIENT_SYNC_COMMAND}" + ${CMAKE_BINARY_DIR} + "Retrieving WebRTC source code" + libwebrtc_config ) -add_custom_target( - webrtc_sync ALL - DEPENDS ${CMAKE_BINARY_DIR}/src/all.gyp -) - -add_dependencies(webrtc_sync webrtc_config) - # # Sync Chromium # -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/src/chromium/src/DEPS - COMMAND git clone ${WEBRTC_CHROMIUM_DEPS} ${CMAKE_BINARY_DIR}/src/chromium/src - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Retrieving Chromium dependencies" +set(GIT_CLONE_COMMAND git clone ${LIBWEBRTC_CHROMIUM_DEPS} ${CMAKE_BINARY_DIR}/src/chromium/src) + +add_libwebrtc_command(libwebrtc_chromium_deps + ${CMAKE_BINARY_DIR}/src/chromium/src/DEPS + "${GIT_CLONE_COMMAND}" + ${CMAKE_BINARY_DIR} + "Retrieving Chromium dependencies" + libwebrtc_sync ) -add_custom_target( - webrtc_chromium_deps ALL - DEPENDS ${CMAKE_BINARY_DIR}/src/chromium/src/DEPS -) +# +# Update Clang +# -add_dependencies(webrtc_chromium_deps webrtc_sync) +set(UPDATE_CLAND_COMMAND ${LIBWEBRTC_ENV_COMMAND} python chromium/src/tools/clang/scripts/update.py) + +add_libwebrtc_command(libwebrtc_clang + ${CMAKE_BINARY_DIR}/src/chromium/src/third_party/llvm-build + "${UPDATE_CLAND_COMMAND}" + ${CMAKE_BINARY_DIR}/src + "Updating clang" + libwebrtc_chromium_deps +) # # Setup Links # -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/src/build - COMMAND ${CMAKE_COMMAND} -E env \"PATH=${CMAKE_SOURCE_DIR}/Dependencies/depot_tools:$ENV{PATH}\" python setup_links.py - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Creating symbolic links" -) +set(SETUP_LINKS_COMMAND ${LIBWEBRTC_ENV_COMMAND} python setup_links.py) -add_custom_target( - webrtc_links ALL - DEPENDS ${CMAKE_BINARY_DIR}/src/build +add_libwebrtc_command(libwebrtc_links + ${CMAKE_BINARY_DIR}/src/tools/clang + "${SETUP_LINKS_COMMAND}" + ${CMAKE_BINARY_DIR}/src + "Creating symbolic links" + libwebrtc_clang ) -add_dependencies(webrtc_links webrtc_chromium_deps) - # # Remove examples # -add_custom_command( - OUTPUT None - COMMAND sed -i "s/'include_examples%': 1/'include_examples%': 0/g" src/all.gyp - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Patching build files" -) +if(NOT BUILD_EXAMPLES) + set(PATCH_COMMAND sed -i "s/'include_examples%': 1/'include_examples%': 0/g" src/all.gyp) -add_custom_target( - webrtc_patch ALL - DEPENDS None -) - -add_dependencies(webrtc_patch webrtc_links) \ No newline at end of file + add_libwebrtc_command(libwebrtc_patch + None + "${PATCH_COMMAND}" + ${CMAKE_BINARY_DIR} + "Patching build definitions" + libwebrtc_links + ) +endif(NOT BUILD_EXAMPLES) \ No newline at end of file