Here is a simple shell.nix
:
with (import <nixpkgs> {});
(mkShell.override {stdenv = llvmPackages_latest.stdenv;}) {
buildInputs = [
cmake
gtest
];
}
which produces the following NIX_CFLAGS_COMPILE
-frandom-seed=8nzawrykna
-isystem /nix/store/b4zvm3271fldf2pn3yj03vichy0k28kz-compiler-rt-libc-13.0.1-dev/include
-isystem /nix/store/d1mprylqwl2lgjg7ng7svz3ryvf5m563-gtest-1.11.0-dev/include
-isystem /nix/store/b4zvm3271fldf2pn3yj03vichy0k28kz-compiler-rt-libc-13.0.1-dev/include
-isystem /nix/store/d1mprylqwl2lgjg7ng7svz3ryvf5m563-gtest-1.11.0-dev/include
It would be very convenient for developing cmake projects if there was an easy way to have
"-isystem ${gccForLibs}/include/c++/${gccForLibs.version}"
"-isystem ${gccForLibs}/include/c++/${gccForLibs.version}/${stdenv.targetPlatform.config}"
also included in NIX_CFLAGS_COMPILE
. This functionality already exists in cc-wrapper.sh
:
##
## General libc++ support
##
# We have a libc++ directly, we have one via "smuggled" GCC, or we have one
# bundled with the C compiler because it is GCC
+ optionalString (libcxx != null || (useGccForLibs && gccForLibs.langCC or false) || (isGNU && cc.langCC or false)) ''
touch "$out/nix-support/libcxx-cxxflags"
touch "$out/nix-support/libcxx-ldflags"
''
+ optionalString (libcxx == null && (useGccForLibs && gccForLibs.langCC or false)) ''
for dir in ${gccForLibs}/include/c++/*; do
echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags
done
for dir in ${gccForLibs}/include/c++/*/${targetPlatform.config}; do
echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags
done
''
+ optionalString (libcxx.isLLVM or false) (''
echo "-isystem ${lib.getDev libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags
echo "-stdlib=libc++" >> $out/nix-support/libcxx-ldflags
but as far as I can tell, the environment variable isCxx
isn’t an attribute of stdenv
which i can modify. Is there a way to trigger isCxx
that i am missing?
1 Like
Sorted all of this out this weekend. Firstly, a PR to stop the flag duplication in NIX_CFLAGS_COMPILE
: cc-wrapper/setup-hook.sh: remove duplicate flags in NIX_CFLAGS_COMPILE by danielbarter · Pull Request #191724 · NixOS/nixpkgs · GitHub .
Not super important, but it was bugging me. Secondly, reading the cc-wrapper.sh
code more closely, all of the command line arguments are being written to files in nix-support
. We can read those. For example, here is a shell.nix
with a clang standard environment that exposes all the foundational compilation flags + flags for dependencies:
with (import <nixpkgs> {});
let llvm = llvmPackages_latest;
in (mkShell.override {stdenv = llvm.stdenv;}) {
buildInputs = [
cmake
gtest
];
CXXFLAGS = builtins.concatStringsSep " " [
(lib.removeSuffix "\n" (builtins.readFile "${llvm.clang}/nix-support/cc-cflags"))
(lib.removeSuffix "\n" (builtins.readFile "${llvm.clang}/nix-support/libc-cflags"))
(lib.removeSuffix "\n" (builtins.readFile "${llvm.clang}/nix-support/libcxx-cxxflags"))
];
shellHook = "export CXXFLAGS+=$NIX_CFLAGS_COMPILE";
}
CXXFLAGS
is used by cmake
specifically, but you could use any environment variable you want.