I’m trying to compile OpenWrt on macOS, with build dependencies installed by nix. It’s pretty straightforward with Homebrew, where you install build dependencies and then just build it, but OpenWrt can only be built successfully with native cc like /usr/bin/clang
, this makes it challenging to build with nix.
I’ve tried all the following methods, and all failed:
1. Use nix develop
to create the build environment.
This doesn’t work because I use pkg.mkShell and it provides its own cc. I also tried pkg.mkShellNoCC
, but it still comes with its own cc. I also tried adding this as a build dependency:
cc = pkgs.runCommand "cc-wrapper" { } ''
mkdir -p $out/bin
ln -s /usr/bin/cc $out/bin/cc
ln -s /usr/bin/gcc $out/bin/gcc
ln -s /usr/bin/llvm-gcc $out/bin/llvm-gcc
ln -s /usr/bin/clang $out/bin/clang
ln -s /usr/bin/clang++ $out/bin/clang++
ln -s /usr/bin/ld $out/bin/ld
'';
but the compiling would then fail with ld: library not found for -lSystem
, I guess the stdenv probably changed how ld finds library, I couldn’t figure out how to restore it. It should be controlled by $LIBRARY_PATH
, but in my nix develop shell, it was empty, which is what it’s supposed to be.
2. Install all build dependencies in configuration.nix
This almost worked, since stdenv was no longer in play, but because $PKG_CONFIG_PATH
wouldn’t be set up, some dependencies wouldn’t be found.
I’d prefer using nix develop
if possible. I wonder if it’s possible to set up an stdenv that uses the native CC on the macOS? I also tried a minimal stdenv like this, but it still comes with its own cc:
pkgs.mkShell.override {
stdenv = pkgs.stdenvNoCC.override {
cc = null;
preHook = "";
allowedRequisites = null;
extraNativeBuildInputs = [];
};
};