nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at python-updates 167 lines 6.4 kB view raw
1addCMakeParams() { 2 # NIXPKGS_CMAKE_PREFIX_PATH is like CMAKE_PREFIX_PATH except cmake 3 # will not search it for programs 4 addToSearchPath NIXPKGS_CMAKE_PREFIX_PATH $1 5} 6 7cmakeConfigurePhase() { 8 runHook preConfigure 9 10 # default to CMake defaults if unset 11 : ${cmakeBuildDir:=build} 12 13 export CTEST_OUTPUT_ON_FAILURE=1 14 if [ -n "${enableParallelChecking-1}" ]; then 15 export CTEST_PARALLEL_LEVEL=$NIX_BUILD_CORES 16 fi 17 18 if [ -z "${dontUseCmakeBuildDir-}" ]; then 19 mkdir -p "$cmakeBuildDir" 20 cd "$cmakeBuildDir" 21 : ${cmakeDir:=..} 22 else 23 : ${cmakeDir:=.} 24 fi 25 26 if [ -z "${dontAddPrefix-}" ]; then 27 prependToVar cmakeFlags "-DCMAKE_INSTALL_PREFIX=$prefix" 28 fi 29 30 # We should set the proper `CMAKE_SYSTEM_NAME`. 31 # http://www.cmake.org/Wiki/CMake_Cross_Compiling 32 # 33 # Unfortunately cmake seems to expect absolute paths for ar, ranlib, and 34 # strip. Otherwise they are taken to be relative to the source root of the 35 # package being built. 36 prependToVar cmakeFlags "-DCMAKE_CXX_COMPILER=$CXX" 37 prependToVar cmakeFlags "-DCMAKE_C_COMPILER=$CC" 38 prependToVar cmakeFlags "-DCMAKE_AR=$(command -v $AR)" 39 prependToVar cmakeFlags "-DCMAKE_RANLIB=$(command -v $RANLIB)" 40 prependToVar cmakeFlags "-DCMAKE_STRIP=$(command -v $STRIP)" 41 42 # This installs shared libraries with a fully-specified install 43 # name. By default, cmake installs shared libraries with just the 44 # basename as the install name, which means that, on Darwin, they 45 # can only be found by an executable at runtime if the shared 46 # libraries are in a system path or in the same directory as the 47 # executable. This flag makes the shared library accessible from its 48 # nix/store directory. 49 prependToVar cmakeFlags "-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib" 50 51 # The docdir flag needs to include PROJECT_NAME as per GNU guidelines, 52 # try to extract it from CMakeLists.txt. 53 if [[ -z "$shareDocName" ]]; then 54 local cmakeLists="${cmakeDir}/CMakeLists.txt" 55 if [[ -f "$cmakeLists" ]]; then 56 local shareDocName="$(grep --only-matching --perl-regexp --ignore-case '\bproject\s*\(\s*"?\K([^[:space:]")]+)' < "$cmakeLists" | head -n1)" 57 fi 58 # The argument sometimes contains garbage or variable interpolation. 59 # When that is the case, let’s fall back to the derivation name. 60 if [[ -z "$shareDocName" ]] || echo "$shareDocName" | grep -q '[^a-zA-Z0-9_+-]'; then 61 if [[ -n "${pname-}" ]]; then 62 shareDocName="$pname" 63 else 64 shareDocName="$(echo "$name" | sed 's/-[^a-zA-Z].*//')" 65 fi 66 fi 67 fi 68 69 # This ensures correct paths with multiple output derivations 70 # It requires the project to use variables from GNUInstallDirs module 71 # https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html 72 prependToVar cmakeFlags "-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin" 73 prependToVar cmakeFlags "-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin" 74 prependToVar cmakeFlags "-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include" 75 prependToVar cmakeFlags "-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man" 76 prependToVar cmakeFlags "-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info" 77 prependToVar cmakeFlags "-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName}" 78 prependToVar cmakeFlags "-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib" 79 prependToVar cmakeFlags "-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec" 80 prependToVar cmakeFlags "-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale" 81 82 # Don’t build tests when doCheck = false 83 if [ -z "${doCheck-}" ]; then 84 prependToVar cmakeFlags "-DBUILD_TESTING=OFF" 85 fi 86 87 # Always build Release, to ensure optimisation flags 88 prependToVar cmakeFlags "-DCMAKE_BUILD_TYPE=${cmakeBuildType:-Release}" 89 90 # Disable user package registry to avoid potential side effects 91 # and unecessary attempts to access non-existent home folder 92 # https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#disabling-the-package-registry 93 prependToVar cmakeFlags "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" 94 prependToVar cmakeFlags "-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF" 95 prependToVar cmakeFlags "-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF" 96 97 if [ "${buildPhase-}" = ninjaBuildPhase ]; then 98 prependToVar cmakeFlags "-GNinja" 99 fi 100 101 local flagsArray=() 102 concatTo flagsArray cmakeFlags cmakeFlagsArray 103 104 echoCmd 'cmake flags' "${flagsArray[@]}" 105 106 cmake "$cmakeDir" "${flagsArray[@]}" 107 108 if ! [[ -v enableParallelBuilding ]]; then 109 enableParallelBuilding=1 110 echo "cmake: enabled parallel building" 111 fi 112 if [[ "$enableParallelBuilding" -ne 0 ]]; then 113 export CMAKE_BUILD_PARALLEL_LEVEL=$NIX_BUILD_CORES 114 fi 115 116 if ! [[ -v enableParallelInstalling ]]; then 117 enableParallelInstalling=1 118 echo "cmake: enabled parallel installing" 119 fi 120 121 runHook postConfigure 122} 123 124if [ -z "${dontUseCmakeConfigure-}" -a -z "${configurePhase-}" ]; then 125 setOutputFlags= 126 configurePhase=cmakeConfigurePhase 127fi 128 129addEnvHooks "$targetOffset" addCMakeParams 130 131makeCmakeFindLibs() { 132 isystem_seen= 133 iframework_seen= 134 for flag in ${NIX_CFLAGS_COMPILE-} ${NIX_LDFLAGS-}; do 135 if test -n "$isystem_seen" && test -d "$flag"; then 136 isystem_seen= 137 addToSearchPath CMAKE_INCLUDE_PATH "${flag}" 138 elif test -n "$iframework_seen" && test -d "$flag"; then 139 iframework_seen= 140 addToSearchPath CMAKE_FRAMEWORK_PATH "${flag}" 141 else 142 isystem_seen= 143 iframework_seen= 144 case $flag in 145 -I*) 146 addToSearchPath CMAKE_INCLUDE_PATH "${flag:2}" 147 ;; 148 -L*) 149 addToSearchPath CMAKE_LIBRARY_PATH "${flag:2}" 150 ;; 151 -F*) 152 addToSearchPath CMAKE_FRAMEWORK_PATH "${flag:2}" 153 ;; 154 -isystem) 155 isystem_seen=1 156 ;; 157 -iframework) 158 iframework_seen=1 159 ;; 160 esac 161 fi 162 done 163} 164 165# not using setupHook, because it could be a setupHook adding additional 166# include flags to NIX_CFLAGS_COMPILE 167postHooks+=(makeCmakeFindLibs)