diff options
author | Nik Reist <zeroability@tutanota.com> | 2020-06-06 13:01:46 +0300 |
---|---|---|
committer | Davide Beatrici <git@davidebeatrici.dev> | 2020-07-11 20:37:21 +0300 |
commit | 13e61b4dc317e6b94962d57f4e1de46d26a5ebb3 (patch) | |
tree | e5a2cc3bf3aaae656f19ee2f5c90bbba855d66dc /overlay | |
parent | 2ee48b07c0a446547727941bf3bda0d755cfb95c (diff) |
overlay: build 32 bit library also in 64 bit builds on Windows
GCC and Clang provide the "-m32" and "-m64" options, which tell the compiler to build as 32 bit and 64 bit, respectively.
Unfortunately MSVC doesn't provide similar options, thus this commit converts "overlay" from a subdirectory to a project.
If the build is 32 bit, the project is processed a single time and compiles a 32 bit library.
If the build is 64 bit, the project is processed two times and compiles a 64 bit and a 32 bit library.
Diffstat (limited to 'overlay')
-rw-r--r-- | overlay/CMakeLists.txt | 90 | ||||
-rw-r--r-- | overlay/overlay_exe/CMakeLists.txt | 25 | ||||
-rw-r--r-- | overlay/scripts/build_overlay_xcompile.cmd | 14 |
3 files changed, 112 insertions, 17 deletions
diff --git a/overlay/CMakeLists.txt b/overlay/CMakeLists.txt index 47545e665..e95006ce0 100644 --- a/overlay/CMakeLists.txt +++ b/overlay/CMakeLists.txt @@ -2,8 +2,20 @@ # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at <https://www.mumble.info/LICENSE>. +option(BUILD_OVERLAY_XCOMPILE "Build an x86 overlay" OFF) -add_subdirectory(overlay_exe) +if(BUILD_OVERLAY_XCOMPILE) + cmake_minimum_required(VERSION 3.15) + + set(version "1.4.0" CACHE STRING "Project version") + + project(overlay_xcompile + VERSION ${version} + LANGUAGES CXX + ) + + include("${PARENT_SOURCE_DIR}/cmake/compiler.cmake") +endif() set(DX11_PIXEL_SHADERS "overlay11.ps") set(DX11_VERTEX_SHADERS "overlay11.vs") @@ -16,7 +28,7 @@ set(COMPILED_EFFECTS "overlay.hex") set(OVERLAY_RC "mumble_ol.rc") # We save the output name in a variable because it's used by configure_file() -if(64_BIT) +if(64_BIT AND NOT BUILD_OVERLAY_XCOMPILE) set(OUTPUT_NAME "mumble_ol_x64") else() set(OUTPUT_NAME "mumble_ol") @@ -63,8 +75,6 @@ add_custom_target(build-overlay-files ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${COMPILED_DX11_PIXEL_SHADERS}" ) -target_include_directories(overlay PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) - add_dependencies(overlay build-overlay-files) target_sources(overlay @@ -93,14 +103,31 @@ target_sources(overlay "overlay_whitelist.h" "${CMAKE_CURRENT_BINARY_DIR}/${OVERLAY_RC}" - "${3RDPARTY_DIR}/GL/glext.h" ) -set_property(TARGET overlay PROPERTY OUTPUT_NAME ${OUTPUT_NAME}) -set_property(TARGET overlay PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set_target_properties(overlay PROPERTIES OUTPUT_NAME ${OUTPUT_NAME}) + +find_package(Boost REQUIRED) -find_pkg(Boost REQUIRED) -target_include_directories(overlay PRIVATE ${Boost_INCLUDE_DIRS}) +if(BUILD_OVERLAY_XCOMPILE) + set_target_properties(overlay PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${MUMBLE_BINARY_DIR}) + + target_include_directories(overlay + PRIVATE + ${Boost_INCLUDE_DIRS} + ${PARENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ) +else() + set_target_properties(overlay PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + + target_include_directories(overlay + PRIVATE + ${Boost_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ) +endif() if(64_BIT) add_subdirectory("${3RDPARTY_DIR}/minhook-src" "${CMAKE_CURRENT_BINARY_DIR}/minhook" EXCLUDE_FROM_ALL) @@ -110,5 +137,48 @@ endif() if(MSVC) # Set "/MT" for release builds and "/MTd" for debug ones. - set_property(TARGET overlay PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") + set_target_properties(overlay PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") endif() + +if(64_BIT AND MSVC) + include(ExternalProject) + + if(CMAKE_GENERATOR MATCHES "Visual Studio") + ExternalProject_Add(overlay_xcompile + DOWNLOAD_COMMAND "" + CMAKE_GENERATOR ${CMAKE_GENERATOR} + CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + "-DVCPKG_TARGET_TRIPLET=x86-windows-static-md" + "-DPARENT_SOURCE_DIR=${CMAKE_SOURCE_DIR}" + "-DMUMBLE_SOURCE_DIR=${CMAKE_SOURCE_DIR}/src/mumble" + "-DMUMBLE_BINARY_DIR=${CMAKE_BINARY_DIR}" + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + "-DBUILD_OVERLAY_XCOMPILE=ON" + "-Dsymbols=${symbols}" + ${CMAKE_SOURCE_DIR}/overlay + CMAKE_GENERATOR_PLATFORM "Win32" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/overlay/overlay_xcompile-prefix + INSTALL_COMMAND "" + ) + else() + ExternalProject_Add(overlay_xcompile + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_SOURCE_DIR}/overlay/scripts/build_overlay_xcompile.cmd + -G ${CMAKE_GENERATOR} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + "-DVCPKG_TARGET_TRIPLET=x86-windows-static-md" + "-DPARENT_SOURCE_DIR=${CMAKE_SOURCE_DIR}" + "-DMUMBLE_SOURCE_DIR=${CMAKE_SOURCE_DIR}/src/mumble" + "-DMUMBLE_BINARY_DIR=${CMAKE_BINARY_DIR}" + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + "-DBUILD_OVERLAY_XCOMPILE=ON" + "-Dsymbols=${symbols}" + ${CMAKE_SOURCE_DIR}/overlay + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/overlay/overlay_xcompile-prefix + INSTALL_COMMAND "" + ) + endif() +endif() + +add_subdirectory(overlay_exe) diff --git a/overlay/overlay_exe/CMakeLists.txt b/overlay/overlay_exe/CMakeLists.txt index 53c71e80b..f3fc8e35c 100644 --- a/overlay/overlay_exe/CMakeLists.txt +++ b/overlay/overlay_exe/CMakeLists.txt @@ -8,13 +8,15 @@ set(OVERLAY_EXE_RC "overlay_exe.rc") add_definitions("-DUNICODE" "-DWIN32_LEAN_AND_MEAN") # We save the output name in a variable because it's used by configure_file() -if(64_BIT) +if(64_BIT AND NOT BUILD_OVERLAY_XCOMPILE) set(OUTPUT_NAME "mumble_ol_helper_x64") else() set(OUTPUT_NAME "mumble_ol_helper") endif() -get_target_property(MUMBLE_SOURCE_DIR mumble SOURCE_DIR) +if(NOT BUILD_OVERLAY_XCOMPILE) + get_target_property(MUMBLE_SOURCE_DIR mumble SOURCE_DIR) +endif() configure_file(${OVERLAY_EXE_RC} ${CMAKE_CURRENT_BINARY_DIR}) @@ -26,13 +28,22 @@ add_executable(overlay_exe WIN32 "${CMAKE_CURRENT_BINARY_DIR}/${OVERLAY_EXE_RC}" ) -set_property(TARGET overlay_exe PROPERTY OUTPUT_NAME ${OUTPUT_NAME}) -set_property(TARGET overlay_exe PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set_target_properties(overlay_exe PROPERTIES OUTPUT_NAME ${OUTPUT_NAME}) + +if(BUILD_OVERLAY_XCOMPILE) + set_target_properties(overlay_exe PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${MUMBLE_BINARY_DIR}) + + target_include_directories(overlay_exe PRIVATE ${PARENT_SOURCE_DIR}/overlay) +else() + set_target_properties(overlay_exe PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + + target_include_directories(overlay_exe PRIVATE ${CMAKE_SOURCE_DIR}/overlay) +endif() if(MSVC) - set_property(TARGET overlay_exe PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") + set_target_properties(overlay_exe PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") endif() -find_library(LIB_SHLWAPI "shlwapi") -target_link_libraries(overlay_exe PRIVATE ${LIB_SHLWAPI}) +add_dependencies(overlay_exe overlay) +target_link_libraries(overlay_exe PRIVATE Shlwapi.lib) diff --git a/overlay/scripts/build_overlay_xcompile.cmd b/overlay/scripts/build_overlay_xcompile.cmd new file mode 100644 index 000000000..622dacadd --- /dev/null +++ b/overlay/scripts/build_overlay_xcompile.cmd @@ -0,0 +1,14 @@ +@echo off + +for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do ( + set InstallDir=%%i +) + +if exist "%InstallDir%\Common7\Tools\vsdevcmd.bat" ( + "%InstallDir%\Common7\Tools\vsdevcmd.bat" -arch=x86 -host_arch=x64 + cmake %* + cmake --build . + exit +) + +exit |