nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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)