diff --git a/CMake/SofaPython3Tools.cmake b/CMake/SofaPython3Tools.cmake index 678743f6..8e11b2eb 100644 --- a/CMake/SofaPython3Tools.cmake +++ b/CMake/SofaPython3Tools.cmake @@ -47,7 +47,7 @@ function(SP3_add_python_package) cmake_parse_arguments(A "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - set(OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${A_TARGET_DIRECTORY}) + set(OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${A_TARGET_DIRECTORY}) file(GLOB_RECURSE files RELATIVE ${A_SOURCE_DIRECTORY} ${A_SOURCE_DIRECTORY}/*) foreach(file_relative_path ${files}) @@ -56,7 +56,7 @@ function(SP3_add_python_package) file(COPY ${file_absolute_path} DESTINATION ${OUTPUT_DIRECTORY}/${relative_directory}) install( FILES "${OUTPUT_DIRECTORY}/${file_relative_path}" - DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${A_TARGET_DIRECTORY}/${relative_directory}" + DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${A_TARGET_DIRECTORY}/${relative_directory}" ) endforeach() @@ -178,7 +178,7 @@ function(SP3_add_python_module) ${A_TARGET} PROPERTIES OUTPUT_NAME ${MODULE_NAME} - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" ) get_target_property(TARGET_LIBRARY_OUTPUT_DIRECTORY ${A_TARGET} LIBRARY_OUTPUT_DIRECTORY) @@ -198,23 +198,23 @@ function(SP3_add_python_module) # Get the relative path from this binding module to the install lib directory # For example, for lib/python3/site-packages/Sofa/Core.***.so, the relative path will be # "../../.." - file(RELATIVE_PATH from_target_to_lib "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${CMAKE_BINARY_DIR}/lib") + file(RELATIVE_PATH from_target_to_lib "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}") file(TO_CMAKE_PATH "${from_target_to_lib}" from_target_to_lib) # prettify this path # RPATH needed to find dependencies in /lib list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/${from_target_to_lib}/../lib" - "$$ORIGIN/${from_target_to_lib}/../lib" - "@loader_path/${from_target_to_lib}/../lib" - "@executable_path/${from_target_to_lib}/../lib" + "$ORIGIN/${from_target_to_lib}/../${ARCHIVE_OUTPUT_DIRECTORY}" + "$$ORIGIN/${from_target_to_lib}/../${ARCHIVE_OUTPUT_DIRECTORY}" + "@loader_path/${from_target_to_lib}/../${ARCHIVE_OUTPUT_DIRECTORY}" + "@executable_path/${from_target_to_lib}/../${ARCHIVE_OUTPUT_DIRECTORY}" ) # RPATH needed to find dependencies in /lib list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/${from_target_to_lib}/../../../lib" - "$$ORIGIN/${from_target_to_lib}/../../../lib" - "@loader_path/${from_target_to_lib}/../../../lib" - "@executable_path/${from_target_to_lib}/../../../lib" + "$ORIGIN/${from_target_to_lib}/../../../${ARCHIVE_OUTPUT_DIRECTORY}" + "$$ORIGIN/${from_target_to_lib}/../../../${ARCHIVE_OUTPUT_DIRECTORY}" + "@loader_path/${from_target_to_lib}/../../../${ARCHIVE_OUTPUT_DIRECTORY}" + "@executable_path/${from_target_to_lib}/../../../${ARCHIVE_OUTPUT_DIRECTORY}" ) if (APPLE) @@ -278,10 +278,10 @@ function(SP3_add_python_module) # Alright, now we have the path from the current target towards the "plugins" relocatable directory of SOFA # We can compute the relative path from the current target towards the dependency relocatable path. list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" - "$$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" - "@loader_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" - "@executable_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" + "$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}" + "$$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}" + "@loader_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}" + "@executable_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}" ) endif() endforeach() @@ -314,17 +314,17 @@ function(SP3_add_python_module) ${A_TARGET} PROPERTIES # https://cmake.org/cmake/help/latest/prop_tgt/LIBRARY_OUTPUT_DIRECTORY_CONFIG.html#prop_tgt:LIBRARY_OUTPUT_DIRECTORY_ - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" - RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" - RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" - RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" - RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" - - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" - ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" - ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" - ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" - ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" + + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" + ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" + ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" + ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" + ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}/libraries" ) endif() @@ -333,16 +333,16 @@ function(SP3_add_python_module) install( TARGETS ${A_TARGET} EXPORT ${A_PACKAGE}Targets - RUNTIME DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT applications - LIBRARY DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries - ARCHIVE DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries + RUNTIME DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT applications + LIBRARY DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries + ARCHIVE DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries ) elseif (DESTINATION) install( TARGETS ${A_TARGET} - RUNTIME DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT applications - LIBRARY DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries - ARCHIVE DESTINATION "lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries + RUNTIME DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT applications + LIBRARY DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries + ARCHIVE DESTINATION "${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" COMPONENT libraries ) endif() diff --git a/CMake/environment.cmake b/CMake/environment.cmake new file mode 100644 index 00000000..8a765dfb --- /dev/null +++ b/CMake/environment.cmake @@ -0,0 +1,29 @@ +# BUILD OPTIONS +if (NOT SP3_COMPILED_AS_SUBPROJECT) + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Install path prefix, prepended onto install directories." FORCE) + endif() +endif() + + +## Set the output directories globally +if(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +endif() + +if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +endif() + +if(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) + if(WIN32) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + else() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) + endif() +endif() + +string(REGEX REPLACE "^${CMAKE_BINARY_DIR}/" "" ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} ) +string(REGEX REPLACE "^${CMAKE_BINARY_DIR}/" "" RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) +string(REGEX REPLACE "^${CMAKE_BINARY_DIR}/" "" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ) + diff --git a/CMakeLists.txt b/CMakeLists.txt index d76b3e21..de6c9f6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,8 @@ project(SofaPython3 VERSION 24.12.99) find_package(Sofa.Config REQUIRED) +include(CMake/environment.cmake) + # Detect if SofaPython3 is a subproject of another project (eg. when compiled within Sofa) if (NOT "${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") set(SP3_COMPILED_AS_SUBPROJECT 1) @@ -49,24 +51,6 @@ sofa_find_package(Sofa.GUI.Common QUIET) CMAKE_DEPENDENT_OPTION(SP3_WITH_SOFAGUI "Bind the SOFA gui component." ON "Sofa.GUI.Common_FOUND" OFF) -# BUILD OPTIONS -if (NOT SP3_COMPILED_AS_SUBPROJECT) - if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Install path prefix, prepended onto install directories." FORCE) - endif() - set(ARCHIVE_OUTPUT_DIRECTORY lib) - set(RUNTIME_OUTPUT_DIRECTORY bin) - - if(WIN32) - set(LIBRARY_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY}) - else() - set(LIBRARY_OUTPUT_DIRECTORY ${ARCHIVE_OUTPUT_DIRECTORY}) - endif() - - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${RUNTIME_OUTPUT_DIRECTORY}) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBRARY_OUTPUT_DIRECTORY}) -endif() if(MSVC) # With C++17 (/std:c++17), to get MSVC to behave, you need /permissive- @@ -210,15 +194,15 @@ sofa_create_package( RELOCATABLE "plugins" ) -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/CMake/SofaPython3Tools.cmake" "${CMAKE_BINARY_DIR}/lib/cmake/SofaPython3Tools.cmake" COPYONLY) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/CMake/SofaPython3Tools.cmake" "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/cmake/SofaPython3Tools.cmake" COPYONLY) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/CMake/SofaPython3Tools.cmake" - DESTINATION lib/cmake/SofaPython3 + DESTINATION ${ARCHIVE_OUTPUT_DIRECTORY}/cmake/SofaPython3 COMPONENT headers ) if (SP3_LINK_TO_USER_SITE AND SP3_PYTHON_PACKAGES_LINK_DIRECTORY) - set(SP3_SITE_PACKAGES_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}") + set(SP3_SITE_PACKAGES_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}") file(GLOB directories RELATIVE "${SP3_SITE_PACKAGES_OUTPUT_DIRECTORY}" "${SP3_SITE_PACKAGES_OUTPUT_DIRECTORY}/*") @@ -226,11 +210,11 @@ if (SP3_LINK_TO_USER_SITE AND SP3_PYTHON_PACKAGES_LINK_DIRECTORY) install(DIRECTORY DESTINATION ${SP3_PYTHON_PACKAGES_LINK_DIRECTORY}) foreach(directory ${directories}) if(SP3_COMPILED_AS_SOFA_SUBPROJECT) - set(LINK_SOURCE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/plugins/SofaPython3/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${directory}) + set(LINK_SOURCE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/plugins/SofaPython3/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${directory}) else() - set(LINK_SOURCE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${directory}) + set(LINK_SOURCE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${directory}) endif() - if(IS_DIRECTORY ${CMAKE_BINARY_DIR}/lib/${SP3_PYTHON_PACKAGES_DIRECTORY}/${directory}) + if(IS_DIRECTORY ${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${directory}) if(WIN32) install(CODE "\ execute_process( \ diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index fbab2c18..d07bd514 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -15,16 +15,16 @@ if(UNIX) set(CMAKE_INSTALL_RPATH "$ORIGIN" "$$ORIGIN" - "$ORIGIN/../lib" - "$$ORIGIN/../lib" + "$ORIGIN/../${ARCHIVE_OUTPUT_DIRECTORY}" + "$$ORIGIN/../${ARCHIVE_OUTPUT_DIRECTORY}" ) if(APPLE) set(CMAKE_MACOSX_RPATH ON) list(APPEND CMAKE_INSTALL_RPATH "@loader_path" "@executable_path" - "@loader_path/../lib" - "@executable_path/../lib" + "@loader_path/../${ARCHIVE_OUTPUT_DIRECTORY}" + "@executable_path/../${ARCHIVE_OUTPUT_DIRECTORY}" ) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) endif()