[Build] Share wx-related targets configuration

Breaking the main wx target down to multiple libraries had the side
effect that many build options were not properly applied to libraries.
This fixes the issue by having a common configuration function in CMake
to share most of the configuration between all of the wx-related
targets.
This commit is contained in:
Fabrice de Gans 2024-05-09 11:51:22 -07:00 committed by Fabrice de Gans
parent 55c1477d69
commit a48625855b
3 changed files with 101 additions and 47 deletions

View File

@ -179,13 +179,17 @@ if(CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg")
set(wxWidgets_DIR "${VCPKG_ROOT}/installed/${VCPKG_TARGET_TRIPLET}/share/wxwidgets") set(wxWidgets_DIR "${VCPKG_ROOT}/installed/${VCPKG_TARGET_TRIPLET}/share/wxwidgets")
endif() endif()
set(ENABLE_OPENGL TRUE)
find_package(wxWidgets COMPONENTS xrc xml html adv net core base gl ${wx_find_extra}) find_package(wxWidgets COMPONENTS xrc xml html adv net core base gl ${wx_find_extra})
if(NOT wxWidgets_FOUND) if(NOT wxWidgets_FOUND)
find_package(wxWidgets COMPONENTS xrc xml html adv net core base ${wx_find_extra} REQUIRED) find_package(wxWidgets COMPONENTS xrc xml html adv net core base ${wx_find_extra} REQUIRED)
target_compile_definitions(visualboyadvance-m PRIVATE NO_OGL) set(ENABLE_OPENGL FALSE)
endif() endif()
# Find OpenAL (required).
find_package(OpenAL REQUIRED)
# Workaround of static liblzma not being found on MSYS2. # Workaround of static liblzma not being found on MSYS2.
if(VBAM_STATIC AND MSYS) if(VBAM_STATIC AND MSYS)
unset(cleaned_up_wx_libs) unset(cleaned_up_wx_libs)
@ -207,25 +211,101 @@ foreach(DEF ${wxWidgets_DEFINITIONS})
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D${DEF}") list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D${DEF}")
endforeach() endforeach()
function(configure_wx_deps target) # Configure common settings for wx-based targets, like linking, include
# directories, compile options, and definitions.
function(configure_wx_target target)
get_target_property(target_type ${target} TYPE) get_target_property(target_type ${target} TYPE)
if(target_type STREQUAL "EXECUTABLE") if(target_type STREQUAL "EXECUTABLE")
target_link_libraries(${target} ${wxWidgets_LIBRARIES}) set(target_is_executable TRUE)
target_include_directories(${target} PRIVATE ${wxWidgets_INCLUDE_DIRS})
target_compile_options(${target} PRIVATE ${wxWidgets_CXX_FLAGS})
target_compile_definitions(${target} PRIVATE ${wxWidgets_DEFINITIONS})
if(CMAKE_BUILD_TYPE MATCHES "^(Debug|RelWithDebInfo)$")
target_compile_definitions(${target} PRIVATE ${wxWidgets_DEFINITIONS_DEBUG})
endif()
else() else()
target_link_libraries(${target} PUBLIC ${wxWidgets_LIBRARIES}) set(target_is_executable FALSE)
target_include_directories(${target} PUBLIC ${wxWidgets_INCLUDE_DIRS})
target_compile_options(${target} PUBLIC ${wxWidgets_CXX_FLAGS})
target_compile_definitions(${target} PUBLIC ${wxWidgets_DEFINITIONS})
if(CMAKE_BUILD_TYPE MATCHES "^(Debug|RelWithDebInfo)$")
target_compile_definitions(${target} PUBLIC ${wxWidgets_DEFINITIONS_DEBUG})
endif() endif()
endif()
function(_add_link_libraries)
if(${target_is_executable})
target_link_libraries(${target} ${ARGN})
else()
target_link_libraries(${target} PUBLIC ${ARGN})
endif()
endfunction()
function(_add_include_directories)
if(${target_is_executable})
target_include_directories(${target} PRIVATE ${ARGN})
else()
target_include_directories(${target} PUBLIC ${ARGN})
endif()
endfunction()
function(_add_compile_options)
if(${target_is_executable})
target_compile_options(${target} PRIVATE ${ARGN})
else()
target_compile_options(${target} PUBLIC ${ARGN})
endif()
endfunction()
function(_add_compile_definitions)
if(${target_is_executable})
target_compile_definitions(${target} PRIVATE ${ARGN})
else()
target_compile_definitions(${target} PUBLIC ${ARGN})
endif()
endfunction()
# Nonstd.
_add_link_libraries(nonstd-lib)
_add_include_directories(${NONSTD_INCLUDE_DIR})
# wxWidgets.
_add_link_libraries(${wxWidgets_LIBRARIES})
_add_include_directories(${wxWidgets_INCLUDE_DIRS})
_add_compile_options(${wxWidgets_CXX_FLAGS})
_add_compile_definitions(${wxWidgets_DEFINITIONS})
if(CMAKE_BUILD_TYPE MATCHES "^(Debug|RelWithDebInfo)$")
_add_compile_definitions(${wxWidgets_DEFINITIONS_DEBUG})
endif()
# OpenAL.
if(OPENAL_STATIC)
_add_compile_definitions(AL_LIBTYPE_STATIC)
endif()
_add_include_directories(${OPENAL_INCLUDE_DIR})
_add_link_libraries(${OPENAL_LIBRARY})
# XAudio2.
if(ENABLE_XAUDIO2)
_add_compile_definitions(VBAM_ENABLE_XAUDIO2)
endif()
# FAudio.
if(ENABLE_FAUDIO)
_add_compile_definitions(VBAM_ENABLE_FAUDIO)
if(MSVC)
_add_link_libraries(FAudio::FAudio)
else()
_add_link_libraries(FAudio)
if(WIN32)
_add_link_libraries(dxguid uuid winmm ole32 advapi32 user32 mfplat mfreadwrite mfuuid propsys)
endif()
endif()
endif()
# Direct3D.
if(NOT ENABLE_DIRECT3D)
_add_compile_definitions(NO_D3D)
endif()
# SDL2.
_add_link_libraries(${VBAM_SDL2_LIBS})
# OpenGL.
if(ENABLE_OPENGL)
_add_link_libraries(${OPENGL_LIBRARIES})
else()
_add_compile_definitions(NO_OGL)
endif()
endfunction() endfunction()
# Sub-projects. # Sub-projects.
@ -242,11 +322,10 @@ add_executable(
) )
target_sources(visualboyadvance-m PRIVATE ${VBAM_WX_COMMON} ${VBAM_ICON_PATH}) target_sources(visualboyadvance-m PRIVATE ${VBAM_WX_COMMON} ${VBAM_ICON_PATH})
target_include_directories(visualboyadvance-m PRIVATE ${NONSTD_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS}) target_include_directories(visualboyadvance-m PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries( target_link_libraries(
visualboyadvance-m visualboyadvance-m
nonstd-lib
vbam-core vbam-core
vbam-components-draw-text vbam-components-draw-text
vbam-components-filters vbam-components-filters
@ -254,8 +333,6 @@ target_link_libraries(
vbam-components-filters-interframe vbam-components-filters-interframe
vbam-components-user-config vbam-components-user-config
vbam-wx-config vbam-wx-config
${OPENGL_LIBRARIES}
${VBAM_SDL2_LIBS}
) )
# adjust link command when making a static binary for gcc # adjust link command when making a static binary for gcc
@ -362,40 +439,17 @@ if(CMAKE_COMPILER_IS_GNUCXX AND VBAM_STATIC)
endif() endif()
endif() endif()
# OpenAL.
find_package(OpenAL REQUIRED)
if(OPENAL_STATIC)
target_compile_definitions(visualboyadvance-m PRIVATE AL_LIBTYPE_STATIC)
endif()
target_include_directories(visualboyadvance-m PRIVATE ${OPENAL_INCLUDE_DIR})
target_link_libraries(visualboyadvance-m ${OPENAL_LIBRARY})
# XAudio2. # XAudio2.
if(ENABLE_XAUDIO2) if(ENABLE_XAUDIO2)
target_sources(visualboyadvance-m PRIVATE audio/internal/xaudio2.cpp) target_sources(visualboyadvance-m PRIVATE audio/internal/xaudio2.cpp)
target_compile_definitions(visualboyadvance-m PRIVATE VBAM_ENABLE_XAUDIO2)
endif()
# Direct3D.
if(NOT ENABLE_DIRECT3D)
target_compile_definitions(visualboyadvance-m PRIVATE NO_D3D)
endif() endif()
# FAudio. # FAudio.
if(ENABLE_FAUDIO) if(ENABLE_FAUDIO)
target_sources(visualboyadvance-m PRIVATE audio/internal/faudio.cpp) target_sources(visualboyadvance-m PRIVATE audio/internal/faudio.cpp)
if(MSVC)
target_link_libraries(visualboyadvance-m FAudio::FAudio)
else()
target_link_libraries(visualboyadvance-m FAudio)
if(WIN32)
target_link_libraries(visualboyadvance-m dxguid uuid winmm ole32 advapi32 user32 mfplat mfreadwrite mfuuid propsys)
endif()
endif()
target_compile_definitions(visualboyadvance-m PRIVATE VBAM_ENABLE_FAUDIO)
endif() endif()
configure_wx_deps(visualboyadvance-m) configure_wx_target(visualboyadvance-m)
# we make some direct gtk/gdk calls on linux and such # we make some direct gtk/gdk calls on linux and such
# so need to link the gtk that wx was built with # so need to link the gtk that wx was built with

View File

@ -67,8 +67,7 @@ target_link_libraries(vbam-wx-config
vbam-core vbam-core
) )
configure_wx_deps(vbam-wx-config) configure_wx_target(vbam-wx-config)
target_include_directories(vbam-wx-config PUBLIC ${NONSTD_INCLUDE_DIR})
if (BUILD_TESTING) if (BUILD_TESTING)
add_executable(vbam-wx-config-tests add_executable(vbam-wx-config-tests
@ -85,6 +84,7 @@ if (BUILD_TESTING)
GTest::gtest_main GTest::gtest_main
) )
configure_wx_target(vbam-wx-config-tests)
if (NOT CMAKE_CROSSCOMPILING) if (NOT CMAKE_CROSSCOMPILING)
gtest_discover_tests(vbam-wx-config-tests) gtest_discover_tests(vbam-wx-config-tests)
endif() endif()

View File

@ -12,4 +12,4 @@ target_sources(vbam-wx-fake-opts
fake_opts.cpp fake_opts.cpp
) )
configure_wx_deps(vbam-wx-fake-opts) configure_wx_target(vbam-wx-fake-opts)