Generic platform sets CMAKE_DL_LIBS to dl
When trying to write a toolchain file for a baremetal ARM/ELF system, I assumed that Generic
would be the correct setting for CMAKE_SYSTEM_NAME
.
However, this results in CMAKE_DL_LIBS
being set to dl
, which is unsuitable for a platform that doesn't have an operating system, let alone a shared library loader. Worse, manually setting CMAKE_DL_LIBS
in the toolchain file does nothing. The value of CMAKE_DL_LIBS
is unconditionally set here:
The same is true for all the Generic-*
platforms besides Generic-SDCC-C
which unsets CMAKE_DL_LIBS
.
My preferred solution would be to introduce a new policy that leaves the value of CMAKE_DL_LIBS
up to the toolchain file and clears them by default for all Generic*
platforms.
A quick reproducer:
cmake_minimum_required(VERSION 3.25)
project(example)
include(CMakePrintSystemInformation)
Console output:
$ cmake -S . -B build --fresh -DCMAKE_SYSTEM_NAME=Generic
-- The C compiler identification is GNU 11.3.0
-- The CXX compiler identification is GNU 11.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMAKE_SYSTEM is Generic Generic
CMAKE_SYSTEM file is Platform/Generic
CMAKE_C_COMPILER is /usr/bin/cc
CMAKE_CXX_COMPILER is /usr/bin/c++
CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS is -shared
CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS is -shared
CMAKE_DL_LIBS is dl
CMAKE_SHARED_LIBRARY_PREFIX is lib
CMAKE_SHARED_LIBRARY_SUFFIX is .so
CMAKE_COMPILER_IS_GNUCC = 1
CMAKE_COMPILER_IS_GNUCXX = 1
CMAKE_CXX_CREATE_SHARED_LIBRARY is <CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>
CMAKE_CXX_CREATE_SHARED_MODULE is <CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>
CMAKE_CXX_CREATE_STATIC_LIBRARY is
CMAKE_CXX_COMPILE_OBJECT is <CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>
CMAKE_CXX_LINK_EXECUTABLE <CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>
CMAKE_C_CREATE_SHARED_LIBRARY is <CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>
CMAKE_C_CREATE_SHARED_MODULE is <CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>
CMAKE_C_CREATE_STATIC_LIBRARY is
CMAKE_C_COMPILE_OBJECT is <CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>
CMAKE_C_LINK_EXECUTABLE <CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>
CMAKE_SYSTEM_AND_CXX_COMPILER_INFO_FILE
CMAKE_SYSTEM_AND_C_COMPILER_INFO_FILE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/test/build