From 94b33c924e0524452738e077aea03ba7e8b6302f Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Sat, 21 May 2022 19:54:55 +0200 Subject: 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 --- CMakeLists.txt | 124 ++++++++++++++++++++------------------------------------- 1 file changed, 43 insertions(+), 81 deletions(-) (limited to 'CMakeLists.txt') diff --git a/CMakeLists.txt b/CMakeLists.txt index 60dac08..74aaf42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,43 +1,38 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.15) -include(CheckSymbolExists) -include(CheckLibraryExists) - -cmake_policy(VERSION 3.13) +cmake_policy(VERSION 3.15) if (POLICY CMP0076) cmake_policy(SET CMP0076 NEW) endif() -set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") +set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) -project(melonDS CXX) +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) + +project(melonDS + VERSION 0.9.4 + DESCRIPTION "DS emulator, sorta" + HOMEPAGE_URL "https://melonds.kuribo64.net" + LANGUAGES C CXX) + +include(CheckSymbolExists) +include(CheckLibraryExists) +include(CMakeDependentOption) +include(CheckIPOSupported) + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) -set(MELONDS_VERSION "0.9.4") -add_compile_definitions(MELONDS_VERSION="${MELONDS_VERSION}") -string(REPLACE "." ";" VERSION_LIST ${MELONDS_VERSION}) -# For the melon.rc file used on Windows -list(GET VERSION_LIST 0 MELONDS_VERSION_MAJOR) -list(GET VERSION_LIST 1 MELONDS_VERSION_MINOR) -# Check if melonDS version is three digits or two digits -list(LENGTH VERSION_LIST MELONDS_VER_LEN) -if (${MELONDS_VER_LEN} GREATER 2) - list(GET VERSION_LIST 2 MELONDS_VERSION_PATCH) -else() - set(MELONDS_VERSION_PATCH 0) -endif() - +add_compile_definitions(MELONDS_VERSION="${melonDS_VERSION}") -check_library_exists(m pow "" LIBM) -if(LIBM) - link_libraries(m) -endif() - -if (NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() function(detect_architecture symbol arch) @@ -61,74 +56,41 @@ detect_architecture("__i386__" x86) detect_architecture("__arm__" ARM) detect_architecture("__aarch64__" ARM64) -if (ARCHITECTURE STREQUAL x86_64 OR ARCHITECTURE STREQUAL ARM64) - option(ENABLE_JIT "Enable x64 JIT recompiler" ON) -endif() - -if (ENABLE_JIT) - add_definitions(-DJIT_ENABLED) - - option(ENABLE_JIT_PROFILING "Enable JIT profiling with VTune" OFF) +cmake_dependent_option(ENABLE_JIT "Enable JIT recompiler" ON + "ARCHITECTURE STREQUAL x86_64 OR ARCHITECTURE STREQUAL ARM64" OFF) +cmake_dependent_option(ENABLE_JIT_PROFILING "Enable JIT profiling with VTune" OFF "ENABLE_JIT" OFF) +option(ENABLE_OGLRENDERER "Enable OpenGL renderer" ON) - if (ENABLE_JIT_PROFILING) - include(cmake/FindVTune.cmake) - add_definitions(-DJIT_PROFILING_ENABLED) - endif() -endif() +check_ipo_supported(RESULT IPO_SUPPORTED) +cmake_dependent_option(ENABLE_LTO_RELEASE "Enable link-time optimizations for release builds" ON "IPO_SUPPORTED" OFF) +cmake_dependent_option(ENABLE_LTO "Enable link-time optimizations" OFF "IPO_SUPPORTED" OFF) -if (CMAKE_BUILD_TYPE STREQUAL Release) - option(ENABLE_LTO "Enable link-time optimization" ON) -else() - option(ENABLE_LTO "Enable link-time optimization" OFF) +if (ENABLE_LTO_RELEASE) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) endif() -option(ENABLE_OGLRENDERER "Enable OpenGL renderer" ON) - -if (ENABLE_OGLRENDERER) - add_definitions(-DOGLRENDERER_ENABLED) +if (ENABLE_LTO) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() -if (CMAKE_BUILD_TYPE STREQUAL Debug) - add_compile_options(-Og) -endif() +set(CMAKE_C_FLAGS_DEBUG "-Og") +set(CMAKE_CXX_FLAGS_DEBUG "-Og") +set(CMAKE_C_FLAGS_RELEASE "-O3") +set(CMAKE_CXX_FLAGS_RELEASE "-O3") -if (CMAKE_BUILD_TYPE STREQUAL Release) - add_compile_options(-O3) - if (NOT APPLE) - add_link_options(-s) - endif() +if (NOT APPLE) + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s") endif() if (WIN32) - option(BUILD_STATIC "Statically link dependencies" OFF) + option(BUILD_STATIC "Statically link dependencies" OFF) endif() if (BUILD_STATIC AND WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) endif() -if (ENABLE_LTO) - if (WIN32 OR APPLE) - add_compile_options(-flto) - add_link_options(-flto) - else() - add_compile_options(-flto -fPIC) - add_link_options(-flto -fuse-linker-plugin -pie) - endif() - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(CMAKE_AR "gcc-ar") - set(CMAKE_RANLIB "gcc-ranlib") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - find_program(LLD NAMES ld.lld ld64.lld lld-link) - if (NOT LLD STREQUAL "LLD-NOTFOUND") - add_link_options(-fuse-ld=lld) - endif() - if (NOT APPLE) - set(CMAKE_AR "llvm-ar") - set(CMAKE_RANLIB "llvm-ranlib") - endif() - endif() -endif() +set(CMAKE_POSITION_INDEPENDENT_CODE ON) find_program(CCACHE "ccache") if (CCACHE) @@ -142,5 +104,5 @@ option(BUILD_QT_SDL "Build Qt/SDL frontend" ON) add_subdirectory(src) if (BUILD_QT_SDL) - add_subdirectory(src/frontend/qt_sdl) + add_subdirectory(src/frontend/qt_sdl) endif() -- cgit v1.2.3