diff --git a/pkgs/by-name/cl/clean/chroot-build-support-do-not-rebuild-equal-timestamps.patch b/pkgs/by-name/cl/clean/chroot-build-support-do-not-rebuild-equal-timestamps.patch new file mode 100644 index 000000000000..3f0d0a25d3a7 --- /dev/null +++ b/pkgs/by-name/cl/clean/chroot-build-support-do-not-rebuild-equal-timestamps.patch @@ -0,0 +1,21 @@ +The clean command line compiler clm uses timestamps of dcl, icl, abc and o files +to decide what must be rebuild. However as for chroot builds, all of the +library files will have equal timestamps, this leads to clm trying to rebuild +the library modules distributed with the Clean installation every time a user +compiles any file, which fails ue to the absence of write permission on the Nix +store. + +This patch changes the freshness check to use less than instead of less than or +equal to in order to avoid this. + +--- b/src/clm/clm.c ++++ a/src/clm/clm.c +@@ -250,7 +250,7 @@ + || (t1.dwHighDateTime==t2.dwHighDateTime && (unsigned)(t1.dwLowDateTime)<=(unsigned)(t2.dwLowDateTime))) + #else + typedef unsigned long FileTime; +-# define FILE_TIME_LE(t1,t2) (t1<=t2) ++# define FILE_TIME_LE(t1,t2) (t1 (Int, Thread)) ++int start_caching_compiler_with_args (CleanCharArray coc_path, char** cocl_argv, int cocl_argv_size); + int call_caching_compiler (CleanCharArray args); + Clean (call_caching_compiler :: {#Char} Thread -> (Int, Thread)) + int stop_caching_compiler (void); diff --git a/pkgs/by-name/cl/clean/package.nix b/pkgs/by-name/cl/clean/package.nix new file mode 100644 index 000000000000..c75a7296b6ae --- /dev/null +++ b/pkgs/by-name/cl/clean/package.nix @@ -0,0 +1,80 @@ +{ + binutils, + fetchurl, + gcc, + lib, + runCommand, + stdenv, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "clean"; + version = "3.1"; + + src = + if stdenv.hostPlatform.system == "i686-linux" then + (fetchurl { + url = "https://ftp.cs.ru.nl/Clean/Clean31/linux/clean3.1_32_boot.tar.gz"; + sha256 = "Ls0IKf+o7yhRLhtSV61jzmnYukfh5x5fogHaP5ke/Ck="; + }) + else if stdenv.hostPlatform.system == "x86_64-linux" then + (fetchurl { + url = "https://ftp.cs.ru.nl/Clean/Clean31/linux/clean3.1_64_boot.tar.gz"; + sha256 = "Gg5CVZjrwDBtV7Vuw21Xj6Rn+qN1Mf6B3ls6r/16oBc="; + }) + else + throw "Architecture not supported"; + + hardeningDisable = [ "pic" ]; + + patches = [ + ./chroot-build-support-do-not-rebuild-equal-timestamps.patch + ./declare-functions-explicitly-for-gcc14.patch + ]; + + postPatch = '' + substituteInPlace Makefile \ + --replace-fail 'INSTALL_DIR = $(CURRENTDIR)' "INSTALL_DIR = $out" + substituteInPlace src/clm/clm.c \ + --replace-fail /usr/bin/as ${binutils}/bin/as \ + --replace-fail /usr/bin/gcc ${gcc}/bin/gcc + ''; + + buildFlags = [ "-C src/" ]; + + # do not strip libraries and executables since all symbols since they are + # required as is for compilation. Especially the labels of unused section need + # to be kept. + dontStrip = true; + + passthru.tests.compile-hello-world = runCommand "compile-hello-world" { } '' + cat >HelloWorld.icl <