Skip to content

Commit

Permalink
racket and racket-minimal: refactor for smaller minimal distribution
Browse files Browse the repository at this point in the history
  • Loading branch information
rc-zb committed Dec 15, 2024
1 parent 13c0d4c commit e346012
Show file tree
Hide file tree
Showing 7 changed files with 234 additions and 238 deletions.
11 changes: 11 additions & 0 deletions pkgs/by-name/ra/racket/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": "8.14",
"minimal": {
"filename": "racket-minimal-8.14-src.tgz",
"sha256": "fc1867c88c38410d9a30a5bc143265b1a9525b7a532ea3fbe025c9d79b5de6ca"
},
"full": {
"filename": "racket-8.14-src.tgz",
"sha256": "aab8cc0db336ed2d382803c708ad55a95fc52a4436c912f616f7c49d4845ae2c"
}
}
222 changes: 222 additions & 0 deletions pkgs/by-name/ra/racket/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
{
lib,
stdenv,
fetchurl,
coreutils,
libffi,
libiconvReal,
libz,
lz4,
ncurses,
libtool,

minimal ? false,

makeFontsConf,
freefont_ttf,
cairo,
fontconfig,
glib,
gmp,
gtk3,
gsettings-desktop-schemas,
libedit,
libjpeg,
libpng,
mpfr,
openssl,
pango,
poppler,
readline,
sqlite,
libGL,
libGLU,
cacert,
wrapGAppsHook3,
darwin,
glibcLocales,

disableDocs ? false,
}:

let
manifest = lib.importJSON ./manifest.json;
in

stdenv.mkDerivation (finalAttrs: {
pname = "racket" + lib.optionalString minimal "-minimal";
inherit (manifest) version;

src =
let
inherit (manifest.${if minimal then "minimal" else "full"}) filename sha256;
in
fetchurl {
url = "https://mirror.racket-lang.org/installers/${finalAttrs.version}/${filename}";
inherit sha256;
};

FONTCONFIG_FILE = if minimal then null else makeFontsConf { fontDirectories = [ freefont_ttf ]; };

LD_LIBRARY_PATH = lib.makeLibraryPath (
[ ncurses ]
++ lib.optionals (!minimal) (
[
cairo
fontconfig
glib
gmp
gtk3
gsettings-desktop-schemas
libedit
libjpeg
libpng
mpfr
openssl
pango
poppler
readline
sqlite
]
++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
libGL
libGLU
]
)
);

NIX_LDFLAGS = lib.concatStringsSep " " [
(lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isDarwin) "-lgcc_s")
];

nativeBuildInputs =
[ libtool ]
++ lib.optionals (!minimal) [
cacert
wrapGAppsHook3
];

buildInputs =
[
libffi
ncurses
libiconvReal
libz
lz4
]
++ lib.optionals (!minimal) (
[
fontconfig
sqlite
gsettings-desktop-schemas
gtk3
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
darwin.apple_sdk.frameworks.CoreFoundation
]
);

patches = [
/*
Hardcode variant detection because we wrap the Racket binary making it
fail to detect its variant at runtime.
See: https://github.com/NixOS/nixpkgs/issues/114993#issuecomment-812951247
*/
./force-cs-variant.patch

/*
The entry point binary $out/bin/racket is codesigned at least once. The
following error is triggered as a result.
(error 'add-ad-hoc-signature "file already has a signature")
We always remove the existing signature then call add-ad-hoc-signature to
circumvent this error.
*/
./force-remove-codesign-then-add.patch
];

preConfigure =
''
unset AR
for f in src/lt/configure src/cs/c/configure; do
substituteInPlace "$f" \
--replace-fail /usr/bin/uname ${coreutils}/bin/uname
done
# The configure script forces using `libtool -o` as AR on Darwin. But, the
# `-o` option is only available from Apple libtool. GNU ar works here.
substituteInPlace src/ChezScheme/zlib/configure \
--replace-fail 'ARFLAGS="-o"' 'AR=ar; ARFLAGS="rc"'
mkdir src/build
cd src/build
''
+ lib.optionalString (!minimal) (
lib.optionalString stdenv.hostPlatform.isLinux ''
gappsWrapperArgs+=("--prefix" "LD_LIBRARY_PATH" ":" ${finalAttrs.LD_LIBRARY_PATH})
gappsWrapperArgs+=("--set" "LOCALE_ARCHIVE" "${glibcLocales}/lib/locale/locale-archive")
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
gappsWrapperArgs+=("--prefix" "DYLD_LIBRARY_PATH" ":" ${finalAttrs.LD_LIBRARY_PATH})
''
);

shared = if stdenv.hostPlatform.isDarwin then "dylib" else "shared";
configureFlags =
[
"--enable-${finalAttrs.shared}"
"--enable-lt=${libtool}/bin/libtool"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
"--disable-strip"
"--enable-xonx"
]
++ lib.optional disableDocs "--disable-docs";

configureScript = "../configure";

/*
Cannot set DYLD_LIBRARY_PATH as an attr of this drv, becasue dynamic linker
environment variables like this are purged.
See: https://apple.stackexchange.com/a/212954/167199
Make builders feed it to dlopen(...). Do not expose all of $LD_LIBRARY_PATH
to DYLD_LIBRARY_PATH as the order of looking up symbols like
`__cg_jpeg_resync_to_restart` will be messed up. Our libJPEG.dyllib expects
it from our libTIFF.dylib, but instead it could not be found from the system
`libTIFF.dylib`. DYLD_FALLBACK_LIBRARY_PATH has its own problem, too.
*/
preBuild = lib.optionalString stdenv.hostPlatform.isDarwin ''
export DYLD_FALLBACK_LIBRARY_PATH="${finalAttrs.LD_LIBRARY_PATH}"
'';

dontStrip = stdenv.hostPlatform.isDarwin;

meta = {
description =
"Programmable programming language" + lib.optionalString minimal " (minimal distribution)";
longDescription =
''
Racket is a full-spectrum programming language. It goes beyond Lisp and
Scheme with dialects that support objects, types, laziness, and more.
Racket enables programmers to link components written in different
dialects, and it empowers programmers to create new, project-specific
dialects. Racket's libraries support applications from web servers and
databases to GUIs and charts.
''
+ lib.optionalString minimal ''
This minimal distribution includes just enough of Racket that you can use
`raco pkg` to install more.
'';
homepage = "https://racket-lang.org/";
changelog = "https://github.com/racket/racket/releases/tag/v${finalAttrs.version}";
license = with lib.licenses; [
mit
asl20
lgpl3Plus
];
maintainers = with lib.maintainers; [ rc-zb ];
mainProgram = "racket";
platforms = if minimal then lib.platforms.all else lib.platforms.unix;
};
})
Loading

0 comments on commit e346012

Please sign in to comment.