Hook into shared library creation link lines
CMAKE_CXX_CREATE_SHARED_LIBRARY ignored
- macOS Catalina 10.15.5
- CMake 3.17.2
- Xcode 11.5
I want to manipulate the linker call in a linker trampoline python script, but CMake does not respect the CMAKE_CXX_CREATE_SHARED_LIBRARY
value in a Toolchain file or Pre-cache file. It always uses the CMAKE_CXX_COMPILER
for linking. If I switch to an add_executable and instead use CMAKE_CXX_LINK_EXECUTABLE
this works perfectly. I can also string( REGEX REPLACE ) the CMAKE_C??_COMPILER
values in the CMakeLists.txt file.
CMakeLists.txt example
cmake_minimum_required( VERSION 3.12 )
project( mylib )
add_library( mylib SHARED mylib.cpp )
Excerpt from the Toolchain File
set( CMAKE_LINKER "/path/to/linker_trampoline.py" CACHE PATH "" )
set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_LINKER> --CMAKE_CXX_COMPILER <CMAKE_CXX_COMPILER> --CMAKE_SHARED_LIBRARY_CXX_FLAGS <CMAKE_SHARED_LIBRARY_CXX_FLAGS> --LANGUAGE_COMPILE_FLAGS <LANGUAGE_COMPILE_FLAGS> --LINK_FLAGS <LINK_FLAGS> --CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> --SONAME_FLAG <SONAME_FLAG> --TARGET_SONAME <TARGET_SONAME> --TARGET <TARGET> --OBJECTS <OBJECTS> --LINK_LIBRARIES <LINK_LIBRARIES>" CACHE STRING "" FORCE )
A hack that works
I can REGEX or set
the value in the CMakeLists.txt, but this of course is rather ugly.
string( REGEX REPLACE "CMAKE_C_COMPILER"
CMAKE_LINKER CMAKE_C_CREATE_SHARED_LIBRARY
"${CMAKE_C_CREATE_SHARED_LIBRARY}" )
string( REGEX REPLACE "CMAKE_C_COMPILER"
CMAKE_LINKER CMAKE_C_CREATE_SHARED_MODULE
"${CMAKE_C_CREATE_SHARED_MODULE}" )
string( REGEX REPLACE "CMAKE_CXX_COMPILER"
CMAKE_LINKER CMAKE_CXX_CREATE_SHARED_LIBRARY
"${CMAKE_CXX_CREATE_SHARED_LIBRARY}" )
string( REGEX REPLACE "CMAKE_CXX_COMPILER"
CMAKE_LINKER CMAKE_CXX_CREATE_SHARED_MODULE
"${CMAKE_CXX_CREATE_SHARED_MODULE}" )