Add single-configuration generators support on Windows
This commit is contained in:
Kirill Kirilenko 2021-05-21 22:30:50 +03:00
parent 5a40775960
commit c8cdba02bc
5 changed files with 63 additions and 28 deletions

View file

@ -16,7 +16,12 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
include(FindLibraries) include(FindLibraries)
include(TargetOsAndCpu) include(TargetOsAndCpu)
set(ENV{PATH} "${CMAKE_SOURCE_DIR}/depot_tools:$ENV{PATH}") include(Utils)
prependPath("${CMAKE_SOURCE_DIR}/depot_tools")
if (WIN32)
set(ENV{DEPOT_TOOLS_WIN_TOOLCHAIN} 0)
endif()
set(WEBRTC_SOURCE_DIR "${CMAKE_SOURCE_DIR}/webrtc/src") set(WEBRTC_SOURCE_DIR "${CMAKE_SOURCE_DIR}/webrtc/src")
set(WEBRTC_BUILD_DIR "${CMAKE_BINARY_DIR}/webrtc") set(WEBRTC_BUILD_DIR "${CMAKE_BINARY_DIR}/webrtc")
@ -26,7 +31,6 @@ message(STATUS "WebRTC version: ${WEBRTC_VERSION}")
if (MSVC) if (MSVC)
# Always build with dynamic runtime on MSVC # Always build with dynamic runtime on MSVC
include(PatchFile)
patch_file(${WEBRTC_SOURCE_DIR}/build/config/win/BUILD.gn ":static_crt" ":dynamic_crt") patch_file(${WEBRTC_SOURCE_DIR}/build/config/win/BUILD.gn ":static_crt" ":dynamic_crt")
endif () endif ()

View file

