From 2a7f771bd8196f6256e71afd734d335ff7d80bbc Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Wed, 13 Jul 2022 19:02:17 +0100 Subject: [PATCH] CMake: Use the mold linker where available Linking a debug build: GNU LD: 1.82s Mold: 0.03s --- CMake/MoldLinker.cmake | 33 +++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 ++ 2 files changed, 35 insertions(+) create mode 100644 CMake/MoldLinker.cmake diff --git a/CMake/MoldLinker.cmake b/CMake/MoldLinker.cmake new file mode 100644 index 000000000..4d69d8bde --- /dev/null +++ b/CMake/MoldLinker.cmake @@ -0,0 +1,33 @@ +if(NOT CMAKE_CROSSCOMPILING) + find_program( + LD_MOLD_PATH + ld + PATHS + ${CMAKE_INSTALL_PREFIX}/libexec/mold + ENV LD_MOLD_PATH + NO_DEFAULT_PATH + ) + if(NOT LD_MOLD_PATH STREQUAL "LD_MOLD_PATH-NOTFOUND") + set(_have_ld_mold ON) + else() + set(_have_ld_mold OFF) + endif() +endif() + +option(USE_LD_MOLD "Use mold linker" ${_have_ld_mold}) + +if(USE_LD_MOLD) + message("-- Using Mold linker (pass -DUSE_LD_MOLD=OFF to disable)") + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12) + if (_have_ld_mold) + get_filename_component(_mold_dir ${LD_MOLD_PATH} DIRECTORY) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -B${_mold_dir}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -B${_mold_dir}") + else() + message(WARNING "Cannot use mold linker: mold ld directory not found") + endif() + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=mold") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=mold") + endif() +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index ea355d180..8fa82b7f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,8 @@ cmake_dependent_option(DEVILUTIONX_DISABLE_RTTI "Disable RTTI" ON "NONET" OFF) cmake_dependent_option(DEVILUTIONX_DISABLE_EXCEPTIONS "Disable exceptions" ON "NONET" OFF) RELEASE_OPTION(DEVILUTIONX_STATIC_CXX_STDLIB "Link C++ standard library statically (if available)") +include(MoldLinker) + # Memory / performance trade-off options option(DISABLE_STREAMING_MUSIC "Disable streaming music (to work around broken platform implementations)" OFF) mark_as_advanced(DISABLE_STREAMING_MUSIC)