cmake/setup.cmake (161 lines of code) (raw):

cmake_minimum_required(VERSION 3.9) if(POLICY CMP0068) # https://cmake.org/cmake/help/v3.9/policy/CMP0068.html cmake_policy(SET CMP0068 NEW) endif() if (BUILD_BINGO_POSTGRES AND (WIN32 OR APPLE)) # https://cmake.org/cmake/help/v3.12/policy/CMP0074.html cmake_policy(SET CMP0074 NEW) endif() if (BUILD_NATIVE) enable_language(C CXX) endif() if (NOT EMSCRIPTEN AND NOT CMAKE_HOST_WIN32) find_program(CCACHE_PROGRAM ccache) if (CCACHE_PROGRAM) message(STATUS "Using ccache to increase compile speed: ${CCACHE_PROGRAM}") set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") endif () endif() set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif () if (EMSCRIPTEN) string(APPEND CMAKE_CXX_FLAGS " -c -fexceptions -s DISABLE_EXCEPTION_CATCHING=0 -s USE_SDL=0 -s USE_SDL_IMAGE=0 -s USE_SDL_TTF=0 -s USE_SDL_NET=0 -s") string(APPEND CMAKE_C_FLAGS " -c -fexceptions -s DISABLE_EXCEPTION_CATCHING=0 -s USE_SDL=0 -s USE_SDL_IMAGE=0 -s USE_SDL_TTF=0 -s USE_SDL_NET=0 -s") set(CMAKE_CXX_FLAGS_RELEASE "-Oz -DNDEBUG") set(CMAKE_C_FLAGS_RELEASE "-Oz -DNDEBUG") set(CMAKE_CXX_FLAGS_DEBUG "-g3") set(CMAKE_C_FLAGS_DEBUG "-g3") endif() if (APPLE) string(APPEND CMAKE_CXX_FLAGS " -Wno-register") endif() if (MINGW) string(APPEND CMAKE_CXX_FLAGS " -Wno-error=incompatible-pointer-types -Wno-error=int-conversion -Wno-error=implicit-int") string(APPEND CMAKE_C_FLAGS " -Wno-error=incompatible-pointer-types -Wno-error=int-conversion -Wno-error=implicit-int") endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") # Compile flags if (UNIX OR MINGW) string(APPEND CMAKE_C_FLAGS " -fvisibility=hidden $ENV{CFLAGS}") string(APPEND CMAKE_CXX_FLAGS " -fvisibility=hidden -fvisibility-inlines-hidden $ENV{CXXFLAGS}") set(CMAKE_C_FLAGS_DEBUG "-g3") set(CMAKE_CXX_FLAGS_DEBUG "-g3") if(BUILD_STANDALONE AND NOT EMSCRIPTEN) if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) string(APPEND CMAKE_CXX_FLAGS " -static-libstdc++") if (MINGW) string(APPEND CMAKE_CXX_FLAGS " -static-libgcc") endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL Clang) string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra -stdlib=libc++") endif() endif() if(MSYS OR CYGWIN OR MINGW) set(CMAKE_SHARED_LIBRARY_PREFIX "") if (MSYS OR CYGWIN) string(APPEND CMAKE_C_FLAGS " -D_GNU_SOURCE") string(APPEND CMAKE_CXX_FLAGS " -D_GNU_SOURCE") endif() endif() elseif (MSVC) string(APPEND CMAKE_C_FLAGS " -D_CRT_SECURE_NO_WARNINGS -D_WIN32_WINNT=0x0601 -DWINVER=0x0601") string(APPEND CMAKE_CXX_FLAGS " -EHs -D_CRT_SECURE_NO_WARNINGS -D_WIN32_WINNT=0x0601 -DWINVER=0x0601 -D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR") if (NOT DISABLE_MP) string(APPEND CMAKE_C_FLAGS " -MP") string(APPEND CMAKE_CXX_FLAGS " -MP") endif () endif () # NOTE: Link-time optimization flags - turned off for now due to issues with exception handling #if (UNIX OR MINGW) # string(APPEND CMAKE_C_FLAGS_RELEASE " -flto -g") # string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto -g") # if (UNIX AND NOT APPLE) # string(APPEND CMAKE_C_FLAGS_RELEASE " -fuse-ld=gold") # string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fuse-ld=gold") # endif() #elseif (MSVC) # string(APPEND CMAKE_C_FLAGS_RELEASE " -GL") # string(APPEND CMAKE_CXX_FLAGS_RELEASE " -GL") # string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -LTCG -OPT:REF -OPT:ICF") # string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -LTCG -OPT:REF -OPT:ICF") # string(APPEND CMAKE_STATIC_LINKER_FLAGS_RELEASE " -LTCG") #endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) foreach(OUTPUT_CONFIG ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${OUTPUT_CONFIG} OUTPUT_CONFIG) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endforeach() # If cross-compiling, we are able to set another OS if (NOT CMAKE_SYSTEM_NAME_LOWER) string(TOLOWER ${CMAKE_SYSTEM_NAME} CMAKE_SYSTEM_NAME_LOWER) endif() # If cross-compiling, we are able to set another Arch, like "aarch64" if (NOT CMAKE_SYSTEM_PROCESSOR_LOWER) string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LOWER) endif() if (CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL "amd64") set(CMAKE_SYSTEM_PROCESSOR_LOWER "x86_64") endif() if (CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL "arm64") set(CMAKE_SYSTEM_PROCESSOR_LOWER "aarch64") endif() if (CMAKE_SYSTEM_NAME_LOWER STREQUAL "msys") set(CMAKE_SYSTEM_NAME_LOWER "windows") endif() if (ENABLE_TESTS) set_property(GLOBAL PROPERTY CTEST_TARGETS_ADDED 1) enable_testing() endif () set(DIST_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../dist) message(STATUS DIST_DIRECTORY=${DIST_DIRECTORY}) set(INDIGO_NATIVE_LIBS_DIRECTORY ${DIST_DIRECTORY}/lib) set(INDIGO_REPOSITORY_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) # Show C and CXX flags message(STATUS "CMAKE_C_FLAGS=${CMAKE_C_FLAGS}") message(STATUS "CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}") if (CMAKE_BUILD_TYPE STREQUAL Debug) message(STATUS "CMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}") message(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}") elseif(CMAKE_BUILD_TYPE STREQUAL Release) message(STATUS "CMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}") message(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}") elseif(CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo) message(STATUS "CMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}") message(STATUS "CMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") endif() message(STATUS "CMAKE_C_COMPILER=${CMAKE_C_COMPILER}") message(STATUS "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}") message(STATUS "OS=${CMAKE_SYSTEM_NAME_LOWER}") message(STATUS "ARCH=${CMAKE_SYSTEM_PROCESSOR_LOWER}") # Fix problem with CMake not supporting copy with wildcards on windows # Use like ${COPY_COMMAND} ${SEP}some${SEP}path${sep}file.txt ${NATIVE_DIST_DIRECTORY}${SEP} find_program(CP cp PATHS ENV{PATH}) if (CP) set(COPY_COMMAND cp) else() # Are we on Windows? (Not using WIN32, cause we maybe in Emscripten toolchain) set(COPY_COMMAND copy) endif() file(TO_NATIVE_PATH "/" SEP) file(TO_NATIVE_PATH ${DIST_DIRECTORY} NATIVE_DIST_DIRECTORY) if(USE_CLANG_TIDY) if(NOT MSVC) find_program(ClangTidy_Command NAMES clang-tidy) if (ClangTidy_Command) message(STATUS "Found clang-tidy at ${ClangTidy_Command}, using it for static analysis") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_C_CLANG_TIDY ${ClangTidy_Command}) set(CMAKE_CXX_CLANG_TIDY ${ClangTidy_Command}) endif() endif() endif()