@ -1,10 +1,6 @@
function(add_webrtc_target SOURCE_DIR BUILD_DIR) function(add_webrtc_target SOURCE_DIR BUILD_DIR)
set(GEN_ARGS_COMMON "target_cpu=\"${TARGET_CPU}\" target_os=\"${TARGET_OS}\" is_component_build=false use_gold=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_enable_protobuf=false") set(GEN_ARGS_COMMON "target_cpu=\"${TARGET_CPU}\" target_os=\"${TARGET_OS}\" is_component_build=false use_gold=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_enable_protobuf=false rtc_build_examples=false rtc_build_tools=false")
if (MSVC)
set(GEN_ARGS_COMMON "${GEN_ARGS_COMMON} is_clang=false")
endif ()
set(GEN_ARGS_DEBUG "${GEN_ARGS_COMMON} is_debug=true") set(GEN_ARGS_DEBUG "${GEN_ARGS_COMMON} is_debug=true")
set(GEN_ARGS_RELEASE "${GEN_ARGS_COMMON} is_debug=false") set(GEN_ARGS_RELEASE "${GEN_ARGS_COMMON} is_debug=false")
@ -19,14 +15,18 @@ function(add_webrtc_target SOURCE_DIR BUILD_DIR)
set(GN_EXECUTABLE gn) set(GN_EXECUTABLE gn)
endif () endif ()
if (MSVC) macro(run_gn DIRECTORY)
execute_process(COMMAND ${GN_EXECUTABLE} gen ${DIRECTORY} "--args=${GEN_ARGS}" WORKING_DIRECTORY ${SOURCE_DIR})
endmacro()
if (CMAKE_GENERATOR MATCHES "Visual Studio")
# Debug config # Debug config
message(STATUS "Running gn for debug configuration...") message(STATUS "Running gn for debug configuration...")
set(GEN_ARGS "${GEN_ARGS_DEBUG}") set(GEN_ARGS "${GEN_ARGS_DEBUG}")
if (GN_EXTRA_ARGS) if (GN_EXTRA_ARGS)
set(GEN_ARGS "${GEN_ARGS} ${GN_EXTRA_ARGS}") set(GEN_ARGS "${GEN_ARGS} ${GN_EXTRA_ARGS}")
endif () endif ()
execute_process(COMMAND ${GN_EXECUTABLE} gen ${BUILD_DIR}/Debug "--args=${GEN_ARGS}" WORKING_DIRECTORY ${SOURCE_DIR}) run_gn("${BUILD_DIR}/Debug")
# Release config # Release config
message(STATUS "Running gn for release configuration...") message(STATUS "Running gn for release configuration...")
@ -34,7 +34,7 @@ function(add_webrtc_target SOURCE_DIR BUILD_DIR)
if (GN_EXTRA_ARGS) if (GN_EXTRA_ARGS)
set(GEN_ARGS "${GEN_ARGS} ${GN_EXTRA_ARGS}") set(GEN_ARGS "${GEN_ARGS} ${GN_EXTRA_ARGS}")
endif () endif ()
execute_process(COMMAND ${GN_EXECUTABLE} gen ${BUILD_DIR}/Release "--args=${GEN_ARGS}" WORKING_DIRECTORY ${SOURCE_DIR}) run_gn("${BUILD_DIR}/Release")
else () else ()
message(STATUS "Running gn...") message(STATUS "Running gn...")
if (CMAKE_BUILD_TYPE STREQUAL "Debug") if (CMAKE_BUILD_TYPE STREQUAL "Debug")
@ -45,15 +45,25 @@ function(add_webrtc_target SOURCE_DIR BUILD_DIR)
if (GN_EXTRA_ARGS) if (GN_EXTRA_ARGS)
set(GEN_ARGS "${GEN_ARGS} ${GN_EXTRA_ARGS}") set(GEN_ARGS "${GEN_ARGS} ${GN_EXTRA_ARGS}")
endif () endif ()
execute_process(COMMAND ${GN_EXECUTABLE} gen ${BUILD_DIR} "--args=${GEN_ARGS}" WORKING_DIRECTORY ${SOURCE_DIR}) run_gn("${BUILD_DIR}")
endif () endif ()
if (MSVC) macro(add_custom_command_with_path TARGET_NAME)
add_custom_target(webrtc-build ALL ninja -C "${BUILD_DIR}/$<CONFIG>" :webrtc jsoncpp libyuv) add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
add_custom_target(webrtc-clean ${GN_EXECUTABLE} clean "${BUILD_DIR}/$<CONFIG>" WORKING_DIRECTORY ${SOURCE_DIR}) COMMAND ${CMAKE_COMMAND} -E env "PATH=$ENV{PATH}" ${ARGN}
WORKING_DIRECTORY ${SOURCE_DIR}
VERBATIM
)
endmacro()
add_custom_target(webrtc-build ALL)
add_custom_target(webrtc-clean)
if (CMAKE_GENERATOR MATCHES "Visual Studio")
add_custom_command_with_path(webrtc-build ninja -C "${BUILD_DIR}/$<CONFIG>" :webrtc jsoncpp libyuv)
add_custom_command_with_path(webrtc-clean ${GN_EXECUTABLE} clean "${BUILD_DIR}/$<CONFIG>")
else () else ()
add_custom_target(webrtc-build ALL ninja -C "${BUILD_DIR}" :webrtc jsoncpp libyuv) add_custom_command_with_path(webrtc-build ninja -C "${BUILD_DIR}" :webrtc jsoncpp libyuv)
add_custom_target(webrtc-clean ${GN_EXECUTABLE} clean "${BUILD_DIR}" WORKING_DIRECTORY ${SOURCE_DIR}) add_custom_command_with_path(webrtc-clean ${GN_EXECUTABLE} clean "${BUILD_DIR}")
endif () endif ()
endfunction() endfunction()

View file

@ -1,7 +0,0 @@
function(patch_file TARGET_FILE SEARCH_REGEX REPLACE_REGEX)
file(READ ${TARGET_FILE} filedata)
string(REGEX REPLACE ${SEARCH_REGEX} ${REPLACE_REGEX} filedata "${filedata}")
file(WRITE ${TARGET_FILE} "${filedata}")
endfunction()

