From 4d1176759e772e2e4927fb12a0d582f6a934da3a Mon Sep 17 00:00:00 2001 From: bakpaul Date: Tue, 24 Jun 2025 16:16:17 -0400 Subject: [PATCH] Apply changes regarding modularization of cmake paths --- CMakeLists.txt | 8 +++-- cmake/environment.cmake | 67 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 cmake/environment.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a44792..711854e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.22) project(Sofa.Qt LANGUAGES CXX) +include(cmake/environment.cmake) + # Detect if component is compiled outside SOFA if ("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") find_package(Sofa.Config REQUIRED) @@ -373,7 +375,7 @@ endif() # FFMPEG if(FFMPEG_EXEC_FOUND) - install(PROGRAMS "${FFMPEG_EXEC_FILE}" DESTINATION bin COMPONENT applications) + install(PROGRAMS "${FFMPEG_EXEC_FILE}" DESTINATION ${RUNTIME_OUTPUT_DIRECTORY} COMPONENT applications) endif() find_package(SofaPython3 QUIET) @@ -387,7 +389,7 @@ set(FFMPEG_EXEC_PATH "${FFMPEG_EXEC_FILE}") # absolute path for build dir, see . configure_file(${CMAKE_CURRENT_SOURCE_DIR}/etc/${PROJECT_NAME}.ini.in "${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}.ini") set(RESOURCES_DIR "../share/sofa/gui/qt") get_filename_component(FFMPEG_EXEC_FILENAME "${FFMPEG_EXEC_FILE}" NAME) -set(FFMPEG_EXEC_PATH "../bin/${FFMPEG_EXEC_FILENAME}") # relative path for install dir, see .ini file +set(FFMPEG_EXEC_PATH "../${RUNTIME_OUTPUT_DIRECTORY}/${FFMPEG_EXEC_FILENAME}") # relative path for install dir, see .ini file configure_file(${CMAKE_CURRENT_SOURCE_DIR}/etc/${PROJECT_NAME}.ini.in "${CMAKE_BINARY_DIR}/etc/installed${PROJECT_NAME}.ini") install(FILES "${CMAKE_BINARY_DIR}/etc/installed${PROJECT_NAME}.ini" DESTINATION etc RENAME ${PROJECT_NAME}.ini COMPONENT applications) @@ -404,5 +406,5 @@ sofa_create_package_with_targets( # Qt deployment if(CMAKE_SYSTEM_NAME STREQUAL Windows) include(windeployqt) - windeployqt(${PROJECT_NAME} ${CMAKE_BINARY_DIR}/bin bin) + windeployqt(${PROJECT_NAME} ${CMAKE_BINARY_DIR}/${RUNTIME_OUTPUT_DIRECTORY} ${RUNTIME_OUTPUT_DIRECTORY}) endif() diff --git a/cmake/environment.cmake b/cmake/environment.cmake new file mode 100644 index 0000000..f3c8d02 --- /dev/null +++ b/cmake/environment.cmake @@ -0,0 +1,67 @@ +# CMake modules path, for our FindXXX.cmake modules +list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) +list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules) +list(APPEND CMAKE_PREFIX_PATH ${PROJECT_BINARY_DIR}) +list(APPEND CMAKE_PREFIX_PATH ${PROJECT_BINARY_DIR}/extlibs) + +## Default build type +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Release") +endif() + +## Force default install prefix +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install/${PROJECT_NAME}" CACHE PATH "Install path prefix, prepended onto install directories." FORCE) +endif() +message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") + +## Set the output directories globally + +## 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} ) + +## RPATH +if(UNIX) + # RPATH is a field in ELF binaries that is used as a hint by the system + # loader to find needed shared libraries. + # + # In the build directory, cmake creates binaries with absolute paths in + # RPATH. And by default, it strips RPATH from installed binaries. Here we + # use CMAKE_INSTALL_RPATH to set a relative RPATH. By doing so, we avoid + # the need to play with LD_LIBRARY_PATH to get applications to run. + + # see https://cmake.org/Wiki/CMake_RPATH_handling for $ORIGIN doc + set(CMAKE_INSTALL_RPATH + "$ORIGIN/../lib" + "$$ORIGIN/../lib" + ) + + if(APPLE) + set(CMAKE_MACOSX_RPATH ON) + list(APPEND CMAKE_INSTALL_RPATH + "@loader_path" + "@loader_path/../lib" + "@executable_path" + "@executable_path/../lib" + ) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + endif() +endif(UNIX)