cmake: auto-detect MacPorts install layout for OpenMP, Qt6, and rpath

MacPorts nests libomp's headers/library under an extra 'libomp'
subdirectory and installs the Qt6 CMake package configs under
libexec/qt6 rather than lib/cmake, so find_package(OpenMP)/find_package(Qt6...)
did not see them without manually injecting OpenMP_ROOT/CMAKE_PREFIX_PATH
on the command line. Detect the MacPorts prefix (/opt/local) automatically,
same as already done for Homebrew, including in the install RPATH fallback.
This commit is contained in:
2026-07-27 08:55:07 +02:00
parent de86701efe
commit fe4aa98064
2 changed files with 25 additions and 3 deletions
+22 -1
View File
@@ -165,6 +165,17 @@ find_package(LibXml2 REQUIRED)
#--- check for OpenMP ---------------------------------------------------------
if (try_OpenMP)
#--- AppleClang has no built-in OpenMP runtime; MacPorts' 'libomp' port
#--- nests its headers/library one level deeper (include/libomp, lib/libomp)
#--- than the <prefix>/include, <prefix>/lib layout FindOpenMP.cmake looks
#--- for by default, so point it there directly if the port is installed. -
#--- (Only takes effect if the user hasn't already set OpenMP_ROOT.) ------
if (APPLE AND NOT DEFINED OpenMP_ROOT AND EXISTS "/opt/local/lib/libomp")
set(OpenMP_ROOT "/opt/local/lib/libomp" CACHE PATH "OpenMP root directory")
endif ()
if (APPLE AND EXISTS "/opt/local/include/libomp")
list(APPEND CMAKE_PREFIX_PATH "/opt/local/include/libomp")
endif ()
find_package(OpenMP)
if (OpenMP_CXX_FOUND)
add_compile_definitions(HAVE_GOMP)
@@ -210,6 +221,12 @@ endif (DKS_FOUND)
#--- check for Qt -------------------------------------------------------------
if (qt_based_tools)
#--- MacPorts installs the actual Qt6 tree, including its CMake package
#--- config files, under libexec/qt6 rather than directly under lib/cmake,
#--- so find_package(Qt6...) below would not see it otherwise. ------------
if (APPLE AND EXISTS "/opt/local/libexec/qt6/lib/cmake")
list(APPEND CMAKE_PREFIX_PATH "/opt/local/libexec/qt6/lib/cmake")
endif ()
# check for any Qt, i.e. AUTO
if (qt_version STREQUAL AUTO)
# try Qt6
@@ -383,7 +400,8 @@ if (UNIX AND NOT APPLE)
set(CMAKE_INSTALL_RPATH "${rpath}")
elseif (APPLE)
#--- on macOS the 3rd party libs typically come from Homebrew, which lives in
#--- /opt/homebrew (Apple silicon) or /usr/local (Intel) -------------------
#--- /opt/homebrew (Apple silicon) or /usr/local (Intel), or from MacPorts,
#--- which lives in /opt/local on both architectures -----------------------
set(rpath ${CMAKE_INSTALL_RPATH})
if (EXISTS "/opt/homebrew/lib")
string(APPEND rpath ";/opt/homebrew/lib")
@@ -391,6 +409,9 @@ elseif (APPLE)
if (EXISTS "/usr/local/lib")
string(APPEND rpath ";/usr/local/lib")
endif ()
if (EXISTS "/opt/local/lib")
string(APPEND rpath ";/opt/local/lib")
endif ()
set(CMAKE_INSTALL_RPATH "${rpath}")
endif ()
+3 -2
View File
@@ -6,8 +6,9 @@ set(MUSRFIT_INC ${CMAKE_SOURCE_DIR}/src/include)
# Hence, target_include_directories cannot be used here because, targets are
# setup only afterwards.
include_directories(${MUSRFIT_INC})
#--- note: FFTW3_INCLUDE is deliberately NOT added here. On a Homebrew based
#--- macOS it is /opt/homebrew/include, i.e. the complete 3rd party header tree,
#--- note: FFTW3_INCLUDE is deliberately NOT added here. On a Homebrew or
#--- MacPorts based macOS it is /opt/homebrew/include or /opt/local/include,
#--- i.e. the complete 3rd party header tree,
#--- and a global include_directories() would put it in front of the headers of
#--- every target below. The dictionaries below get it via their OPTIONS, and
#--- everything else via the FFTW3::FFTW3 imported target. ---------------------