13
cmake/Utils.cmake Normal file
View file

@ -0,0 +1,13 @@
function(patch_file TARGET_FILE SEARCH_REGEX REPLACE_REGEX)
file(READ ${TARGET_FILE} filedata)
string(REGEX REPLACE ${SEARCH_REGEX} ${REPLACE_REGEX} filedata "${filedata}")
file(WRITE ${TARGET_FILE} "${filedata}")
endfunction()
function(prependPath DIRECTORY)
if (WIN32)
set(ENV{PATH} "${DIRECTORY};$ENV{PATH}")
else()
set(ENV{PATH} "${DIRECTORY}:$ENV{PATH}")
endif()
endfunction()

View file

@ -56,14 +56,29 @@ if (MSVC)
endif() endif()
# Install library # Install library
if (MSVC) if (WIN32)
set(LIBRARY_FILENAME_DEBUG "webrtcd.lib")
set(LIBRARY_FILENAME_RELEASE "webrtc.lib")
else()
set(LIBRARY_FILENAME_DEBUG "libwebrtcd.a")
set(LIBRARY_FILENAME_RELEASE "libwebrtc.a")
endif()
if (CMAKE_GENERATOR MATCHES "Visual Studio")
install(FILES ${WEBRTC_BUILD_DIR}/Debug/obj/webrtc.lib DESTINATION lib RENAME "webrtcd.lib" CONFIGURATIONS Debug) install(FILES ${WEBRTC_BUILD_DIR}/Debug/obj/webrtc.lib DESTINATION lib RENAME "webrtcd.lib" CONFIGURATIONS Debug)
install(FILES ${WEBRTC_BUILD_DIR}/Release/obj/webrtc.lib DESTINATION lib RENAME "webrtc.lib" CONFIGURATIONS Release) install(FILES ${WEBRTC_BUILD_DIR}/Release/obj/webrtc.lib DESTINATION lib CONFIGURATIONS Release)
else () else ()
if (CMAKE_BUILD_TYPE STREQUAL "Debug") if (CMAKE_BUILD_TYPE STREQUAL "Debug")
if (WIN32)
install(FILES ${WEBRTC_BUILD_DIR}/obj/webrtc.lib DESTINATION lib RENAME "webrtcd.lib")
else()
install(FILES ${WEBRTC_BUILD_DIR}/obj/libwebrtc.a DESTINATION lib RENAME "libwebrtcd.a") install(FILES ${WEBRTC_BUILD_DIR}/obj/libwebrtc.a DESTINATION lib RENAME "libwebrtcd.a")
endif()
else () else ()
install(FILES ${WEBRTC_BUILD_DIR}/obj/libwebrtc.a DESTINATION lib RENAME "libwebrtc.a") if (WIN32)
install(FILES ${WEBRTC_BUILD_DIR}/obj/webrtc.lib DESTINATION lib)
else()
install(FILES ${WEBRTC_BUILD_DIR}/obj/libwebrtc.a DESTINATION lib)
endif()
endif () endif ()
endif () endif ()
@ -75,7 +90,7 @@ install(FILES
DESTINATION "lib/cmake/LibWebRTC" DESTINATION "lib/cmake/LibWebRTC"
) )
if (MSVC) if (CMAKE_GENERATOR MATCHES "Visual Studio")
install(FILES LibWebRTCTargets-debug.cmake DESTINATION "lib/cmake/LibWebRTC" CONFIGURATIONS Debug) install(FILES LibWebRTCTargets-debug.cmake DESTINATION "lib/cmake/LibWebRTC" CONFIGURATIONS Debug)
install(FILES LibWebRTCTargets-release.cmake DESTINATION "lib/cmake/LibWebRTC" CONFIGURATIONS Release) install(FILES LibWebRTCTargets-release.cmake DESTINATION "lib/cmake/LibWebRTC" CONFIGURATIONS Release)
else () else ()