From a9b18e95c4ae87b09a3b0a9a897404c81e664bea Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 18 Feb 2021 15:35:02 +0100 Subject: [PATCH] stdenv.cc: add proper C++ support --- overlay/default.nix | 9 +++++---- overlay/libcxx/default.nix | 16 ++++++++++++++++ overlay/llvm-11/default.nix | 13 +++++++++++++ packages/genodelabs/toolchain.nix | 7 +++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 overlay/libcxx/default.nix diff --git a/overlay/default.nix b/overlay/default.nix index bfc1ddb..ec6369c 100644 --- a/overlay/default.nix +++ b/overlay/default.nix @@ -79,6 +79,11 @@ in nullPkgs // { # keep libposix NEEDED }) coreutils); + gccForLibs = if targetPlatform.isGenode then + final.genodePackages.genodeSources.toolchain.cc + else + prev.gccForLibs; + gdb = addPatchesTarget [ ./gdb/genode.patch ] gdb; genodeLibcCross = callPackage ./libc { }; @@ -93,10 +98,6 @@ in nullPkgs // { else prev.grub2; - libconfig = - overrideAttrsHost (attrs: { configureFlags = [ "--disable-examples" ]; }) - libconfig; - libcCrossChooser = name: if stdenv.targetPlatform.isGenode then targetPackages.genodeLibcCross diff --git a/overlay/libcxx/default.nix b/overlay/libcxx/default.nix new file mode 100644 index 0000000..1dac71f --- /dev/null +++ b/overlay/libcxx/default.nix @@ -0,0 +1,16 @@ +{ genodePackages, symlinkJoin }: +let inherit (genodePackages) genodeSources; +in symlinkJoin { + name = "libcxx"; + paths = with genodePackages; [ stdcxx ]; + postBuild = '' + local headerDir="''${!outputDev}/include" + mkdir -p "$headerDir" + pushd ${genodeSources.ports.stdcxx}/* + cp -r \ + include/include/stdcxx/* \ + ${genodeSources}/repos/libports/include/stdcxx \ + "$headerDir" + popd + ''; +} diff --git a/overlay/llvm-11/default.nix b/overlay/llvm-11/default.nix index c291eb7..8ceb33b 100644 --- a/overlay/llvm-11/default.nix +++ b/overlay/llvm-11/default.nix @@ -96,12 +96,25 @@ let lldClang = if stdenv.targetPlatform.isGenode then wrapCCWith rec { cc = tools.clang-unwrapped; + gccForLibs = genodePackages.genodeSources.toolchain.cc; bintools = wrapBintoolsWith { inherit (tools) bintools; }; extraBuildCommands = with genodePackages.genodeSources; '' echo "--gcc-toolchain=${toolchain.cc}" >> $out/nix-support/cc-cflags echo "--sysroot=${genodeBase}" >> $out/nix-support/cc-cflags echo "-I${genodeBase}/include" >> $out/nix-support/cc-cflags echo "-L ${genodeBase}" >> $out/nix-support/cc-cflags + + for dir in ${gccForLibs}/${stdenv.targetPlatform.config}/include/c++/*; do + echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags + done + echo "-isystem ${genodePackages.genodeSources}/repos/libports/include/stdcxx" >> $out/nix-support/libcxx-cxxflags + for dir in ${genodePackages.genodeSources.ports.stdcxx}/*/include/stdcxx; do + echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags + echo "-isystem $dir/std" >> $out/nix-support/libcxx-cxxflags + echo "-isystem $dir/c_global" >> $out/nix-support/libcxx-cxxflags + done + + echo "${genodePackages.stdcxx}/lib/stdcxx.lib.so" >> $out/nix-support/libcxx-ldflags ''; } else diff --git a/packages/genodelabs/toolchain.nix b/packages/genodelabs/toolchain.nix index 1e5ad65..b26e6c0 100644 --- a/packages/genodelabs/toolchain.nix +++ b/packages/genodelabs/toolchain.nix @@ -62,8 +62,15 @@ let makeWrapper ''${BIN} x86_64-unknown-genode-''${BIN#$out/bin/genode-x86-} done popd + ln -s $out/aarch64-none-elf $out/aarch64-unknown-genode + ln -s $out/arm-none-eabi $out/arm-unknown-genode + ln -s $out/riscv64-unknown-elf $out/riscv-unknown-genode + ln -s $out/x86_64-pc-elf $out/x86_64-unknown-genode ''; } // { + # Needed by the GCC wrapper. + langC = true; + langCC = true; isGNU = true; targetPrefix = { aarch64-genode = "genode-arm-";