Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmake: setup-hook.sh: add genCmakeDefaultFlags() #335682

Open
wants to merge 3 commits into
base: staging
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 92 additions & 84 deletions pkgs/by-name/cm/cmake/setup-hook.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,75 +9,20 @@ fixCmakeFiles() {
echo "fixing cmake files..."
find "$1" -type f \( -name "*.cmake" -o -name "*.cmake.in" -o -name CMakeLists.txt \) -print |
while read fn; do
sed -e 's^/usr\([ /]\|$\)^/var/empty\1^g' -e 's^/opt\([ /]\|$\)^/var/empty\1^g' < "$fn" > "$fn.tmp"
sed -e 's^/usr\([ /]\|$\)^/var/empty\1^g' -e 's^/opt\([ /]\|$\)^/var/empty\1^g' <"$fn" >"$fn.tmp"
mv "$fn.tmp" "$fn"
done
}

cmakeConfigurePhase() {
runHook preConfigure

# default to CMake defaults if unset
: ${cmakeBuildDir:=build}

export CTEST_OUTPUT_ON_FAILURE=1
if [ -n "${enableParallelChecking-1}" ]; then
export CTEST_PARALLEL_LEVEL=$NIX_BUILD_CORES
fi

if [ -z "${dontFixCmake-}" ]; then
fixCmakeFiles .
fi

if [ -z "${dontUseCmakeBuildDir-}" ]; then
mkdir -p "$cmakeBuildDir"
cd "$cmakeBuildDir"
: ${cmakeDir:=..}
else
: ${cmakeDir:=.}
fi

if [ -z "${dontAddPrefix-}" ]; then
prependToVar cmakeFlags "-DCMAKE_INSTALL_PREFIX=$prefix"
fi

# We should set the proper `CMAKE_SYSTEM_NAME`.
# http://www.cmake.org/Wiki/CMake_Cross_Compiling
#
# Unfortunately cmake seems to expect absolute paths for ar, ranlib, and
# strip. Otherwise they are taken to be relative to the source root of the
# package being built.
prependToVar cmakeFlags "-DCMAKE_CXX_COMPILER=$CXX"
prependToVar cmakeFlags "-DCMAKE_C_COMPILER=$CC"
prependToVar cmakeFlags "-DCMAKE_AR=$(command -v $AR)"
prependToVar cmakeFlags "-DCMAKE_RANLIB=$(command -v $RANLIB)"
prependToVar cmakeFlags "-DCMAKE_STRIP=$(command -v $STRIP)"

# on macOS we want to prefer Unix-style headers to Frameworks
# because we usually do not package the framework
prependToVar cmakeFlags "-DCMAKE_FIND_FRAMEWORK=LAST"

# we never want to use the global macOS SDK
prependToVar cmakeFlags "-DCMAKE_OSX_SYSROOT="

# correctly detect our clang compiler
prependToVar cmakeFlags "-DCMAKE_POLICY_DEFAULT_CMP0025=NEW"

# This installs shared libraries with a fully-specified install
# name. By default, cmake installs shared libraries with just the
# basename as the install name, which means that, on Darwin, they
# can only be found by an executable at runtime if the shared
# libraries are in a system path or in the same directory as the
# executable. This flag makes the shared library accessible from its
# nix/store directory.
prependToVar cmakeFlags "-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib"
genCmakeDefaultFlags() {
declare -ga cmakeDefaultFlags=()

# The docdir flag needs to include PROJECT_NAME as per GNU guidelines,
# try to extract it from CMakeLists.txt.
if [[ -z "$shareDocName" ]]; then
local cmakeLists="${cmakeDir}/CMakeLists.txt"
if [[ -f "$cmakeLists" ]]; then
local shareDocName="$(grep --only-matching --perl-regexp --ignore-case '\bproject\s*\(\s*"?\K([^[:space:]")]+)' < "$cmakeLists" | head -n1)"
local shareDocName="$(grep --only-matching --perl-regexp --ignore-case '\bproject\s*\(\s*"?\K([^[:space:]")]+)' <"$cmakeLists" | head -n1)"
fi
# The argument sometimes contains garbage or variable interpolation.
# When that is the case, let’s fall back to the derivation name.
Expand All @@ -90,41 +35,104 @@ cmakeConfigurePhase() {
fi
fi

# This ensures correct paths with multiple output derivations
# It requires the project to use variables from GNUInstallDirs module
# https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
prependToVar cmakeFlags "-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin"
prependToVar cmakeFlags "-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin"
prependToVar cmakeFlags "-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include"
prependToVar cmakeFlags "-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include"
prependToVar cmakeFlags "-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man"
prependToVar cmakeFlags "-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info"
prependToVar cmakeFlags "-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName}"
prependToVar cmakeFlags "-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib"
prependToVar cmakeFlags "-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec"
prependToVar cmakeFlags "-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale"
cmakeDefaultFlags+=(
# We should set the proper `CMAKE_SYSTEM_NAME`.
# http://www.cmake.org/Wiki/CMake_Cross_Compiling
#
# Unfortunately cmake seems to expect absolute paths for ar, ranlib, and
# strip. Otherwise they are taken to be relative to the source root of the
# package being built.
"-DCMAKE_CXX_COMPILER=$CXX"
"-DCMAKE_C_COMPILER=$CC"
"-DCMAKE_AR=$(command -v $AR)"
"-DCMAKE_RANLIB=$(command -v $RANLIB)"
"-DCMAKE_STRIP=$(command -v $STRIP)"

# on macOS we want to prefer Unix-style headers to Frameworks
# because we usually do not package the framework
"-DCMAKE_FIND_FRAMEWORK=LAST"

# we never want to use the global macOS SDK
"-DCMAKE_OSX_SYSROOT="

# correctly detect our clang compiler
"-DCMAKE_POLICY_DEFAULT_CMP0025=NEW"

# This installs shared libraries with a fully-specified install
# name. By default, cmake installs shared libraries with just the
# basename as the install name, which means that, on Darwin, they
# can only be found by an executable at runtime if the shared
# libraries are in a system path or in the same directory as the
# executable. This flag makes the shared library accessible from its
# nix/store directory.
"-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib"

# This ensures correct paths with multiple output derivations
# It requires the project to use variables from GNUInstallDirs module
# https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
"-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin"
"-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin"
"-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include"
"-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include"
"-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man"
"-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info"
"-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName}"
"-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib"
"-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec"
"-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale"

# Always build Release, to ensure optimisation flags
"-DCMAKE_BUILD_TYPE=${cmakeBuildType:-Release}"

# Disable user package registry to avoid potential side effects
# and unecessary attempts to access non-existent home folder
# https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#disabling-the-package-registry
"-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON"
"-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF"
"-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF"
)

if [ -z "${dontAddPrefix-}" ]; then
cmakeDefaultFlags+=("-DCMAKE_INSTALL_PREFIX=$prefix")
fi

# Don’t build tests when doCheck = false
if [ -z "${doCheck-}" ]; then
prependToVar cmakeFlags "-DBUILD_TESTING=OFF"
cmakeDefaultFlags+=("-DBUILD_TESTING=OFF")
fi

# Always build Release, to ensure optimisation flags
prependToVar cmakeFlags "-DCMAKE_BUILD_TYPE=${cmakeBuildType:-Release}"
if [ "${buildPhase-}" = ninjaBuildPhase ]; then
cmakeDefaultFlags+=("-GNinja")
fi
}

cmakeConfigurePhase() {
runHook preConfigure

# Disable user package registry to avoid potential side effects
# and unecessary attempts to access non-existent home folder
# https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#disabling-the-package-registry
prependToVar cmakeFlags "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON"
prependToVar cmakeFlags "-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF"
prependToVar cmakeFlags "-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF"
# default to CMake defaults if unset
: ${cmakeBuildDir:=build}

if [ "${buildPhase-}" = ninjaBuildPhase ]; then
prependToVar cmakeFlags "-GNinja"
export CTEST_OUTPUT_ON_FAILURE=1
if [ -n "${enableParallelChecking-1}" ]; then
export CTEST_PARALLEL_LEVEL=$NIX_BUILD_CORES
fi

if [ -z "${dontFixCmake-}" ]; then
fixCmakeFiles .
fi

if [ -z "${dontUseCmakeBuildDir-}" ]; then
mkdir -p "$cmakeBuildDir"
cd "$cmakeBuildDir"
: ${cmakeDir:=..}
else
: ${cmakeDir:=.}
fi

genCmakeDefaultFlags
ShamrockLee marked this conversation as resolved.
Show resolved Hide resolved

local flagsArray=()
concatTo flagsArray cmakeFlags cmakeFlagsArray
concatTo flagsArray cmakeDefaultFlags cmakeFlags cmakeFlagsArray

echoCmd 'cmake flags' "${flagsArray[@]}"

Expand Down