mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
Use better available linkers (mold > lld > gold > ld)
This commit is contained in:
parent
41b17e6ead
commit
e0a55f8bdd
122
CMakeLists.txt
122
CMakeLists.txt
|
@ -82,6 +82,9 @@ endif()
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
include(CheckCCompilerFlag)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
|
||||||
|
include(CheckLinkerFlag)
|
||||||
|
endif()
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Emscripten"))
|
if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Emscripten"))
|
||||||
include(CheckAtomic)
|
include(CheckAtomic)
|
||||||
|
@ -128,6 +131,7 @@ option(VULKAN "Enable the vulkan backend" ${AUTO_VULKAN_BACKEND})
|
||||||
|
|
||||||
option(EXCEPTION_HANDLING "Enable exception handling (only works with Windows as of now)" OFF)
|
option(EXCEPTION_HANDLING "Enable exception handling (only works with Windows as of now)" OFF)
|
||||||
option(IPO "Enable interprocedural optimizations" OFF)
|
option(IPO "Enable interprocedural optimizations" OFF)
|
||||||
|
option(FUSE_LD "Linker to use" OFF)
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
|
||||||
include(${PROJECT_SOURCE_DIR}/cmake/toolchains/Emscripten.toolchain)
|
include(${PROJECT_SOURCE_DIR}/cmake/toolchains/Emscripten.toolchain)
|
||||||
|
@ -189,7 +193,7 @@ set(CLIENT_EXECUTABLE DDNet CACHE STRING "Name of the build client executable")
|
||||||
# Compiler flags
|
# Compiler flags
|
||||||
########################################################################
|
########################################################################
|
||||||
|
|
||||||
function(add_c_compiler_flag_if_supported VARIABLE FLAG)
|
function(add_compiler_flag_if_supported VARIABLE FLAG)
|
||||||
if(ARGC GREATER 2)
|
if(ARGC GREATER 2)
|
||||||
set(CHECKED_FLAG "${ARGV2}")
|
set(CHECKED_FLAG "${ARGV2}")
|
||||||
else()
|
else()
|
||||||
|
@ -206,79 +210,131 @@ function(add_c_compiler_flag_if_supported VARIABLE FLAG)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(add_linker_flag_if_supported VARIABLE FLAG)
|
||||||
|
if(ARGC GREATER 2)
|
||||||
|
set(CHECKED_FLAG "${ARGV2}")
|
||||||
|
else()
|
||||||
|
set(CHECKED_FLAG "${FLAG}")
|
||||||
|
endif()
|
||||||
|
string(REGEX REPLACE "[^A-Za-z0-9]" "_" CONFIG_VARIABLE "FLAG_SUPPORTED${CHECKED_FLAG}")
|
||||||
|
if(CMAKE_VERSION VERSION_LESS 3.18)
|
||||||
|
set(${CONFIG_VARIABLE} OFF)
|
||||||
|
else()
|
||||||
|
check_linker_flag(C "${CHECKED_FLAG}" ${CONFIG_VARIABLE})
|
||||||
|
endif()
|
||||||
|
if(${CONFIG_VARIABLE})
|
||||||
|
if(${VARIABLE})
|
||||||
|
set("${VARIABLE}" "${${VARIABLE}};${FLAG}" PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
set("${VARIABLE}" "${FLAG}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# Force compiler colors on when using ninja. Ninja filters the colors out when
|
# Force compiler colors on when using ninja. Ninja filters the colors out when
|
||||||
# it's not printing to a terminal on its own.
|
# it's not printing to a terminal on its own.
|
||||||
if(CMAKE_GENERATOR STREQUAL "Ninja")
|
if(CMAKE_GENERATOR STREQUAL "Ninja")
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -fdiagnostics-color=always)
|
add_compiler_flag_if_supported(OUR_FLAGS -fdiagnostics-color=always)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -fcolor-diagnostics)
|
add_compiler_flag_if_supported(OUR_FLAGS -fcolor-diagnostics)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT MSVC AND NOT HAIKU)
|
if(NOT MSVC AND NOT HAIKU)
|
||||||
|
if(NOT FUSE_LD STREQUAL OFF)
|
||||||
|
add_linker_flag_if_supported(OUR_FLAGS_LINK -fuse-ld=${FUSE_LD})
|
||||||
|
if(FLAG_SUPPORTED_fuse_ld_${FUSE_LD})
|
||||||
|
message(STATUS "Using ${FUSE_LD} linker")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR NOT ENABLE_IPO)
|
||||||
|
# GCC+LTO: pthread_create has failed: Resource temporarily unavailable
|
||||||
|
add_linker_flag_if_supported(OUR_FLAGS_LINK -fuse-ld=mold)
|
||||||
|
if(FLAG_SUPPORTED_fuse_ld_mold)
|
||||||
|
message(STATUS "Using mold linker")
|
||||||
|
else()
|
||||||
|
# Does not support GCC+LTO
|
||||||
|
add_linker_flag_if_supported(OUR_FLAGS_LINK -fuse-ld=lld)
|
||||||
|
if(FLAG_SUPPORTED_fuse_ld_lld)
|
||||||
|
message(STATUS "Using lld linker")
|
||||||
|
else()
|
||||||
|
add_linker_flag_if_supported(OUR_FLAGS_LINK -fuse-ld=gold)
|
||||||
|
if(FLAG_SUPPORTED_fuse_ld_gold)
|
||||||
|
message(STATUS "Using gold linker")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
add_linker_flag_if_supported(OUR_FLAGS_LINK -fuse-ld=gold)
|
||||||
|
if(FLAG_SUPPORTED_fuse_ld_gold)
|
||||||
|
message(STATUS "Using gold linker")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(CMAKE_VERSION VERSION_LESS 3.1 OR TARGET_OS STREQUAL "mac")
|
if(CMAKE_VERSION VERSION_LESS 3.1 OR TARGET_OS STREQUAL "mac")
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -std=gnu++17)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -std=gnu++17)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Protect the stack pointer.
|
# Protect the stack pointer.
|
||||||
# -fstack-protector-all doesn't work on MinGW.
|
# -fstack-protector-all doesn't work on MinGW.
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -fstack-protector-all)
|
add_compiler_flag_if_supported(OUR_FLAGS -fstack-protector-all)
|
||||||
|
|
||||||
# Disable exceptions as DDNet does not use them.
|
# Disable exceptions as DDNet does not use them.
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -fno-exceptions)
|
add_compiler_flag_if_supported(OUR_FLAGS -fno-exceptions)
|
||||||
|
|
||||||
# Inaccurate floating point numbers cause problems on mingw-w64-gcc when
|
# Inaccurate floating point numbers cause problems on mingw-w64-gcc when
|
||||||
# compiling for x86, might cause problems elsewhere. So don't store floats
|
# compiling for x86, might cause problems elsewhere. So don't store floats
|
||||||
# in registers but keep them at higher accuracy.
|
# in registers but keep them at higher accuracy.
|
||||||
if(TARGET_ARCH STREQUAL "x86")
|
if(TARGET_ARCH STREQUAL "x86")
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -ffloat-store)
|
add_compiler_flag_if_supported(OUR_FLAGS -ffloat-store)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Don't insert timestamps into PEs to keep the build reproducible.
|
# Don't insert timestamps into PEs to keep the build reproducible.
|
||||||
if(TARGET_OS STREQUAL "windows")
|
if(TARGET_OS STREQUAL "windows")
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_LINK -Wl,--no-insert-timestamp)
|
add_compiler_flag_if_supported(OUR_FLAGS_LINK -Wl,--no-insert-timestamp)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(TARGET_OS STREQUAL "mac")
|
if(TARGET_OS STREQUAL "mac")
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -stdlib=libc++)
|
add_compiler_flag_if_supported(OUR_FLAGS -stdlib=libc++)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(EXCEPTION_HANDLING)
|
if(EXCEPTION_HANDLING)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -DCONF_EXCEPTION_HANDLING)
|
add_compiler_flag_if_supported(OUR_FLAGS -DCONF_EXCEPTION_HANDLING)
|
||||||
# use the frame pointer (frame pointer usage is disabled by default in
|
# use the frame pointer (frame pointer usage is disabled by default in
|
||||||
# some architectures like x86_64 and for some optimization levels; and it
|
# some architectures like x86_64 and for some optimization levels; and it
|
||||||
# may be impossible to walk the call stack without it)
|
# may be impossible to walk the call stack without it)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS -fno-omit-frame-pointer)
|
add_compiler_flag_if_supported(OUR_FLAGS -fno-omit-frame-pointer)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wall)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wall)
|
||||||
if(CMAKE_VERSION VERSION_GREATER 3.3 OR CMAKE_VERSION VERSION_EQUAL 3.3)
|
if(CMAKE_VERSION VERSION_GREATER 3.3 OR CMAKE_VERSION VERSION_EQUAL 3.3)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN
|
||||||
$<$<COMPILE_LANGUAGE:C>:-Wdeclaration-after-statement>
|
$<$<COMPILE_LANGUAGE:C>:-Wdeclaration-after-statement>
|
||||||
-Wdeclaration-after-statement
|
-Wdeclaration-after-statement
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wextra)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wextra)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-unused-parameter)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-unused-parameter)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-missing-field-initializers)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-missing-field-initializers)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wformat=2) # Warn about format strings.
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wformat=2) # Warn about format strings.
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_DEP -Wno-implicit-function-declaration)
|
add_compiler_flag_if_supported(OUR_FLAGS_DEP -Wno-implicit-function-declaration)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-nullability-completeness) # Mac OS build on github
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-nullability-completeness) # Mac OS build on github
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-tautological-constant-out-of-range-compare) # Check needed for x86, but warns on x86-64
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-tautological-constant-out-of-range-compare) # Check needed for x86, but warns on x86-64
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wduplicated-cond)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wduplicated-cond)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wduplicated-branches)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wduplicated-branches)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wlogical-op)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wlogical-op)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wrestrict)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wrestrict)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wshadow-all) # clang
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wshadow-all) # clang
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wshadow=global) # gcc
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wshadow=global) # gcc
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wthread-safety)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wthread-safety)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wsuggest-override)
|
add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wsuggest-override)
|
||||||
# add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wdouble-promotion) # Many occurences
|
# add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wdouble-promotion) # Many occurences
|
||||||
# add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wnull-dereference) # Many occurences
|
# add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wnull-dereference) # Many occurences
|
||||||
# add_c_compiler_flag_if_supported(OUR_FLAGS_OWN -Wuseless-cast) # TODO: Enable for C++ code except gtest
|
# add_compiler_flag_if_supported(OUR_FLAGS_OWN -Wuseless-cast) # TODO: Enable for C++ code except gtest
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
if(EXCEPTION_HANDLING)
|
if(EXCEPTION_HANDLING)
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS /DCONF_EXCEPTION_HANDLING)
|
add_compiler_flag_if_supported(OUR_FLAGS /DCONF_EXCEPTION_HANDLING)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -2882,7 +2938,7 @@ source_group_tree(src)
|
||||||
|
|
||||||
if(ANTIBOT)
|
if(ANTIBOT)
|
||||||
# Allow the antibot library to use functions from the server binary.
|
# Allow the antibot library to use functions from the server binary.
|
||||||
add_c_compiler_flag_if_supported(OUR_FLAGS_LINK -rdynamic)
|
add_compiler_flag_if_supported(OUR_FLAGS_LINK -rdynamic)
|
||||||
set_own_rpath(${TARGET_SERVER})
|
set_own_rpath(${TARGET_SERVER})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue