aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNadia Holmquist Pedersen <nadia@nhp.sh>2022-05-21 19:54:55 +0200
committerGitHub <noreply@github.com>2022-05-21 19:54:55 +0200
commit94b33c924e0524452738e077aea03ba7e8b6302f (patch)
treead2750a5ed078ca15a3d2bc07b241db064ec26f4 /src
parent6c7485d01786fe92da4c2760d23e4ee26ce872a3 (diff)
Modernize CMake build system (#1434)
These changes modernize the CMake build system to (hopefully) match newer best practices * Library linking is simpler and more automatic because of using imported targets * Multi-configuration builds should be supported (Ninja Multi-Config, Visual Studio, etc. generators) * Clean up build options using cmake_dependent_option * Let CMake do its job in more cases, like finding the math/dl libraries and detecting and enabling LTO support * Remove platform-specific kludges like the Fedora/flatpak LTO workaround and a bunch of Windows stuff * Simplify Windows static builds * Consistent formatting
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt246
-rw-r--r--src/frontend/qt_sdl/CMakeLists.txt97
2 files changed, 158 insertions, 185 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7288b54..cdb0587 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,141 +1,145 @@
-project(core)
-
set (CMAKE_CXX_STANDARD 17)
+include(FixInterfaceIncludes)
+
add_library(core STATIC
- ARCodeFile.cpp
- AREngine.cpp
- ARM.cpp
- ARM_InstrTable.h
- ARMInterpreter.cpp
- ARMInterpreter_ALU.cpp
- ARMInterpreter_Branch.cpp
- ARMInterpreter_LoadStore.cpp
- CP15.cpp
- CRC32.cpp
- DMA.cpp
- DMA_Timings.h
- DSi.cpp
- DSi_AES.cpp
- DSi_Camera.cpp
- DSi_DSP.cpp
- DSi_I2C.cpp
- DSi_NAND.cpp
- DSi_NDMA.cpp
- DSi_NWifi.cpp
- DSi_SD.cpp
- DSi_SPI_TSC.cpp
- FATStorage.cpp
- FIFO.h
- GBACart.cpp
- GPU.cpp
- GPU2D.cpp
- GPU2D_Soft.cpp
- GPU3D.cpp
- GPU3D_Soft.cpp
- melonDLDI.h
- NDS.cpp
- NDSCart.cpp
- Platform.h
- ROMList.h
- FreeBIOS.h
- RTC.cpp
- Savestate.cpp
- SPI.cpp
- SPU.cpp
- types.h
- version.h
- Wifi.cpp
- WifiAP.cpp
-
- fatfs/diskio.c
- fatfs/ff.c
- fatfs/ffsystem.c
- fatfs/ffunicode.c
- fatfs/ffconf.h
-
- sha1/sha1.c
- tiny-AES-c/aes.c
- xxhash/xxhash.c
-)
+ ARCodeFile.cpp
+ AREngine.cpp
+ ARM.cpp
+ ARM_InstrTable.h
+ ARMInterpreter.cpp
+ ARMInterpreter_ALU.cpp
+ ARMInterpreter_Branch.cpp
+ ARMInterpreter_LoadStore.cpp
+ CP15.cpp
+ CRC32.cpp
+ DMA.cpp
+ DMA_Timings.h
+ DSi.cpp
+ DSi_AES.cpp
+ DSi_Camera.cpp
+ DSi_DSP.cpp
+ DSi_I2C.cpp
+ DSi_NAND.cpp
+ DSi_NDMA.cpp
+ DSi_NWifi.cpp
+ DSi_SD.cpp
+ DSi_SPI_TSC.cpp
+ FATStorage.cpp
+ FIFO.h
+ GBACart.cpp
+ GPU.cpp
+ GPU2D.cpp
+ GPU2D_Soft.cpp
+ GPU3D.cpp
+ GPU3D_Soft.cpp
+ melonDLDI.h
+ NDS.cpp
+ NDSCart.cpp
+ Platform.h
+ ROMList.h
+ FreeBIOS.h
+ RTC.cpp
+ Savestate.cpp
+ SPI.cpp
+ SPU.cpp
+ types.h
+ version.h
+ Wifi.cpp
+ WifiAP.cpp
+
+ fatfs/diskio.c
+ fatfs/ff.c
+ fatfs/ffsystem.c
+ fatfs/ffunicode.c
+ fatfs/ffconf.h
+
+ sha1/sha1.c
+ tiny-AES-c/aes.c
+ xxhash/xxhash.c)
if (ENABLE_OGLRENDERER)
- target_sources(core PRIVATE
- GPU_OpenGL.cpp
- GPU_OpenGL_shaders.h
- GPU3D_OpenGL.cpp
- GPU3D_OpenGL_shaders.h
- OpenGLSupport.cpp
- )
+ target_sources(core PRIVATE
+ GPU_OpenGL.cpp
+ GPU_OpenGL_shaders.h
+ GPU3D_OpenGL.cpp
+ GPU3D_OpenGL_shaders.h
+ OpenGLSupport.cpp)
endif()
if (ENABLE_JIT)
- enable_language(ASM)
-
- target_sources(core PRIVATE
- ARM_InstrInfo.cpp
-
- ARMJIT.cpp
- ARMJIT_Memory.cpp
-
- dolphin/CommonFuncs.cpp
- )
-
- if (ARCHITECTURE STREQUAL x86_64)
- target_sources(core PRIVATE
- dolphin/x64ABI.cpp
- dolphin/x64CPUDetect.cpp
- dolphin/x64Emitter.cpp
-
- ARMJIT_x64/ARMJIT_Compiler.cpp
- ARMJIT_x64/ARMJIT_ALU.cpp
- ARMJIT_x64/ARMJIT_LoadStore.cpp
- ARMJIT_x64/ARMJIT_Branch.cpp
-
- ARMJIT_x64/ARMJIT_Linkage.S
- )
- endif()
- if (ARCHITECTURE STREQUAL ARM64)
- target_sources(core PRIVATE
- dolphin/Arm64Emitter.cpp
- dolphin/MathUtil.cpp
-
- ARMJIT_A64/ARMJIT_Compiler.cpp
- ARMJIT_A64/ARMJIT_ALU.cpp
- ARMJIT_A64/ARMJIT_LoadStore.cpp
- ARMJIT_A64/ARMJIT_Branch.cpp
-
- ARMJIT_A64/ARMJIT_Linkage.S
- )
- endif()
+ enable_language(ASM)
+
+ target_sources(core PRIVATE
+ ARM_InstrInfo.cpp
+
+ ARMJIT.cpp
+ ARMJIT_Memory.cpp
+
+ dolphin/CommonFuncs.cpp)
+
+ if (ARCHITECTURE STREQUAL x86_64)
+ target_sources(core PRIVATE
+ dolphin/x64ABI.cpp
+ dolphin/x64CPUDetect.cpp
+ dolphin/x64Emitter.cpp
+
+ ARMJIT_x64/ARMJIT_Compiler.cpp
+ ARMJIT_x64/ARMJIT_ALU.cpp
+ ARMJIT_x64/ARMJIT_LoadStore.cpp
+ ARMJIT_x64/ARMJIT_Branch.cpp
+
+ ARMJIT_x64/ARMJIT_Linkage.S)
+ endif()
+ if (ARCHITECTURE STREQUAL ARM64)
+ target_sources(core PRIVATE
+ dolphin/Arm64Emitter.cpp
+ dolphin/MathUtil.cpp
+
+ ARMJIT_A64/ARMJIT_Compiler.cpp
+ ARMJIT_A64/ARMJIT_ALU.cpp
+ ARMJIT_A64/ARMJIT_LoadStore.cpp
+ ARMJIT_A64/ARMJIT_Branch.cpp
+
+ ARMJIT_A64/ARMJIT_Linkage.S)
+ endif()
endif()
add_subdirectory(teakra EXCLUDE_FROM_ALL)
-target_link_libraries(core teakra)
+target_link_libraries(core PRIVATE teakra)
+find_library(m MATH_LIBRARY)
+
+if (MATH_LIBRARY)
+ target_link_libraries(core PRIVATE ${MATH_LIBRARY})
+endif()
if (ENABLE_OGLRENDERER)
find_package(PkgConfig REQUIRED)
- pkg_check_modules(EPOXY REQUIRED epoxy)
-
- target_include_directories(core PRIVATE ${EPOXY_INCLUDE_DIRS})
- if (WIN32)
- target_link_libraries(core ole32 comctl32 ws2_32 ${EPOXY_LIBRARIES})
- elseif (APPLE)
- target_link_libraries(core ${EPOXY_LIBRARIES})
- else()
- target_link_libraries(core rt ${EPOXY_LIBRARIES})
+ pkg_check_modules(Epoxy REQUIRED IMPORTED_TARGET epoxy)
+ fix_interface_includes(PkgConfig::Epoxy)
+
+ target_link_libraries(core PUBLIC PkgConfig::Epoxy)
+
+ target_compile_definitions(core PUBLIC OGLRENDERER_ENABLED)
+endif()
+
+if (ENABLE_JIT)
+ target_compile_definitions(core PUBLIC JIT_ENABLED)
+
+
+ if (ENABLE_JIT_PROFILING)
+ include(cmake/FindVTune.cmake)
+ add_definitions(-DJIT_PROFILING_ENABLED)
endif()
-else()
- if (WIN32)
- target_link_libraries(core ole32 comctl32 ws2_32)
- elseif (APPLE)
- target_link_libraries(core)
- else()
- target_link_libraries(core rt)
- endif()
+endif()
+
+if (WIN32)
+ target_link_libraries(core PRIVATE ole32 comctl32 ws2_32)
+elseif(NOT APPLE)
+ target_link_libraries(core PRIVATE rt)
endif()
if (ENABLE_JIT_PROFILING)
- target_link_libraries(core jitprofiling)
+ target_link_libraries(core PRIVATE jitprofiling)
endif()
diff --git a/src/frontend/qt_sdl/CMakeLists.txt b/src/frontend/qt_sdl/CMakeLists.txt
index ec88026..6f95cc5 100644
--- a/src/frontend/qt_sdl/CMakeLists.txt
+++ b/src/frontend/qt_sdl/CMakeLists.txt
@@ -1,10 +1,12 @@
-project(qt_sdl)
+include(CMakeDependentOption)
-SET(SOURCES_QT_SDL
+include(FixInterfaceIncludes)
+
+set(SOURCES_QT_SDL
main.cpp
main_shaders.h
CheatsDialog.cpp
- Config.cpp
+ Config.cpp
EmuSettingsDialog.cpp
PowerManagement/PowerManagementDialog.cpp
PowerManagement/resources/battery.qrc
@@ -28,9 +30,9 @@ SET(SOURCES_QT_SDL
font.h
Platform.cpp
QPathInput.h
- ROMManager.cpp
- SaveManager.cpp
-
+ ROMManager.cpp
+ SaveManager.cpp
+
ArchiveUtil.h
ArchiveUtil.cpp
@@ -40,7 +42,7 @@ SET(SOURCES_QT_SDL
../mic_blow.h
${CMAKE_SOURCE_DIR}/res/melon.qrc
-)
+ )
if (APPLE)
option(USE_QT6 "Build using Qt 6 instead of 5" ON)
@@ -54,27 +56,9 @@ if (WIN32)
endif()
if (USE_QT6)
- if (BUILD_STATIC AND QT6_STATIC_DIR)
- set(QT6_STATIC_BASE ${QT6_STATIC_DIR}/lib/cmake/Qt6)
- set(Qt6_DIR ${QT6_STATIC_BASE})
- set(Qt6Core_DIR ${QT6_STATIC_BASE}Core)
- set(Qt6Gui_DIR ${QT6_STATIC_BASE}Gui)
- set(Qt6Widgets_DIR ${QT6_STATIC_BASE}Widgets)
- set(Qt6Network_DIR ${QT6_STATIC_BASE}Network)
- set(Qt6OpenGL_DIR ${QT6_STATIC_BASE}OpenGL)
- set(Qt6OpenGLWidgets_DIR ${QT6_STATIC_BASE}OpenGLWidgets)
- endif()
find_package(Qt6 COMPONENTS Core Gui Widgets Network OpenGL OpenGLWidgets REQUIRED)
set(QT_LINK_LIBS Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::OpenGL Qt6::OpenGLWidgets)
else()
- if (BUILD_STATIC AND QT5_STATIC_DIR)
- set(QT5_STATIC_BASE ${QT5_STATIC_DIR}/lib/cmake/Qt5)
- set(Qt5_DIR ${QT5_STATIC_BASE})
- set(Qt5Core_DIR ${QT5_STATIC_BASE}Core)
- set(Qt5Gui_DIR ${QT5_STATIC_BASE}Gui)
- set(Qt5Widgets_DIR ${QT5_STATIC_BASE}Widgets)
- set(Qt5Network_DIR ${QT5_STATIC_BASE}Network)
- endif()
find_package(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
set(QT_LINK_LIBS Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
endif()
@@ -83,63 +67,48 @@ set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
+if (BUILD_STATIC)
+ list(APPEND PKG_CONFIG_EXECUTABLE "--static")
+endif()
+
find_package(Threads REQUIRED)
find_package(PkgConfig REQUIRED)
-find_package(Iconv REQUIRED)
-pkg_check_modules(SDL2 REQUIRED sdl2)
-pkg_check_modules(SLIRP REQUIRED slirp)
-pkg_check_modules(LIBARCHIVE REQUIRED libarchive)
-add_compile_definitions(ARCHIVE_SUPPORT_ENABLED)
-
-if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL Release))
- add_executable(melonDS WIN32 ${SOURCES_QT_SDL})
-else()
- add_executable(melonDS ${SOURCES_QT_SDL})
-endif()
+pkg_check_modules(SDL2 REQUIRED IMPORTED_TARGET sdl2)
+pkg_check_modules(Slirp REQUIRED IMPORTED_TARGET slirp)
+pkg_check_modules(LibArchive REQUIRED IMPORTED_TARGET libarchive)
-target_link_libraries(melonDS ${CMAKE_THREAD_LIBS_INIT})
+fix_interface_includes(PkgConfig::SDL2 PkgConfig::Slirp PkgConfig::LibArchive)
-target_include_directories(melonDS PRIVATE ${SDL2_INCLUDE_DIRS} ${SDL2_PREFIX}/include ${SLIRP_INCLUDE_DIRS} ${LIBARCHIVE_INCLUDE_DIRS})
-target_link_directories(melonDS PRIVATE ${SDL2_LIBRARY_DIRS} ${SLIRP_LIBRARY_DIRS})
-target_link_directories(melonDS PRIVATE ${LIBARCHIVE_LIBRARY_DIRS})
+add_compile_definitions(ARCHIVE_SUPPORT_ENABLED)
-target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
-target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
-target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../..")
-target_link_libraries(melonDS core)
+add_executable(melonDS ${SOURCES_QT_SDL})
if (BUILD_STATIC)
- target_link_libraries(melonDS -static ${SDL2_STATIC_LIBRARIES} ${SLIRP_STATIC_LIBRARIES} ${LIBARCHIVE_STATIC_LIBRARIES})
qt_import_plugins(melonDS INCLUDE Qt::QSvgPlugin)
-else()
- target_link_libraries(melonDS ${SDL2_LIBRARIES} ${SLIRP_LIBRARIES} ${LIBARCHIVE_LIBRARIES})
+ target_link_options(melonDS PRIVATE -static)
endif()
-if (NOT Iconv_IS_BUILT_IN)
- target_link_libraries(melonDS ${Iconv_LIBRARIES})
-endif()
+target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
+target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
+target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../..")
+target_link_libraries(melonDS PRIVATE core)
+target_link_libraries(melonDS PRIVATE PkgConfig::SDL2 PkgConfig::Slirp PkgConfig::LibArchive)
+target_link_libraries(melonDS PRIVATE ${QT_LINK_LIBS} ${CMAKE_DL_LIBS})
if (UNIX)
option(PORTABLE "Make a portable build that looks for its configuration in the current directory" OFF)
- target_link_libraries(melonDS ${QT_LINK_LIBS})
- if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
- target_link_libraries(melonDS dl)
- endif()
elseif (WIN32)
option(PORTABLE "Make a portable build that looks for its configuration in the current directory" ON)
+
configure_file("${CMAKE_SOURCE_DIR}/res/melon.rc.in" "${CMAKE_SOURCE_DIR}/melon.rc")
target_sources(melonDS PUBLIC "${CMAKE_SOURCE_DIR}/melon.rc")
- target_link_libraries(melonDS comctl32 d2d1 dwrite uxtheme ws2_32 iphlpapi gdi32)
- if (BUILD_STATIC)
- target_link_libraries(melonDS imm32 winmm version setupapi -static z zstd ${QT_LINK_LIBS})
- else()
- target_link_libraries(melonDS ${QT_LINK_LIBS})
- endif()
+ target_link_libraries(melonDS PRIVATE ws2_32 iphlpapi)
+ set_target_properties(melonDS PROPERTIES WIN32_EXECUTABLE $<CONFIG:Release>)
endif()
if (PORTABLE)
- add_definitions(-DPORTABLE)
+ target_compile_definitions(melonDS PRIVATE PORTABLE)
endif()
if (APPLE)
@@ -152,7 +121,7 @@ if (APPLE)
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/res/melon.plist.in
OUTPUT_NAME melonDS
RESOURCE "${RESOURCE_FILES}")
-
+
option(MACOS_BUNDLE_LIBS "Bundle libraries with the app on macOS" OFF)
option(MACOS_BUILD_DMG "Build DMG image of the macOS application bundle" OFF)
@@ -170,8 +139,8 @@ endif()
if (UNIX AND NOT APPLE)
foreach(SIZE 16 32 48 64 128 256)
install(FILES ${CMAKE_SOURCE_DIR}/res/icon/melon_${SIZE}x${SIZE}.png
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${SIZE}x${SIZE}/apps
- RENAME net.kuribo64.melonDS.png)
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${SIZE}x${SIZE}/apps
+ RENAME net.kuribo64.melonDS.png)
endforeach()
install(FILES ${CMAKE_SOURCE_DIR}/res/net.kuribo64.melonDS.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)