# # Copyright (c) Marcus Holland-Moritz # # This file is part of dwarfs. # # dwarfs is free software: you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # dwarfs is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # dwarfs. If not, see . # cmake_minimum_required(VERSION 3.28.0) set(CMAKE_CXX_SCAN_FOR_MODULES OFF) if(BUILD_SHARED_LIBS AND STATIC_BUILD_DO_NOT_USE) message(FATAL_ERROR "Seriously, don't try setting both BUILD_SHARED_LIBS and STATIC_BUILD_DO_NOT_USE") endif() if(WIN32 OR STATIC_BUILD_DO_NOT_USE) set(BUILD_SHARED_LIBS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE OFF) else() set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() if(NOT DISABLE_CCACHE) find_program(CCACHE_EXE ccache ccache.exe PATHS "c:/bin") if(CCACHE_EXE) set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_EXE}) set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_EXE}) if(DEFINED ENV{GITHUB_REF_TYPE}) message(STATUS "Using ccache from ${CCACHE_EXE}") execute_process(COMMAND ${CCACHE_EXE} -p OUTPUT_VARIABLE CCACHE_CONFIG ERROR_QUIET) message(STATUS "ccache config:\n${CCACHE_CONFIG}") endif() endif() endif() if(DEFINED ENV{CCACHE_PREFIX}) add_compile_options(-Wno-gnu-line-marker) endif() if(NOT WIN32) if(NOT DISABLE_MOLD) if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") find_program(MOLD_EXE mold) if(MOLD_EXE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=${MOLD_EXE}") endif() endif() endif() endif() set(default_build_type "Release") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${default_build_type}'") set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Build Type" FORCE) endif() if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") add_compile_options(-fdiagnostics-color=always) # For gcc, -O3 is *much* worse than -O2 # Update: This is still true for gcc-12 # set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2 -g") # set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2 -g") elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_compile_options(-fcolor-diagnostics) endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") add_compile_options(/Zc:__cplusplus /utf-8 /wd4267 /wd4244 /wd5219) # Apply /MT or /MTd (multithread, static version of the run-time library) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:Embedded>") set(MSVC_USE_STATIC_RUNTIME ON CACHE BOOL "static build") add_compile_definitions(_WIN32_WINNT=0x0601 WINVER=0x0601) foreach(CompilerFlag CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO) string(REPLACE "/RTC1" "" ${CompilerFlag} "${${CompilerFlag}}") endforeach() endif() if(ENABLE_STACKTRACE) if(CMAKE_BUILD_TYPE STREQUAL Release) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # enable line numbers in stack traces add_compile_options(-g1) endif() endif() endif() if(DWARFS_OPTIMIZE) string(REPLACE "-O3" "-O${DWARFS_OPTIMIZE}" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") string(REPLACE "-O3" "-O${DWARFS_OPTIMIZE}" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") endif() if(APPLE) include(CheckLinkerFlag) check_linker_flag(CXX "-Wl,-no_warn_duplicate_libraries" APPLE_LD_NO_WARN_DUPLICATE_LIBRARIES) if(APPLE_LD_NO_WARN_DUPLICATE_LIBRARIES) add_link_options("-Wl,-no_warn_duplicate_libraries") endif() endif()