Skip to content

Commit 0c52207

Browse files
committed
[Python] Restructure Python libraries to not require system links
1 parent 12c0d69 commit 0c52207

File tree

11 files changed

+349
-329
lines changed

11 files changed

+349
-329
lines changed

bindings/pyroot/cppyy/CPyCppyy/CMakeLists.txt

Lines changed: 77 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,61 +15,84 @@ set(headers
1515

1616
set(sources
1717
src/API.cxx
18-
src/CallContext.cxx
19-
src/Converters.cxx
2018
src/CPPClassMethod.cxx
2119
src/CPPConstructor.cxx
2220
src/CPPDataMember.cxx
2321
src/CPPEnum.cxx
2422
src/CPPExcInstance.cxx
2523
src/CPPFunction.cxx
24+
src/CPPGetSetItem.cxx
2625
src/CPPInstance.cxx
2726
src/CPPMethod.cxx
2827
src/CPPOperator.cxx
2928
src/CPPOverload.cxx
3029
src/CPPScope.cxx
31-
src/CPPGetSetItem.cxx
32-
src/CPyCppyyModule.cxx
30+
src/CallContext.cxx
31+
src/Converters.cxx
3332
src/CustomPyTypes.cxx
34-
src/Dispatcher.cxx
3533
src/DispatchPtr.cxx
34+
src/Dispatcher.cxx
3635
src/Executors.cxx
36+
src/Initialization.cxx
3737
src/LowLevelViews.cxx
3838
src/MemoryRegulator.cxx
3939
src/ProxyWrappers.cxx
40+
src/PyException.cxx
41+
src/PyResult.cxx
4042
src/PyStrings.cxx
4143
src/Pythonize.cxx
4244
src/TemplateProxy.cxx
43-
src/PyException.cxx
44-
src/PyResult.cxx
4545
src/TupleOfInstances.cxx
4646
src/TypeManip.cxx
4747
src/Utility.cxx
4848
)
4949

50-
file(RELATIVE_PATH PYTHONDIR_TO_LIBDIR "${CMAKE_INSTALL_FULL_PYTHONDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}")
5150

52-
set(libname cppyy)
51+
add_library(CPyCppyy SHARED ${headers} ${sources})
52+
# Set the suffix to '.so' and the prefix to 'lib'
53+
set_target_properties(CPyCppyy PROPERTIES ${ROOT_LIBRARY_PROPERTIES})
54+
target_link_libraries(CPyCppyy PRIVATE Core)
55+
if(MSVC)
56+
target_link_libraries(CPyCppyy PRIVATE cppyy_backend Python3::Python)
57+
set_target_properties(CPyCppyy PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
58+
set_target_properties(CPyCppyy PROPERTIES PREFIX "lib")
59+
set_target_properties(CPyCppyy PROPERTIES SUFFIX ".pyd")
60+
elseif(APPLE)
61+
target_link_libraries(CPyCppyy PRIVATE -Wl,-bind_at_load -Wl,-w -Wl,-undefined -Wl,dynamic_lookup cppyy_backend)
62+
else()
63+
target_link_libraries(CPyCppyy PRIVATE -Wl,--unresolved-symbols=ignore-all cppyy_backend)
64+
endif()
5365

54-
add_library(${libname} SHARED ${headers} ${sources})
66+
if(NOT MSVC)
67+
target_compile_options(CPyCppyy PRIVATE -Wno-strict-aliasing)
68+
endif()
69+
if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND NOT MSVC)
70+
target_compile_options(CPyCppyy PRIVATE
71+
-Wno-unused-but-set-parameter)
72+
endif()
73+
74+
75+
add_library(cppyy SHARED
76+
src/CPyCppyyModule.cxx
77+
)
5578
# Set the suffix to '.so' and the prefix to 'lib'
56-
set_target_properties(${libname} PROPERTIES ${ROOT_LIBRARY_PROPERTIES})
79+
set_target_properties(cppyy PROPERTIES ${ROOT_LIBRARY_PROPERTIES})
5780
if(MSVC)
58-
target_link_libraries(${libname} PUBLIC cppyy_backend Python3::Python)
59-
set_target_properties(${libname} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
60-
set_target_properties(${libname} PROPERTIES PREFIX "lib")
61-
set_target_properties(${libname} PROPERTIES SUFFIX ".pyd")
81+
target_link_libraries(cppyy PRIVATE CPyCppyy)
82+
set_target_properties(cppyy PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
83+
set_target_properties(cppyy PROPERTIES PREFIX "lib")
84+
set_target_properties(cppyy PROPERTIES SUFFIX ".pyd")
6285
elseif(APPLE)
63-
target_link_libraries(${libname} PUBLIC -Wl,-bind_at_load -Wl,-w -Wl,-undefined -Wl,dynamic_lookup cppyy_backend)
86+
target_link_libraries(cppyy PRIVATE -Wl,-bind_at_load -Wl,-w -Wl,-undefined -Wl,dynamic_lookup CPyCppyy)
6487
else()
65-
target_link_libraries(${libname} PUBLIC -Wl,--unresolved-symbols=ignore-all cppyy_backend)
88+
target_link_libraries(cppyy PRIVATE -Wl,--unresolved-symbols=ignore-all CPyCppyy)
6689
endif()
6790

6891
if(NOT MSVC)
69-
target_compile_options(${libname} PRIVATE -Wno-strict-aliasing)
92+
target_compile_options(cppyy PRIVATE -Wno-strict-aliasing)
7093
endif()
7194
if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND NOT MSVC)
72-
target_compile_options(${libname} PRIVATE
95+
target_compile_options(cppyy PRIVATE
7396
-Wno-unused-but-set-parameter)
7497
endif()
7598

@@ -79,42 +102,61 @@ endif()
79102
# CPython docs for C/C++ extensions. see
80103
# https://docs.python.org/3/extending/extending.html#keyword-parameters-for-extension-functions
81104
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
82-
target_compile_options(${libname} PRIVATE -Wno-cast-function-type)
105+
target_compile_options(cppyy PRIVATE -Wno-cast-function-type)
106+
target_compile_options(CPyCppyy PRIVATE -Wno-cast-function-type)
83107
endif()
84108

85109
# Disables warnings in Python 3.8 caused by the temporary extra filed for tp_print compatibility
86110
# (see https://github.com/python/cpython/blob/3.8/Include/cpython/object.h#L260).
87111
# Note that Python 3.8 is the lowers Python version that is still supported by
88112
# ROOT, so this compile option can be completely removed soon.
89113
if(NOT MSVC AND Python3_VERSION VERSION_LESS 3.9)
90-
target_compile_options(${libname} PRIVATE -Wno-missing-field-initializers)
114+
target_compile_options(cppyy PRIVATE -Wno-missing-field-initializers)
115+
target_compile_options(CPyCppyy PRIVATE -Wno-missing-field-initializers)
91116
endif()
92117

93-
target_compile_definitions(${libname} PRIVATE NO_CPPYY_LEGACY_NAMESPACE)
118+
target_compile_definitions(CPyCppyy PRIVATE NO_CPPYY_LEGACY_NAMESPACE)
94119

95-
target_include_directories(${libname}
96-
SYSTEM PUBLIC ${Python3_INCLUDE_DIRS})
120+
target_include_directories(CPyCppyy SYSTEM PUBLIC ${Python3_INCLUDE_DIRS})
97121

98-
target_include_directories(${libname}
99-
PRIVATE
100-
${CMAKE_BINARY_DIR}/ginclude
122+
target_include_directories(CPyCppyy
101123
PUBLIC
102124
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
103125
)
104126

105-
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS ${libname})
127+
if(NOT MSVC)
128+
# Make sure that relative RUNPATH to main ROOT libraries is always correct.
129+
130+
file(RELATIVE_PATH pymoduledir_to_libdir_build ${localruntimedir} "${localruntimedir}")
131+
file(RELATIVE_PATH pymoduledir_to_libdir_install ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_PYTHONDIR} "${CMAKE_INSTALL_FULL_LIBDIR}")
132+
133+
if(APPLE)
134+
set_target_properties(cppyy PROPERTIES
135+
BUILD_RPATH "@loader_path/${pymoduledir_to_libdir_build}"
136+
INSTALL_RPATH "@loader_path/${pymoduledir_to_libdir_install}"
137+
)
138+
else()
139+
set_target_properties(cppyy PROPERTIES
140+
BUILD_RPATH "$ORIGIN/${pymoduledir_to_libdir_build}"
141+
INSTALL_RPATH "$ORIGIN/${pymoduledir_to_libdir_install}"
142+
)
143+
endif()
144+
145+
endif()
146+
147+
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS CPyCppyy)
148+
set_property(GLOBAL APPEND PROPERTY ROOT_EXPORTED_TARGETS cppyy)
106149

107150
# Install library
108-
install(TARGETS ${libname} EXPORT ${CMAKE_PROJECT_NAME}Exports
151+
install(TARGETS CPyCppyy EXPORT ${CMAKE_PROJECT_NAME}Exports
109152
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries
110153
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
111154
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries)
112-
if (NOT MSVC AND NOT CMAKE_INSTALL_LIBDIR STREQUAL CMAKE_INSTALL_PYTHONDIR)
113-
# add a symlink to ${libname} in CMAKE_INSTALL_PYTHONDIR
114-
set(LIB_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${libname}.so)
115-
install(CODE "file(CREATE_LINK ${PYTHONDIR_TO_LIBDIR}/${LIB_FILE_NAME}
116-
\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_PYTHONDIR}/${LIB_FILE_NAME} SYMBOLIC)")
117-
endif()
155+
156+
install(TARGETS cppyy EXPORT ${CMAKE_PROJECT_NAME}Exports
157+
RUNTIME DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries
158+
LIBRARY DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries
159+
ARCHIVE DESTINATION ${CMAKE_INSTALL_PYTHONDIR} COMPONENT libraries)
118160

119161
file(COPY ${headers} DESTINATION ${CMAKE_BINARY_DIR}/include/CPyCppyy)
120162
install(FILES ${headers}

0 commit comments

Comments
 (0)