diff --git a/CMakeLists.txt b/CMakeLists.txt index 0088fa6..64f00c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,5 +23,82 @@ if (NOT WIN32) find_package(PythonInterp 2.7 REQUIRED) endif (NOT WIN32) -add_subdirectory(Targets) +include(ExternalProject) + +if (NOT HAS_OWN_DEPOT_TOOLS) + if (WIN32) + set(GCLIENT_EXECUTABLE ${CMAKE_BINARY_DIR}/depot_tools/src/depot-tools/gclient.bat) + else (WIN32) + set(GCLIENT_EXECUTABLE ${CMAKE_BINARY_DIR}/depot_tools/src/depot-tools/gclient) + endif (WIN32) + + ExternalProject_Add( + depot-tools + + GIT_REPOSITORY https://chromium.googlesource.com/chromium/tools/depot_tools + + PREFIX ${CMAKE_BINARY_DIR}/depot_tools + + CONFIGURE_COMMAND "" + UPDATE_COMMAND "" + PATCH_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) + + set(_NEXT_DEPENDS depot-tools) + set(DEPOT_TOOLS_PATH ${CMAKE_BINARY_DIR}/depot_tools/src/depot-tools) +endif (NOT HAS_OWN_DEPOT_TOOLS) + +ExternalProject_Add( + webrtc-src + + DEPENDS ${_NEXT_DEPENDS} + GIT_REPOSITORY https://chromium.googlesource.com/external/webrtc + + PREFIX ${CMAKE_BINARY_DIR}/webrtc + BINARY_DIR ${CMAKE_BINARY_DIR}/webrtc/build + DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/webrtc/src + SOURCE_DIR ${CMAKE_BINARY_DIR}/webrtc/src + STAMP_DIR ${CMAKE_BINARY_DIR}/webrtc/stamp + TMP_DIR ${CMAKE_BINARY_DIR}/webrtc/tmp + + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/webrtc/CMakeLists.txt.in ${CMAKE_BINARY_DIR}/webrtc/src/CMakeLists.txt + UPDATE_COMMAND "" + INSTALL_COMMAND "" + + CMAKE_ARGS + -DDEPOT_TOOLS_PATH:PATH=${DEPOT_TOOLS_PATH} + -DGCLIENT_EXECUTABLE:PATH=${GCLIENT_EXECUTABLE} + -DHAS_OWN_DEPOT_TOOLS:PATH=${HAS_OWN_DEPOT_TOOLS} + -DCMAKE_MODULE_PATH:PATH=${CMAKE_MODULE_PATH} + -DTARGET_CPU=${TARGET_CPU} + -DTARGET_OS=${TARGET_OS} + -DWEBRTC_BRANCH_HEAD=${WEBRTC_BRANCH_HEAD} + -DWEBRTC_PARENT_DIR:PATH=${CMAKE_BINARY_DIR}/webrtc + -DWEBRTC_REVISION=${WEBRTC_REVISION} + -DWEBRTC_ROOT_DIR:PATH=${CMAKE_BINARY_DIR} +) + +ExternalProject_Add( + libwebrtc + DEPENDS webrtc-src + + INSTALL_DIR ${CMAKE_BINARY_DIR} + SOURCE_DIR ${CMAKE_SOURCE_DIR}/libwebrtc + BINARY_DIR ${CMAKE_BINARY_DIR}/libwebrtc + + CMAKE_ARGS + -DLIBRARY_TYPE:STRING=${LIBRARY_TYPE} + -DTARGET_OS:STRING=${TARGET_OS} + -DWEBRTC_OUTPUT_DIR:PATH=${CMAKE_BINARY_DIR}/webrtc/src/out/Default + -DWEBRTC_SOURCE_DIR:PATH=${CMAKE_BINARY_DIR}/webrtc/src/webrtc + -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DINSTALL_CMAKE_DIR:PATH=${CMAKE_BINARY_DIR}/lib/cmake/LibWebRTC +) + +include(Install) +include(Package) + export(PACKAGE LibWebRTC) diff --git a/CMakeModules/DepotTools.cmake b/CMakeModules/DepotTools.cmake new file mode 100644 index 0000000..94a60d0 --- /dev/null +++ b/CMakeModules/DepotTools.cmake @@ -0,0 +1,75 @@ +if (HAS_OWN_DEPOT_TOOLS) + return() +endif (HAS_OWN_DEPOT_TOOLS) + +if (WEBRTC_REVISION) + message(STATUS "Retrieving date for commit ${WEBRTC_REVISION}") + execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%ci ${WEBRTC_REVISION} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE _WEBRTC_COMMIT_DATE) + + if (NOT _WEBRTC_COMMIT_DATE) + message(FATAL_ERROR "-- Unable to find webrtc commit date at ${WEBRTC_REVISION}") + endif (NOT _WEBRTC_COMMIT_DATE) +elseif (WEBRTC_BRANCH_HEAD) + message(STATUS "Retrieving branch-heads refspecs") + execute_process(COMMAND ${GIT_EXECUTABLE} config remote.origin.fetch +refs/branch-heads/*:refs/remotes/branch-heads/* ^\\+refs/branch-heads/\\*:.*$ + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE _ADD_REMOTE_RESULT) + + if (NOT _ADD_REMOTE_RESULT EQUAL 0) + message(FATAL_ERROR "-- Unable to add branch-heads refspec") + endif (NOT _ADD_REMOTE_RESULT EQUAL 0) + + message(STATUS "Fetching ${WEBRTC_BRANCH_HEAD}") + execute_process(COMMAND ${GIT_EXECUTABLE} fetch origin ${WEBRTC_BRANCH_HEAD} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE _WEBRTC_FETCH_RESULT) + + if (NOT _WEBRTC_FETCH_RESULT EQUAL 0) + message(FATAL_ERROR "-- Unable to fetch ${WEBRTC_BRANCH_HEAD}") + endif (NOT _WEBRTC_FETCH_RESULT EQUAL 0) + + message(STATUS "Checking out ${WEBRTC_BRANCH_HEAD}") + execute_process(COMMAND ${GIT_EXECUTABLE} checkout FETCH_HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE _WEBRTC_CHECKOUT_RESULT) + + if (NOT _WEBRTC_CHECKOUT_RESULT EQUAL 0) + message(FATAL_ERROR "-- Unable to checkout ${WEBRTC_BRANCH_HEAD}") + endif (NOT _WEBRTC_CHECKOUT_RESULT EQUAL 0) + + message(STATUS "Retrieving date for commit ${WEBRTC_BRANCH_HEAD}") + execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%ci + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE _WEBRTC_COMMIT_DATE + RESULT_VARIABLE _WEBRTC_COMMIT_DATE_RESULT) + + if (NOT _WEBRTC_COMMIT_DATE_RESULT EQUAL 0) + message(FATAL_ERROR "-- Unable to retrieve the commit date") + endif (NOT _WEBRTC_COMMIT_DATE_RESULT EQUAL 0) +else (WEBRTC_REVISION) + message(FATAL_ERROR "-- Both WEBRTC_REVISION and WEBRTC_BRANCH_HEAD variables are undefined") +endif (WEBRTC_REVISION) + +string(STRIP ${_WEBRTC_COMMIT_DATE} _WEBRTC_COMMIT_DATE) +message(STATUS "Retrieving depot_tools commit before ${_WEBRTC_COMMIT_DATE}") + +execute_process(COMMAND ${GIT_EXECUTABLE} rev-list -n 1 --before=\"${_WEBRTC_COMMIT_DATE}\" master + WORKING_DIRECTORY ${DEPOT_TOOLS_PATH} + OUTPUT_VARIABLE _DEPOT_TOOLS_COMMIT) + +if (NOT _DEPOT_TOOLS_COMMIT) + message(FATAL_ERROR "-- Unable to find depot_tools commit before ${_WEBRTC_COMMIT_DATE}") +endif (NOT _DEPOT_TOOLS_COMMIT) + +string(STRIP ${_DEPOT_TOOLS_COMMIT} _DEPOT_TOOLS_COMMIT) +message(STATUS "Checking out depot_tools to commit ${_DEPOT_TOOLS_COMMIT}") + +execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${_DEPOT_TOOLS_COMMIT} + WORKING_DIRECTORY ${DEPOT_TOOLS_PATH} + RESULT_VARIABLE _DEPOT_TOOLS_CHECKED_OUT) + +if (NOT _DEPOT_TOOLS_CHECKED_OUT EQUAL 0) + message(FATAL_ERROR "-- Unable to checkout depot_tools to commit ${_DEPOT_TOOLS_COMMIT}") +endif (NOT _DEPOT_TOOLS_CHECKED_OUT EQUAL 0) diff --git a/CMakeModules/Prefix.cmake b/CMakeModules/Environment.cmake similarity index 50% rename from CMakeModules/Prefix.cmake rename to CMakeModules/Environment.cmake index f1b766b..a665f31 100644 --- a/CMakeModules/Prefix.cmake +++ b/CMakeModules/Environment.cmake @@ -1,58 +1,48 @@ -if(PREFIX_INCLUDED) - return() -endif(PREFIX_INCLUDED) -set(PREFIX_INCLUDED true) - -# -# Generate environment variables -# -if (DEPOT_TOOLS_PATH) - set(WEBRTC_PATH ${DEPOT_TOOLS_PATH}) -else (DEPOT_TOOLS_PATH) - set(WEBRTC_PATH ${CMAKE_BINARY_DIR}/depot_tools) -endif (DEPOT_TOOLS_PATH) +set(_WEBRTC_PATH ${DEPOT_TOOLS_PATH}) +set(_DEPOT_TOOLS_ENV PATH=${_WEBRTC_PATH}) if (WIN32) get_filename_component(DEPOT_TOOLS_PYTHON_PATH - "${WEBRTC_PATH}/python276_bin" + "${_WEBRTC_PATH}/python276_bin" REALPATH) - list(APPEND WEBRTC_PATH ${DEPOT_TOOLS_PYTHON_PATH}) + list(APPEND _WEBRTC_PATH ${DEPOT_TOOLS_PYTHON_PATH}) endif (WIN32) -list(APPEND WEBRTC_PATH $ENV{PATH}) +list(APPEND _WEBRTC_PATH $ENV{PATH}) if (WIN32) - string(REGEX REPLACE "/" "\\\\" WEBRTC_PATH "${WEBRTC_PATH}") - string(REGEX REPLACE ";" "\\\;" WEBRTC_PATH "${WEBRTC_PATH}") + string(REGEX REPLACE "/" "\\\\" _WEBRTC_PATH "${_WEBRTC_PATH}") + string(REGEX REPLACE ";" "\\\;" _WEBRTC_PATH "${_WEBRTC_PATH}") else (WIN32) - string(REGEX REPLACE ";" ":" WEBRTC_PATH "${WEBRTC_PATH}") + string(REGEX REPLACE ";" ":" _WEBRTC_PATH "${_WEBRTC_PATH}") endif (WIN32) -get_filename_component(CHROMIUM_PYTHONPATH - "${CMAKE_BINARY_DIR}/src/build" +get_filename_component(_CHROMIUM_PYTHONPATH + "${CMAKE_SOURCE_DIR}/build" REALPATH) -if (WIN32) - set(PREFIX_FILENAME ${CMAKE_BINARY_DIR}/prefix.bat) - set(PREFIX_COMMAND set) - set(PREFIX_HEADER "@ECHO OFF") - set(PREFIX_EVAL "%*") - set(PREFIX_EXECUTE cmd /c ${PREFIX_FILENAME}) - set(PREFIX_NEWLINE \r\n) -else (WIN32) - set(PREFIX_FILENAME ${CMAKE_BINARY_DIR}/prefix.sh) - set(PREFIX_COMMAND export) - set(PREFIX_HEADER "") - set(PREFIX_EVAL eval\ $@) - set(PREFIX_EXECUTE /bin/sh ${PREFIX_FILENAME}) - set(PREFIX_NEWLINE \n) -endif (WIN32) +if (WIN32) + set(PREFIX_FILENAME ${CMAKE_BINARY_DIR}/prefix.bat) + set(PREFIX_COMMAND set) + set(PREFIX_HEADER "@ECHO OFF") + set(PREFIX_EVAL "%*") + set(PREFIX_EXECUTE cmd /c ${PREFIX_FILENAME}) + set(PREFIX_NEWLINE \r\n) +else (WIN32) + set(PREFIX_FILENAME ${CMAKE_BINARY_DIR}/prefix.sh) + set(PREFIX_COMMAND export) + set(PREFIX_HEADER "") + set(PREFIX_EVAL eval\ $@) + set(PREFIX_EXECUTE /bin/sh ${PREFIX_FILENAME}) + set(PREFIX_NEWLINE \n) +endif (WIN32) + +file(WRITE ${PREFIX_FILENAME} "${PREFIX_HEADER} +${PREFIX_COMMAND} PATH=${_WEBRTC_PATH} +${PREFIX_COMMAND} PYTHONPATH=${_CHROMIUM_PYTHONPATH} +${PREFIX_COMMAND} DEPOT_TOOLS_WIN_TOOLCHAIN=0 +${PREFIX_COMMAND} DEPOT_TOOLS_UPDATE=0 +${PREFIX_COMMAND} CHROME_HEADLESS=1 +${PREFIX_EVAL} +") -file(WRITE ${PREFIX_FILENAME} "${PREFIX_HEADER} -${PREFIX_COMMAND} PATH=${WEBRTC_PATH} -${PREFIX_COMMAND} PYTHONPATH=${CHROMIUM_PYTHONPATH} -${PREFIX_COMMAND} DEPOT_TOOLS_WIN_TOOLCHAIN=0 -${PREFIX_COMMAND} DEPOT_TOOLS_UPDATE=0 -${PREFIX_COMMAND} CHROME_HEADLESS=1 -${PREFIX_EVAL} -") diff --git a/CMakeModules/GClient.cmake b/CMakeModules/GClient.cmake new file mode 100644 index 0000000..a42671a --- /dev/null +++ b/CMakeModules/GClient.cmake @@ -0,0 +1,22 @@ +file(WRITE ${WEBRTC_PARENT_DIR}/.gclient "solutions = [ + { + \"url\": \"https://chromium.googlesource.com/external/webrtc.git\", + \"managed\": False, + \"name\": \"src\", + \"deps_file\": \"DEPS\", + \"custom_deps\": {}, + }, +] +") + +if (TARGET_OS STREQUAL "android") + file(APPEND ${WEBRTC_PARENT_DIR}/.gclient "target_os = [\"android\", \"unix\"]") +elseif (TARGET_OS STREQUAL "ios") + file(APPEND ${WEBRTC_PARENT_DIR}/.gclient "target_os = [\"ios\", \"mac\"]") +elseif (TARGET_OS STREQUAL "linux") + file(APPEND ${WEBRTC_PARENT_DIR}/.gclient "target_os = [\"unix\"]") +elseif (TARGET_OS STREQUAL "mac") + file(APPEND ${WEBRTC_PARENT_DIR}/.gclient "target_os = [\"mac\"]") +elseif (TARGET_OS STREQUAL "win") + file(APPEND ${WEBRTC_PARENT_DIR}/.gclient "target_os = [\"win\"]") +endif (TARGET_OS STREQUAL "android") diff --git a/CMakeModules/GClientConfig.cmake b/CMakeModules/GClientConfig.cmake deleted file mode 100644 index 1d5d458..0000000 --- a/CMakeModules/GClientConfig.cmake +++ /dev/null @@ -1,30 +0,0 @@ -if(GCLIENT_CONFIG_INCLUDED) - return() -endif(GCLIENT_CONFIG_INCLUDED) -set(GCLIENT_CONFIG_INCLUDED true) - -# -# Retrieve WebRTC source code -# -file(WRITE ${CMAKE_BINARY_DIR}/.gclient "solutions = [ - { - \"url\": \"https://chromium.googlesource.com/external/webrtc.git\", - \"managed\": False, - \"name\": \"src\", - \"deps_file\": \"DEPS\", - \"custom_deps\": {}, - }, -] -") - -if (TARGET_OS STREQUAL "android") - file(APPEND ${CMAKE_BINARY_DIR}/.gclient "target_os = [\"android\", \"unix\"]") -elseif (TARGET_OS STREQUAL "ios") - file(APPEND ${CMAKE_BINARY_DIR}/.gclient "target_os = [\"ios\", \"mac\"]") -elseif (TARGET_OS STREQUAL "linux") - file(APPEND ${CMAKE_BINARY_DIR}/.gclient "target_os = [\"unix\"]") -elseif (TARGET_OS STREQUAL "mac") - file(APPEND ${CMAKE_BINARY_DIR}/.gclient "target_os = [\"mac\"]") -elseif (TARGET_OS STREQUAL "win") - file(APPEND ${CMAKE_BINARY_DIR}/.gclient "target_os = [\"win\"]") -endif (TARGET_OS STREQUAL "android") diff --git a/CMakeModules/Gn.cmake b/CMakeModules/Gn.cmake new file mode 100644 index 0000000..cf52c5b --- /dev/null +++ b/CMakeModules/Gn.cmake @@ -0,0 +1,35 @@ +set(_GEN_ARGS "use_gold=false target_cpu=\\\"${TARGET_CPU}\\\" target_os=\\\"${TARGET_OS}\\\"") + +if (MSVC OR XCODE) + set(_GEN_ARGS "${_GEN_ARGS} is_debug=false") +elseif (CMAKE_BUILD_TYPE MATCHES Debug) + set(_GEN_ARGS "${_GEN_ARGS} is_debug=true") +else (MSVC OR XCODE) + set(_GEN_ARGS "${_GEN_ARGS} is_debug=false") +endif (MSVC OR XCODE) + +if (BUILD_TESTS) + set(_GEN_ARGS "${_GEN_ARGS} rtc_include_tests=true") +else (BUILD_TESTS) + set(_GEN_ARGS "${_GEN_ARGS} rtc_include_tests=false") +endif (BUILD_TESTS) + +if (GN_EXTRA_ARGS) + set(_GEN_ARGS "${_GEN_ARGS} ${GN_EXTRA_ARGS}") +endif (GN_EXTRA_ARGS) + +set(_GN_OUT_DIR out/Default) +set(_GEN_COMMAND_LINE gn gen ${_GN_OUT_DIR} --args=\"${_GEN_ARGS}\") + +if (WIN32) + set(_SCRIPT_SUFFIX .bat) +elseif (UNIX) + set(_SCRIPT_SUFFIX .sh) + set(_GEN_COMMAND sh) +endif (WIN32) + +string(REPLACE ";" " " _GEN_COMMAND_STR "${_GEN_COMMAND_LINE}") +set(_GN_SCRIPT_FILENAME ${WEBRTC_PARENT_DIR}/gn-gen${_SCRIPT_SUFFIX}) +file(WRITE ${_GN_SCRIPT_FILENAME} ${_GEN_COMMAND_STR}) + +set(_GEN_COMMAND ${_GEN_COMMAND} ${_GN_SCRIPT_FILENAME}) diff --git a/CMakeModules/LibWebRTCCommand.cmake b/CMakeModules/LibWebRTCCommand.cmake deleted file mode 100644 index b7f7e1f..0000000 --- a/CMakeModules/LibWebRTCCommand.cmake +++ /dev/null @@ -1,28 +0,0 @@ -if(LIBWEBRTC_COMMAND_INCLUDED) - return() -endif(LIBWEBRTC_COMMAND_INCLUDED) -set(LIBWEBRTC_COMMAND_INCLUDED true) - -include(CMakeParseArguments) -include(Prefix) - -function(libwebrtc_command) - set(ONE_VALUE_ARGS NAME COMMENT DEPENDS WORKING_DIRECTORY) - set(MULTI_VALUE_ARGS COMMAND) - cmake_parse_arguments(COMMAND "" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} ) - - set(CMF_DIR ${CMAKE_BINARY_DIR}/CMakeFiles) - set(STAMP_FILE "${CMF_DIR}/${COMMAND_NAME}-complete") - - add_custom_command( - OUTPUT ${STAMP_FILE} - COMMENT ${COMMAND_COMMENT} - COMMAND ${PREFIX_EXECUTE} ${COMMAND_COMMAND} - COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE} - WORKING_DIRECTORY ${COMMAND_WORKING_DIRECTORY} - ) - - add_custom_target(${COMMAND_NAME} ALL DEPENDS ${STAMP_FILE}) - - add_dependencies(${COMMAND_NAME} ${COMMAND_DEPENDS}) -endfunction() diff --git a/Targets/CMakeLists.txt b/Targets/CMakeLists.txt deleted file mode 100644 index dc71cee..0000000 --- a/Targets/CMakeLists.txt +++ /dev/null @@ -1,205 +0,0 @@ -include(ExternalProject) -include(LibWebRTCCommand) -include(GClientConfig) - -set(_DOWNLOAD_COMMAND ${GCLIENT_EXECUTABLE} sync --with_branch_heads --nohooks) -if (WEBRTC_REVISION) - set(_DOWNLOAD_COMMAND ${_DOWNLOAD_COMMAND} --revision ${WEBRTC_REVISION}) -endif (WEBRTC_REVISION) - -ExternalProject_Add( - webrtc-src - PREFIX ${CMAKE_BINARY_DIR} - BINARY_DIR ${CMAKE_BINARY_DIR} - SOURCE_DIR ${CMAKE_BINARY_DIR} - DOWNLOAD_DIR ${CMAKE_BINARY_DIR} - - DOWNLOAD_COMMAND ${PREFIX_EXECUTE} ${_DOWNLOAD_COMMAND} - BUILD_COMMAND "" - INSTALL_COMMAND "" -) - -set(_NEXT_DEPENDS webrtc-src) -if (NOT WEBRTC_REVISION) - libwebrtc_command( - NAME webrtc-fetch-refs - COMMAND ${GIT_EXECUTABLE} fetch origin ${WEBRTC_BRANCH_HEAD} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src" - COMMENT "Fetching branch heads" - DEPENDS webrtc-src - ) - - libwebrtc_command( - NAME webrtc-checkout-fetch-head - COMMAND ${GIT_EXECUTABLE} checkout FETCH_HEAD - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src" - COMMENT "Checking out fetch head" - DEPENDS webrtc-fetch-refs - ) - - set(_NEXT_DEPENDS webrtc-checkout-fetch-head) -endif (NOT WEBRTC_REVISION) - -libwebrtc_command( - NAME webrtc-update-clang - COMMAND ${PYTHON_EXECUTABLE} src/tools/clang/scripts/update.py - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Updating clang" - DEPENDS ${_NEXT_DEPENDS} -) - -set(_NEXT_DEPENDS webrtc-update-clang) -if (UNIX AND NOT APPLE) - libwebrtc_command( - NAME webrtc-install-sysroot - COMMAND ${CMAKE_BINARY_DIR}/src/build/linux/sysroot_scripts/install-sysroot.py --running-as-hook - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Installing Linux sysroots" - DEPENDS ${_NEXT_DEPENDS} - ) - set(_NEXT_DEPENDS webrtc-install-sysroot) - - set(_PLATFORM linux*) - set(_FOLDER linux64) -elseif (APPLE) - set(_PLATFORM darwin) - set(_FOLDER mac) -elseif (WIN32) - libwebrtc_command( - NAME webrtc-vs-toolchain - COMMAND ${PYTHON_EXECUTABLE} src/build/vs_toolchain.py update - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Updating Visual Studio toolchain" - DEPENDS ${_NEXT_DEPENDS} - ) - set(_NEXT_DEPENDS webrtc-vs-toolchain) - - set(_PLATFORM win32) - set(_FOLDER win) - set(_SUFFIX .exe) -endif (UNIX AND NOT APPLE) - -libwebrtc_command( - NAME webrtc-fetch-gn - COMMAND download_from_google_storage --no_resume --platform=${_PLATFORM} --no_auth --bucket chromium-gn -s src/buildtools/${_FOLDER}/gn${_SUFFIX}.sha1 - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Fetching gn binary" - DEPENDS ${_NEXT_DEPENDS} -) - -libwebrtc_command( - NAME webrtc-fetch-clang-format - COMMAND download_from_google_storage --no_resume --platform=${_PLATFORM} --no_auth --bucket chromium-clang-format -s src/buildtools/${_FOLDER}/clang-format${_SUFFIX}.sha1 - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Fetching clang-format binary" - DEPENDS webrtc-fetch-gn -) - -# -# Android dependencies -set(_NEXT_DEPENDS webrtc-fetch-clang-format) -if (TARGET_OS STREQUAL "android") - libwebrtc_command( - NAME webrtc-android-fetch-play-services - COMMAND ${PYTHON_EXECUTABLE} src/build/android/play_services/update.py download - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Fetching Google Play Services" - DEPENDS webrtc-fetch-clang-format - ) - - libwebrtc_command( - NAME webrtc-android-update-lastchange - COMMAND ${PYTHON_EXECUTABLE} src/build/util/lastchange.py -o src/build/util/LASTCHANGE - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Updating src/build/util/LASTCHANGE" - DEPENDS webrtc-android-fetch-play-services - ) - - set(_NEXT_DEPENDS webrtc-android-update-lastchange) - foreach(_DEPENDENCY_NAME android-support-test-runner espresso guava hamcrest javax-inject) - string(REPLACE "-" "_" _DEPENDENCY_FOLDER ${_DEPENDENCY_NAME}) - - libwebrtc_command( - NAME webrtc-android-fetch-${_DEPENDENCY_NAME} - COMMAND ${PYTHON_EXECUTABLE} src/build/android/update_deps/update_third_party_deps.py download -b chromium-${_DEPENDENCY_NAME} -l third_party/${_DEPENDENCY_FOLDER} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Fetching Android dependency: ${_DEPENDENCY_NAME}" - DEPENDS ${_NEXT_DEPENDS} - ) - - set(_NEXT_DEPENDS webrtc-android-fetch-${_DEPENDENCY_NAME}) - endforeach(_DEPENDENCY_NAME) -endif (TARGET_OS STREQUAL "android") - -# -# Generate build files -set(_GEN_ARGS use_gold=false target_cpu=\\"${TARGET_CPU}\\" target_os=\\"${TARGET_OS}\\") - -if (MSVC OR XCODE) - set(_GEN_ARGS ${_GEN_ARGS} is_debug=$<$:true>$<$:false>) -elseif (CMAKE_BUILD_TYPE MATCHES Debug) - set(_GEN_ARGS ${_GEN_ARGS} is_debug=true) -else (MSVC OR XCODE) - set(_GEN_ARGS ${_GEN_ARGS} is_debug=false) -endif (MSVC OR XCODE) - -if (BUILD_TESTS) - set(_GEN_ARGS ${_GEN_ARGS} rtc_include_tests=true) -else (BUILD_TESTS) - set(_GEN_ARGS ${_GEN_ARGS} rtc_include_tests=false) -endif (BUILD_TESTS) - -if (LIBRARY_TYPE STREQUAL STATIC) - set(_GEN_ARGS ${_GEN_ARGS} is_component_build=false) -else (LIBRARY_TYPE STREQUAL STATIC) - set(_GEN_ARGS ${_GEN_ARGS} is_component_build=true) -endif (LIBRARY_TYPE STREQUAL STATIC) - -set(_GEN_ARGS ${_GEN_ARGS} ${GN_EXTRA_ARGS}) - -if (WIN32) - set(_GEN_COMMAND gn gen out/Default --args="${_GEN_ARGS}") -elseif (UNIX) - set(_GEN_COMMAND gn gen out/Default --args='"${_GEN_ARGS}"') -endif (WIN32) - -libwebrtc_command( - NAME webrtc-generate - COMMAND ${_GEN_COMMAND} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src" - COMMENT "Generating build files" - DEPENDS ${_NEXT_DEPENDS} -) - -# -# Run ninja -libwebrtc_command( - NAME webrtc-build - COMMAND ninja ${NINJA_ARGS} -C out/Default - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src" - COMMENT "Building WebRTC" - DEPENDS webrtc-generate -) - -# -# Link the library -ExternalProject_Add( - libwebrtc - DEPENDS webrtc-build - - INSTALL_DIR ${CMAKE_BINARY_DIR} - SOURCE_DIR ${CMAKE_SOURCE_DIR}/Targets/libwebrtc - BINARY_DIR ${CMAKE_BINARY_DIR}/libwebrtc - - CMAKE_ARGS - -DLIBRARY_TYPE:STRING=${LIBRARY_TYPE} - -DTARGET_OS:STRING=${TARGET_OS} - -DWEBRTC_OUTPUT_DIR:PATH=${CMAKE_BINARY_DIR}/src/out/Default - -DWEBRTC_SOURCE_DIR:PATH=${CMAKE_BINARY_DIR}/src/webrtc - -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DINSTALL_CMAKE_DIR:PATH=${CMAKE_BINARY_DIR}/lib/cmake/LibWebRTC -) - -include(Install) -include(Package) diff --git a/depot_tools/CMakeLists.txt b/depot_tools/CMakeLists.txt new file mode 100644 index 0000000..7ea078a --- /dev/null +++ b/depot_tools/CMakeLists.txt @@ -0,0 +1,27 @@ +if (DEPOT_TOOLS_PATH) + return() +endif (DEPOT_TOOLS_PATH) + +include(ExternalProject) + +if (WIN32) + set(GCLIENT_EXECUTABLE ${CMAKE_BINARY_DIR}/depot_tools/gclient.bat) +else (WIN32) + set(GCLIENT_EXECUTABLE ${CMAKE_BINARY_DIR}/depot_tools/gclient) +endif (WIN32) + +ExternalProject_Add( + depot-tools + + GIT_REPOSITORY https://chromium.googlesource.com/chromium/tools/depot_tools + + PREFIX ${CMAKE_BINARY_DIR}/depot_tools + + CONFIGURE_COMMAND "" + UPDATE_COMMAND "" + PATCH_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" +) + +set(_NEXT_DEPENDS depot-tools) diff --git a/Targets/libwebrtc/CMakeLists.txt b/libwebrtc/CMakeLists.txt similarity index 100% rename from Targets/libwebrtc/CMakeLists.txt rename to libwebrtc/CMakeLists.txt diff --git a/webrtc/CMakeLists.txt.in b/webrtc/CMakeLists.txt.in new file mode 100644 index 0000000..d1d229e --- /dev/null +++ b/webrtc/CMakeLists.txt.in @@ -0,0 +1,110 @@ +cmake_minimum_required(VERSION 3.3) +project(webrtc) + +find_package(Git REQUIRED) +if (WIN32) + set(PYTHON_EXECUTABLE ${DEPOT_TOOLS_PATH}/python.bat) +else (WIN32) + find_package(PythonInterp 2.7 REQUIRED) +endif (WIN32) + +include(DepotTools) +include(GClient) +include(Environment) + +message(STATUS "Synchronizing webrtc") +set(_SYNC_COMMAND ${GCLIENT_EXECUTABLE} sync --nohooks) +execute_process(COMMAND ${PREFIX_EXECUTE} ${_SYNC_COMMAND} + WORKING_DIRECTORY ${WEBRTC_PARENT_DIR} + RESULT_VARIABLE _SYNCHRONIZED_WEBRTC) + +if (NOT _SYNCHRONIZED_WEBRTC EQUAL 0) + message(FATAL_ERROR "Unable to synchronize webrtc ${PREFIX_EXECUTE} ${_SYNC_COMMAND}") +endif (NOT _SYNCHRONIZED_WEBRTC EQUAL 0) + +message(STATUS "Updating clang") +set(_UPDATE_CLANG_COMMAND ${PYTHON_EXECUTABLE} src/tools/clang/scripts/update.py) +execute_process(COMMAND ${PREFIX_EXECUTE} ${_UPDATE_CLANG_COMMAND} + WORKING_DIRECTORY ${WEBRTC_PARENT_DIR} + RESULT_VARIABLE _CLANG_UPDATED) + +if (NOT _CLANG_UPDATED EQUAL 0) + message(FATAL_ERROR "Unable to update clang") +endif (NOT _CLANG_UPDATED EQUAL 0) + +if (UNIX AND NOT APPLE) + message(STATUS "Retrieving sysroot") + set(_SYSROOT_COMMAND ${PYTHON_EXECUTABLE} ${WEBRTC_PARENT_DIR}/src/build/linux/sysroot_scripts/install-sysroot.py --running-as-hook) + execute_process(COMMAND ${PREFIX_EXECUTE} ${_SYSROOT_COMMAND} + WORKING_DIRECTORY ${WEBRTC_PARENT_DIR} + RESULT_VARIABLE _SYSROOT_RETRIEVED) + + if (NOT _SYSROOT_RETRIEVED EQUAL 0) + message(FATAL_ERROR "Unable to retrieve the sysroot") + endif (NOT _SYSROOT_RETRIEVED EQUAL 0) + + set(_PLATFORM linux*) + set(_FOLDER linux64) +elseif (APPLE) + set(_PLATFORM darwin) + set(_FOLDER mac) +elseif (WIN32) + message(STATUS "Retrieving Visual Studio toolchain") + set(_TOOLCHAIN_COMMAND ${PYTHON_EXECUTABLE} src/build/vs_toolchain.py update) + execute_process(COMMAND ${PREFIX_EXECUTE} ${_TOOLCHAIN_COMMAND} + WORKING_DIRECTORY ${WEBRTC_PARENT_DIR} + RESULT_VARIABLE _VS_TOOLCHAIN_RETRIEVED) + + if (NOT _VS_TOOLCHAIN_RETRIEVED EQUAL 0) + message(FATAL_ERROR "Unable to retrieve Visual Studio toolchain") + endif (NOT _VS_TOOLCHAIN_RETRIEVED EQUAL 0) + + set(_PLATFORM win32) + set(_FOLDER win) + set(_SUFFIX .exe) +endif (UNIX AND NOT APPLE) + +message(STATUS "Fetching gn${_SUFFIX} for ${_PLATFORM}") +set(_GN_COMMAND download_from_google_storage --no_resume --platform=${_PLATFORM} + --no_auth --bucket chromium-gn + -s src/buildtools/${_FOLDER}/gn${_SUFFIX}.sha1) +execute_process(COMMAND ${PREFIX_EXECUTE} ${_GN_COMMAND} + WORKING_DIRECTORY ${WEBRTC_PARENT_DIR} + RESULT_VARIABLE _GN_RETRIEVED) + +if (NOT _GN_RETRIEVED EQUAL 0) + message(FATAL_ERROR "Unable to retrieve clang-format${_SUFFIX}") +endif (NOT _GN_RETRIEVED EQUAL 0) + +message(STATUS "Fetching clang-format${_SUFFIX} for ${_PLATFORM}") +set(_CLANG_FORMAT_COMMAND download_from_google_storage --no_resume + --platform=${_PLATFORM} --no_auth --bucket chromium-clang-format + -s src/buildtools/${_FOLDER}/clang-format${_SUFFIX}.sha1) +execute_process(COMMAND ${PREFIX_EXECUTE} ${_CLANG_FORMAT_COMMAND} + WORKING_DIRECTORY ${WEBRTC_PARENT_DIR} + RESULT_VARIABLE _CLANG_FORMAT_RETRIEVED) + +if (NOT _CLANG_FORMAT_RETRIEVED EQUAL 0) + message(FATAL_ERROR "Unable to retrieve clang-format${_SUFFIX}") +endif (NOT _CLANG_FORMAT_RETRIEVED EQUAL 0) + +include(Gn) + +message(STATUS "Generating build files: ${_GEN_COMMAND}") +execute_process(COMMAND ${PREFIX_EXECUTE} ${_GEN_COMMAND} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE _BUILD_GENERATED) + +if (NOT _BUILD_GENERATED EQUAL 0) + message(FATAL_ERROR "Unable to execute ${_GEN_COMMAND}") +endif (NOT _BUILD_GENERATED EQUAL 0) + +message(STATUS "Running ninja") +set(_NINJA_COMMAND ninja ${NINJA_ARGS} -C out/Default) +execute_process(COMMAND ${PREFIX_EXECUTE} ${_NINJA_COMMAND} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE _NINJA_DONE) + +if (NOT _NINJA_DONE EQUAL 0) + message(FATAL_ERROR "Unable to build webrtc") +endif (NOT _NINJA_DONE EQUAL 0)