diff --git a/CMakeModules/LibWebRTCCommand.cmake b/CMakeModules/LibWebRTCCommand.cmake new file mode 100644 index 0000000..6c10346 --- /dev/null +++ b/CMakeModules/LibWebRTCCommand.cmake @@ -0,0 +1,23 @@ +include(CMakeParseArguments) + +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} + VERBATIM + ) + + add_custom_target(${COMMAND_NAME} ALL DEPENDS ${STAMP_FILE}) + + add_dependencies(${COMMAND_NAME} ${COMMAND_DEPENDS}) +endfunction() diff --git a/Targets/WebRTC/CMakeLists.txt b/Targets/WebRTC/CMakeLists.txt index 0ef477d..cd00db8 100644 --- a/Targets/WebRTC/CMakeLists.txt +++ b/Targets/WebRTC/CMakeLists.txt @@ -1,127 +1,125 @@ include(ExternalProject) -include(LibWebRTCPrefix) +include(LibWebRTCCommand) include(LibWebRTCConfig) +include(LibWebRTCPrefix) -set(GCLIENT_SYNC_COMMAND - ${DEPOTTOOLS_GCLIENT_EXECUTABLE} sync - --revision ${LIBWEBRTC_WEBRTC_REVISION} -D) +ExternalProject_Add( + webrtc-src + PREFIX ${CMAKE_BINARY_DIR} + BINARY_DIR ${CMAKE_BINARY_DIR} + SOURCE_DIR ${CMAKE_BINARY_DIR} + DOWNLOAD_DIR ${CMAKE_BINARY_DIR} -set(RETRIEVE_SYSROOT_COMMAND echo) + DOWNLOAD_COMMAND ${PREFIX_EXECUTE} ${DEPOTTOOLS_GCLIENT_EXECUTABLE} sync --revision ${LIBWEBRTC_WEBRTC_REVISION} -D -n + BUILD_COMMAND ${PREFIX_EXECUTE} ${PYTHON_EXECUTABLE} src/tools/clang/scripts/update.py + INSTALL_COMMAND "" + + LOG_DOWNLOAD 1 +) + +set(_NEXT_DEPENDS webrtc-src) if (UNIX AND NOT APPLE) - set(RETRIEVE_SYSROOT_COMMAND ${CMAKE_BINARY_DIR}/src/build/linux/sysroot_scripts/install-sysroot.py --arch=amd64) + 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 webrtc-src + ) + 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 webrtc-src + ) + set(_NEXT_DEPENDS webrtc-vs-toolchain) + + set(_PLATFORM win32) + set(_FOLDER win) + set(_SUFFIX .exe) endif (UNIX AND NOT APPLE) -set(UPDATE_CLANG_COMMAND ${PYTHON_EXECUTABLE} src/tools/clang/scripts/update.py) +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} +) -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} ${GCLIENT_CONFIG_COMMAND} - DOWNLOAD_COMMAND ${PREFIX_EXECUTE} ${GCLIENT_SYNC_COMMAND} - UPDATE_COMMAND ${PREFIX_EXECUTE} ${UPDATE_CLANG_COMMAND} - BUILD_COMMAND ${RETRIEVE_SYSROOT_COMMAND} - - INSTALL_COMMAND "" - - LOG_DOWNLOAD 1) - -# -# Retrieve buildtools binaries -# -add_custom_command( - OUTPUT "Buildtools" - - COMMAND ${PREFIX_EXECUTE} download_from_google_storage --no_resume --platform=linux* --no_auth --bucket chromium-gn -s src/buildtools/linux64/gn.sha1 - COMMAND ${PREFIX_EXECUTE} download_from_google_storage --no_resume --platform=linux* --no_auth --bucket chromium-clang-format -s src/buildtools/linux64/clang-format.sha1 - COMMAND ${PREFIX_EXECUTE} download_from_google_storage --no_resume --platform=darwin --no_auth --bucket chromium-gn -s src/buildtools/mac/gn.sha1 - COMMAND ${PREFIX_EXECUTE} download_from_google_storage --no_resume --platform=darwin --no_auth --bucket chromium-clang-format -s src/buildtools/mac/clang-format.sha1 - COMMAND ${PREFIX_EXECUTE} download_from_google_storage --no_resume --platform=win32 --no_auth --bucket chromium-gn -s src/buildtools/win/gn.exe.sha1 - COMMAND ${PREFIX_EXECUTE} download_from_google_storage --no_resume --platform=win32 --no_auth --bucket chromium-clang-format -s src/buildtools/win/clang-format.exe.sha1 - - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Populating buildtools folder") - -add_custom_target( - webrtc-buildtools ALL - DEPENDS "Buildtools") - -add_dependencies(webrtc-buildtools webrtc-src) +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 +) # # Generate build files # -set(LIBWEBRTC_GEN_ARGS use_gold=false target_cpu=\\"${TARGET_CPU}\\" target_os=\\"${TARGET_OS}\\") +set(_GEN_ARGS use_gold=false target_cpu="${TARGET_CPU}" target_os="${TARGET_OS}") if (NOT CMAKE_BUILD_TYPE MATCHES DEBUG) - set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS} is_debug=false) + set(_GEN_ARGS ${_GEN_ARGS} is_debug=false) elseif (NOT CMAKE_BUILD_TYPE MATCHES DEBUG) - set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS} is_debug=true) + set(_GEN_ARGS ${_GEN_ARGS} is_debug=true) endif (NOT CMAKE_BUILD_TYPE MATCHES DEBUG) if (NOT BUILD_TESTS) - set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS} rtc_include_tests=false) + set(_GEN_ARGS ${_GEN_ARGS} rtc_include_tests=false) endif (NOT BUILD_TESTS) if (WIN32) - set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS}) - set(LIBWEBRTC_GEN_COMMAND gn gen out/Default --args="${LIBWEBRTC_GEN_ARGS}") -elseif (APPLE) - set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS}) - set(LIBWEBRTC_GEN_COMMAND gn gen out/Default --args='"${LIBWEBRTC_GEN_ARGS}"') -elseif (UNIX AND NOT APPLE) - set(LIBWEBRTC_GEN_ARGS ${LIBWEBRTC_GEN_ARGS}) - set(LIBWEBRTC_GEN_COMMAND gn gen out/Default --args='"${LIBWEBRTC_GEN_ARGS}"') + set(_GEN_ARGS ${_GEN_ARGS}) + set(_GEN_COMMAND gn gen out/Default --args=${_GEN_ARGS}) +elseif (UNIX) + set(_GEN_ARGS ${_GEN_ARGS}) + set(_GEN_COMMAND gn gen out/Default --args='${_GEN_ARGS}') endif (WIN32) - -add_custom_command( - OUTPUT "Generate" - - COMMAND ${PREFIX_EXECUTE} ${LIBWEBRTC_GEN_COMMAND} - - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Generating build files") - -add_custom_target( - webrtc-generate ALL - DEPENDS "Generate") - -add_dependencies(webrtc-generate webrtc-buildtools) +libwebrtc_command( + NAME webrtc-generate + COMMAND ${_GEN_COMMAND} + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src" + COMMENT "Generating build files" + DEPENDS webrtc-fetch-clang-format +) # -# Run the build command +# Run ninja # -set(LIBWEBRTC_BUILD_COMMAND ninja ${NINJA_ARGS} -C out/Default) - -add_custom_command( - OUTPUT "Build" - - COMMAND ${PREFIX_EXECUTE} ${LIBWEBRTC_BUILD_COMMAND} - - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Building WebRTC") - -add_custom_target( - webrtc-ninja ALL - DEPENDS "Build") - -add_dependencies(webrtc-ninja webrtc-generate) +libwebrtc_command( + NAME webrtc-build + COMMAND ninja -C out/Default + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src" + COMMENT "Building WebRTC" + DEPENDS webrtc-generate +) # # Link the library # -ExternalProject_Add(libwebrtc - DEPENDS webrtc-ninja +ExternalProject_Add( + libwebrtc + DEPENDS webrtc-build - INSTALL_DIR ${CMAKE_BINARY_DIR} - SOURCE_DIR ${CMAKE_SOURCE_DIR}/Targets/libwebrtc - BINARY_DIR ${CMAKE_BINARY_DIR}/libwebrtc + INSTALL_DIR ${CMAKE_BINARY_DIR} + SOURCE_DIR ${CMAKE_SOURCE_DIR}/Targets/libwebrtc + BINARY_DIR ${CMAKE_BINARY_DIR}/libwebrtc - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} - -DLIBWEBRTC_INCLUDE_DIR:STRING=${CMAKE_BINARY_DIR}/src/webrtc - -DLIBWEBRTC_OUTPUT_DIR:PATH=${CMAKE_BINARY_DIR}/src/out/Default - -DTARGET_OS:STRING=${TARGET_OS}) \ No newline at end of file + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} + -DLIBWEBRTC_INCLUDE_DIR:STRING=${CMAKE_BINARY_DIR}/src/webrtc + -DLIBWEBRTC_OUTPUT_DIR:PATH=${CMAKE_BINARY_DIR}/src/out/Default + -DTARGET_OS:STRING=${TARGET_OS} +) \ No newline at end of file diff --git a/Targets/libwebrtc/CMakeLists.txt b/Targets/libwebrtc/CMakeLists.txt index 9199f23..91cb291 100644 --- a/Targets/libwebrtc/CMakeLists.txt +++ b/Targets/libwebrtc/CMakeLists.txt @@ -23,7 +23,11 @@ file(GLOB_RECURSE LIBWEBRTC_OBJ_EXCLUDED ${LIBWEBRTC_OUTPUT_DIR}/obj/third_party/yasm/re2c/*.${LIBWEBRTC_OBJ_EXT} ${LIBWEBRTC_OUTPUT_DIR}/obj/third_party/yasm/yasm/*.${LIBWEBRTC_OBJ_EXT} ${LIBWEBRTC_OUTPUT_DIR}/obj/third_party/protobuf/protoc/*.${LIBWEBRTC_OBJ_EXT} - ${LIBWEBRTC_OUTPUT_DIR}/obj/third_party/protobuf/protobuf_full/*.${LIBWEBRTC_OBJ_EXT}) + ${LIBWEBRTC_OUTPUT_DIR}/obj/third_party/protobuf/protobuf_full/*.${LIBWEBRTC_OBJ_EXT} + ${LIBWEBRTC_OUTPUT_DIR}/obj/webrtc/examples/*.${LIBWEBRTC_OBJ_EXT} + ${LIBWEBRTC_OUTPUT_DIR}/obj/webrtc/tools/*.${LIBWEBRTC_OBJ_EXT} + ${LIBWEBRTC_OUTPUT_DIR}/obj/webrtc/modules/video_capture/video_capture/video_capture_external.${LIBWEBRTC_OBJ_EXT} + ${LIBWEBRTC_OUTPUT_DIR}/obj/webrtc/modules/video_capture/video_capture/device_info_external.${LIBWEBRTC_OBJ_EXT}) list(LENGTH LIBWEBRTC_OBJ_EXCLUDED LIBWEBRTC_OBJ_EXCLUDED_LEN) @@ -31,12 +35,7 @@ if (${LIBWEBRTC_OBJ_EXCLUDED_LEN} GREATER "0") list(REMOVE_ITEM LIBWEBRTC_OBJ_FILES ${LIBWEBRTC_OBJ_EXCLUDED}) endif () -if (TARGET_OS STREQUAL "android") - set(ANDROID_NDK ${CMAKE_INSTALL_PREFIX}/src/third_party/android_tools/ndk) - add_library(webrtc SHARED ${LIBWEBRTC_OBJ_FILES}) -else () - add_library(webrtc STATIC ${LIBWEBRTC_OBJ_FILES}) -endif () +add_library(webrtc STATIC ${LIBWEBRTC_OBJ_FILES}) set_source_files_properties(${LIBWEBRTC_OBJ_FILES} PROPERTIES EXTERNAL_OBJECT true