diff options
20 files changed, 491 insertions, 7 deletions
diff --git a/lib/systems/default.nix b/lib/systems/default.nix index fbd6c323bf425..d37ff720edce6 100644 --- a/lib/systems/default.nix +++ b/lib/systems/default.nix @@ -93,6 +93,7 @@ let else if final.isAndroid then "bionic" else if final.isLinux /* default */ then "glibc" else if final.isFreeBSD then "fblibc" + else if final.isOpenBSD then "oblibc" else if final.isNetBSD then "nblibc" else if final.isAvr then "avrlibc" else if final.isGhcjs then null diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix index 8a3726f369682..79ec4461e4193 100644 --- a/lib/systems/examples.nix +++ b/lib/systems/examples.nix @@ -342,6 +342,11 @@ rec { useLLVM = true; }; + x86_64-openbsd = { + config = "x86_64-unknown-openbsd"; + useLLVM = true; + }; + # # WASM # diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix index 4890912d7fed4..1d7c95943a794 100644 --- a/lib/systems/parse.nix +++ b/lib/systems/parse.nix @@ -469,6 +469,7 @@ rec { elem (elemAt l 2) [ "wasi" "redox" "mmixware" "ghcjs" "mingw32" ] || hasPrefix "freebsd" (elemAt l 2) || hasPrefix "netbsd" (elemAt l 2) || + hasPrefix "openbsd" (elemAt l 2) || hasPrefix "genode" (elemAt l 2) then { cpu = elemAt l 0; diff --git a/pkgs/os-specific/bsd/freebsd/lib/default.nix b/pkgs/os-specific/bsd/freebsd/lib/default.nix index 26119a8ba1968..d022f7cfa14c6 100644 --- a/pkgs/os-specific/bsd/freebsd/lib/default.nix +++ b/pkgs/os-specific/bsd/freebsd/lib/default.nix @@ -14,5 +14,5 @@ } .${stdenv'.hostPlatform.parsed.cpu.name} or stdenv'.hostPlatform.parsed.cpu.name; - install-wrapper = builtins.readFile ./install-wrapper.sh; + install-wrapper = builtins.readFile ../../lib/install-wrapper.sh; } diff --git a/pkgs/os-specific/bsd/freebsd/lib/install-wrapper.sh b/pkgs/os-specific/bsd/lib/install-wrapper.sh index 91a7a2679f209..91a7a2679f209 100644 --- a/pkgs/os-specific/bsd/freebsd/lib/install-wrapper.sh +++ b/pkgs/os-specific/bsd/lib/install-wrapper.sh diff --git a/pkgs/os-specific/bsd/netbsd/pkgs/install/package.nix b/pkgs/os-specific/bsd/netbsd/pkgs/install/package.nix index 69b0c073259e2..0fc6ca452be0d 100644 --- a/pkgs/os-specific/bsd/netbsd/pkgs/install/package.nix +++ b/pkgs/os-specific/bsd/netbsd/pkgs/install/package.nix @@ -17,12 +17,12 @@ # HACK: to ensure parent directories exist. This emulates GNU # install’s -D option. No alternative seems to exist in BSD install. let - binstall = writeShellScript "binstall" '' - set -eu - for last in "$@"; do true; done - mkdir -p $(dirname $last) - @out@/bin/xinstall "$@" - ''; + binstall = writeShellScript "binstall" ( + builtins.readFile ../../../lib/install-wrapper.sh + + '' + @out@/bin/xinstall "''${args[@]}" + '' + ); in mkDerivation { path = "usr.bin/xinstall"; diff --git a/pkgs/os-specific/bsd/openbsd/default.nix b/pkgs/os-specific/bsd/openbsd/default.nix new file mode 100644 index 0000000000000..00dba195b92f5 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/default.nix @@ -0,0 +1,49 @@ +{ + stdenv, + lib, + stdenvNoCC, + makeScopeWithSplicing', + generateSplicesForMkScope, + pkgs, + buildPackages, + netbsd, +}: + +makeScopeWithSplicing' { + otherSplices = generateSplicesForMkScope "openbsd"; + f = ( + self: + lib.packagesFromDirectoryRecursive { + callPackage = self.callPackage; + directory = ./pkgs; + } + // { + libc = self.callPackage ./pkgs/libc/package.nix { + inherit (self) csu include lorder; + inherit (buildPackages.openbsd) makeMinimal; + inherit (buildPackages.netbsd) + install + gencat + rpcgen + tsort + ; + }; + makeMinimal = buildPackages.netbsd.makeMinimal.override { inherit (self) make-rules; }; + mkDerivation = self.callPackage ./pkgs/mkDerivation.nix { + inherit stdenv; + inherit (buildPackages.netbsd) install; + }; + include = self.callPackage ./pkgs/include/package.nix { + inherit (buildPackages.openbsd) makeMinimal; + inherit (buildPackages.netbsd) install rpcgen mtree; + }; + csu = self.callPackage ./pkgs/csu.nix { + inherit (self) include; + inherit (buildPackages.openbsd) makeMinimal; + inherit (buildPackages.netbsd) install; + }; + make-rules = self.callPackage ./pkgs/make-rules/package.nix { }; + lorder = self.callPackage ./pkgs/lorder.nix { inherit (buildPackages.netbsd) install; }; + } + ); +} diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/csu.nix b/pkgs/os-specific/bsd/openbsd/pkgs/csu.nix new file mode 100644 index 0000000000000..a2b2153a729b1 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/csu.nix @@ -0,0 +1,22 @@ +{ + lib, + mkDerivation, + bsdSetupHook, + openbsdSetupHook, + makeMinimal, + install, + include, +}: + +mkDerivation { + path = "lib/csu"; + nativeBuildInputs = [ + bsdSetupHook + openbsdSetupHook + makeMinimal + install + ]; + buildInputs = [ include ]; + meta.platforms = lib.platforms.openbsd; + extraPaths = [ "libexec/ld.so" ]; +} diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/include/package.nix b/pkgs/os-specific/bsd/openbsd/pkgs/include/package.nix new file mode 100644 index 0000000000000..481e302065fc4 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/include/package.nix @@ -0,0 +1,57 @@ +{ + lib, + mkDerivation, + makeMinimal, + bsdSetupHook, + openbsdSetupHook, + install, + rpcgen, + mtree, + pax, + buildPackages, +}: +mkDerivation { + path = "include"; + noCC = true; + + extraPaths = [ + "lib" + #"sys" + "sys/arch" + # LDIRS from the mmakefile + "sys/crypto" + "sys/ddb" + "sys/dev" + "sys/isofs" + "sys/miscfs" + "sys/msdosfs" + "sys/net" + "sys/netinet" + "sys/netinet6" + "sys/netmpls" + "sys/net80211" + "sys/nfs" + "sys/ntfs" + "sys/scsi" + "sys/sys" + "sys/ufs" + "sys/uvm" + ]; + + nativeBuildInputs = [ + bsdSetupHook + install + makeMinimal + mtree + openbsdSetupHook + pax + rpcgen + ]; + + makeFlags = [ + "RPCGEN_CPP=${buildPackages.stdenv.cc.cc}/bin/cpp" + "-B" + ]; + + headersOnly = true; +} diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/libc/disable-librebuild.patch b/pkgs/os-specific/bsd/openbsd/pkgs/libc/disable-librebuild.patch new file mode 100644 index 0000000000000..58633861a826f --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/libc/disable-librebuild.patch @@ -0,0 +1,12 @@ +diff --git a/lib/libc/Makefile b/lib/libc/Makefile +index 4bb4b67fcbb..1c8a8e08e60 100644 +--- a/lib/libc/Makefile ++++ b/lib/libc/Makefile +@@ -6,7 +6,6 @@ + .include <bsd.own.mk> + + LIB=c +-LIBREBUILD=y + CLEANFILES+=tags Symbols.map + CFLAGS+=-Wimplicit + #CFLAGS+=-Werror diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/libc/netbsd-make-to-lower.patch b/pkgs/os-specific/bsd/openbsd/pkgs/libc/netbsd-make-to-lower.patch new file mode 100644 index 0000000000000..e8d016ceead5a --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/libc/netbsd-make-to-lower.patch @@ -0,0 +1,16 @@ +NetBSD's make uses `${variable:tl}` not `${variable:L}`. + +diff --git a/lib/libc/Makefile b/lib/libc/Makefile +index 4bb4b67fcbb..ffb35c196ea 100644 +--- a/lib/libc/Makefile ++++ b/lib/libc/Makefile +@@ -11,8 +11,8 @@ CLEANFILES+=tags Symbols.map + CFLAGS+=-Wimplicit + #CFLAGS+=-Werror + LDADD=-nostdlib +-.if ${COMPILER_VERSION:L} == "clang" ++.if ${COMPILER_VERSION:tl} == "clang" + LDADD+=-lcompiler_rt + .else + LDADD+=-lgcc + .endif diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/libc/package.nix b/pkgs/os-specific/bsd/openbsd/pkgs/libc/package.nix new file mode 100644 index 0000000000000..cf233c827840a --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/libc/package.nix @@ -0,0 +1,120 @@ +{ + lib, + stdenv, + mkDerivation, + bsdSetupHook, + openbsdSetupHook, + makeMinimal, + install, + flex, + byacc, + gencat, + rpcgen, + lorder, + csu, + include, + ctags, + tsort, + llvmPackages, + fetchpatch, +}: + +mkDerivation rec { + pname = "libc"; + path = "lib/libc"; + extraPaths = [ + "lib/csu/os-note-elf.h" + "sys/arch" + + "lib/libm" + "lib/libpthread" + "lib/librpcsvc" + "lib/librpcsvc" + "lib/librthread" + "lib/libutil" + ]; + + patches = [ + ./netbsd-make-to-lower.patch + ./disable-librebuild.patch + (fetchpatch { + url = "https://marc.info/?l=openbsd-tech&m=171575286706032&q=raw"; + sha256 = "sha256-2fqabJZLUvXUIWe5WZ4NrTOwgQCXqH49Wo0hAPu5lu0="; + }) + ]; + + nativeBuildInputs = [ + bsdSetupHook + openbsdSetupHook + makeMinimal + install + flex + byacc + gencat + rpcgen + ctags + lorder + tsort + ]; + + buildInputs = [ + include + csu + ]; + + env.NIX_CFLAGS_COMPILE = builtins.toString [ + "-B${csu}/lib" + "-Wno-error" + ]; + + # Suppress lld >= 16 undefined version errors + # https://github.com/freebsd/freebsd-src/commit/2ba84b4bcdd6012e8cfbf8a0d060a4438623a638 + env.NIX_LDFLAGS = lib.optionalString (stdenv.hostPlatform.linker == "lld") "--undefined-version"; + + makeFlags = [ + "STRIP=-s" # flag to install, not command + "COMPILER_VERSION=clang" + "LIBC_TAGS=no" + ]; + + postInstall = '' + symlink_so () { + pushd $out/lib + ln -s "lib$1".so.* "lib$1.so" + popd + } + + symlink_so c + + pushd ${include} + find . -type d -exec mkdir -p $out/\{} \; + find . \( -type f -o -type l \) -exec cp -pr \{} $out/\{} \; + popd + substituteInPlace $out/include/sys/time.h --replace "defined (_LIBC)" "true" + + pushd ${csu} + find . -type d -exec mkdir -p $out/\{} \; + find . \( -type f -o -type l \) -exec cp -pr \{} $out/\{} \; + popd + + NIX_CFLAGS_COMPILE+=" -B$out/lib" + NIX_CFLAGS_COMPILE+=" -I$out/include" + NIX_LDFLAGS+=" -L$out/lib" + + make -C $BSDSRCDIR/lib/libm $makeFlags + make -C $BSDSRCDIR/lib/libm $makeFlags install + symlink_so m + + make -C $BSDSRCDIR/lib/librthread $makeFlags + make -C $BSDSRCDIR/lib/librthread $makeFlags install + symlink_so pthread + + make -C $BSDSRCDIR/lib/librpcsvc $makeFlags + make -C $BSDSRCDIR/lib/librpcsvc $makeFlags install + symlink_so rpcsv + + make -C $BSDSRCDIR/lib/libutil $makeFlags + make -C $BSDSRCDIR/lib/libutil $makeFlags install + symlink_so util + ''; +} diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/lorder.nix b/pkgs/os-specific/bsd/openbsd/pkgs/lorder.nix new file mode 100644 index 0000000000000..25ff1fcbd14f6 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/lorder.nix @@ -0,0 +1,20 @@ +{ + lib, + mkDerivation, + bsdSetupHook, + openbsdSetupHook, + makeMinimal, + install, +}: + +mkDerivation { + path = "usr.bin/lorder"; + nativeBuildInputs = [ + bsdSetupHook + openbsdSetupHook + makeMinimal + install + ]; + + meta.platforms = lib.platforms.unix; +} diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/make-rules/netbsd-make-sinclude.patch b/pkgs/os-specific/bsd/openbsd/pkgs/make-rules/netbsd-make-sinclude.patch new file mode 100644 index 0000000000000..daaaff56e9b7d --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/make-rules/netbsd-make-sinclude.patch @@ -0,0 +1,15 @@ +NetBSD make prefers `.-include` to `sinclude` (without a dot) + +diff --git a/share/mk/bsd.dep.mk b/share/mk/bsd.dep.mk +index 7019adb57f7..277064eb5c2 100644 +--- a/share/mk/bsd.dep.mk ++++ b/share/mk/bsd.dep.mk +@@ -11,7 +11,7 @@ depend: + # catch22: don't include potentially bogus files we are going to clean + . if !(make(clean) || make(cleandir) || make(obj)) + . for o in ${DEPS} +- sinclude $o ++. -include "$o" + . endfor + . endif + .endif diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/make-rules/package.nix b/pkgs/os-specific/bsd/openbsd/pkgs/make-rules/package.nix new file mode 100644 index 0000000000000..1e7c705c0dfd0 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/make-rules/package.nix @@ -0,0 +1,36 @@ +{ + fetchpatch, + lib, + mkDerivation, + stdenv, +}: + +mkDerivation { + path = "share/mk"; + noCC = true; + + buildInputs = [ ]; + nativeBuildInputs = [ ]; + + dontBuild = true; + + patches = [ + (fetchpatch { + url = "https://marc.info/?l=openbsd-tech&m=171575284906018&q=raw"; + sha256 = "sha256-bigxJGbaf9mCmFXxLVzQpnUUaEMMDfF3eZkTXVzd6B8="; + }) + ./netbsd-make-sinclude.patch + ]; + + postPatch = '' + sed -i -E \ + -e 's|/usr/lib|\$\{LIBDIR\}|' \ + share/mk/bsd.prog.mk + ''; + + installPhase = '' + cp -r share/mk $out + ''; + + meta.platforms = lib.platforms.unix; +} diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/mkDerivation.nix b/pkgs/os-specific/bsd/openbsd/pkgs/mkDerivation.nix new file mode 100644 index 0000000000000..6c5bc5cd17193 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/mkDerivation.nix @@ -0,0 +1,91 @@ +{ + lib, + stdenv, + stdenvNoCC, + runCommand, + rsync, + source, + bsdSetupHook, + openbsdSetupHook, + makeMinimal, + install, +}: + +lib.makeOverridable ( + attrs: + let + stdenv' = if attrs.noCC or false then stdenvNoCC else stdenv; + in + stdenv'.mkDerivation ( + rec { + pname = "${attrs.pname or (baseNameOf attrs.path)}-openbsd"; + version = "0"; + src = runCommand "${pname}-filtered-src" { nativeBuildInputs = [ rsync ]; } '' + for p in ${lib.concatStringsSep " " ([ attrs.path ] ++ attrs.extraPaths or [ ])}; do + set -x + path="$out/$p" + mkdir -p "$(dirname "$path")" + src_path="${source}/$p" + if [[ -d "$src_path" ]]; then src_path+=/; fi + rsync --chmod="+w" -r "$src_path" "$path" + set +x + done + ''; + + extraPaths = [ ]; + + nativeBuildInputs = [ + bsdSetupHook + openbsdSetupHook + makeMinimal + install + ]; + + HOST_SH = stdenv'.shell; + + # Since STRIP below is the flag + STRIPBIN = "${stdenv.cc.bintools.targetPrefix}strip"; + + makeFlags = [ + "STRIP=-s" # flag to install, not command + "-B" + ]; + + MACHINE_ARCH = + { + # amd64 not x86_64 for this on unlike NetBSD + x86_64 = "amd64"; + aarch64 = "arm64"; + i486 = "i386"; + i586 = "i386"; + i686 = "i386"; + } + .${stdenv'.hostPlatform.parsed.cpu.name} or stdenv'.hostPlatform.parsed.cpu.name; + + MACHINE = MACHINE_ARCH; + + MACHINE_CPU = MACHINE_ARCH; + + MACHINE_CPUARCH = MACHINE_ARCH; + + COMPONENT_PATH = attrs.path or null; + + strictDeps = true; + + meta = with lib; { + maintainers = with maintainers; [ ericson2314 ]; + platforms = platforms.openbsd; + license = licenses.bsd2; + }; + } + // lib.optionalAttrs stdenv'.hasCC { + # TODO should CC wrapper set this? + CPP = "${stdenv'.cc.targetPrefix}cpp"; + } + // lib.optionalAttrs (attrs.headersOnly or false) { + installPhase = "includesPhase"; + dontBuild = true; + } + // attrs + ) +) diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/openbsdSetupHook/package.nix b/pkgs/os-specific/bsd/openbsd/pkgs/openbsdSetupHook/package.nix new file mode 100644 index 0000000000000..61147954812fd --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/openbsdSetupHook/package.nix @@ -0,0 +1,3 @@ +{ makeSetupHook }: + +makeSetupHook { name = "openbsd-setup-hook"; } ./setup-hook.sh diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/openbsdSetupHook/setup-hook.sh b/pkgs/os-specific/bsd/openbsd/pkgs/openbsdSetupHook/setup-hook.sh new file mode 100644 index 0000000000000..50e79bc2928a9 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/openbsdSetupHook/setup-hook.sh @@ -0,0 +1,21 @@ +addOpenBSDMakeFlags() { + makeFlags="INCSDIR=${!outputDev}/include $makeFlags" + makeFlags="MANDIR=${!outputMan}/share/man $makeFlags" +} + +fixOpenBSDInstallDirs() { + find "$BSDSRCDIR" -name Makefile -exec \ + sed -i -E \ + -e 's|/usr/include|${INCSDIR}|' \ + -e 's|/usr/bin|${BINDIR}|' \ + -e 's|/usr/lib|${LIBDIR}|' \ + {} \; +} + +setBinownBingrp() { + export BINOWN=$(id -u) + export BINGRP=$(id -g) +} + +preConfigureHooks+=(addOpenBSDMakeFlags) +postPatchHooks+=(fixOpenBSDInstallDirs setBinownBingrp) diff --git a/pkgs/os-specific/bsd/openbsd/pkgs/source.nix b/pkgs/os-specific/bsd/openbsd/pkgs/source.nix new file mode 100644 index 0000000000000..359c3f2fbc919 --- /dev/null +++ b/pkgs/os-specific/bsd/openbsd/pkgs/source.nix @@ -0,0 +1,8 @@ +{ fetchcvs }: + +fetchcvs { + cvsRoot = "anoncvs@anoncvs.fr.openbsd.org/cvs"; + module = "src"; + tag = "OPENBSD_7_5"; + sha256 = "sha256-hzdATew6h/FQV72SWtg3YvUXdPoGjm2SoUS7m3c3fSU="; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 47bf66cd84be1..22e8f6e5740ec 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -16284,6 +16284,7 @@ with pkgs; choose = platform: /**/ if platform.isDarwin then 16 else if platform.isFreeBSD then 16 + else if platform.isOpenBSD then 18 else if platform.isAndroid then 12 else if platform.isLinux then 17 else if platform.isWasm then 16 @@ -21019,6 +21020,7 @@ with pkgs; then targetPackages.darwin.iosSdkPkgs.libraries or darwin.iosSdkPkgs.libraries else targetPackages.darwin.LibsystemCross or (throw "don't yet have a `targetPackages.darwin.LibsystemCross for ${stdenv.targetPlatform.config}`") else if name == "fblibc" then targetPackages.freebsdCross.libc or freebsdCross.libc + else if name == "oblibc" then targetPackages.openbsdCross.libc or openbsdCross.libc else if name == "nblibc" then targetPackages.netbsdCross.libc or netbsdCross.libc else if name == "wasilibc" then targetPackages.wasilibc or wasilibc else if name == "relibc" then targetPackages.relibc or relibc @@ -40744,6 +40746,11 @@ with pkgs; stdenv = crossLibcStdenv; }; + openbsd = callPackage ../os-specific/bsd/openbsd { }; + openbsdCross = callPackage ../os-specific/bsd/openbsd { + stdenv = crossLibcStdenv; + }; + yrd = callPackage ../tools/networking/yrd { }; powershell = callPackage ../shells/powershell { }; |