nixpkgs/pkgs/by-name/fa/famistudio/build-native-wrapper.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

85 lines
2.4 KiB
Nix
Raw Normal View History

2024-12-04 18:56:59 +00:00
{
depname,
version,
src,
sourceRoot,
stdenv,
lib,
patches ? [ ],
extraPostPatch ? "",
buildInputs ? [ ],
2023-12-04 14:11:42 +00:00
}:
let
2024-12-04 18:56:59 +00:00
rebuildscriptName =
if stdenv.hostPlatform.isLinux then
"build_linux"
else if stdenv.hostPlatform.isDarwin then
"build_macos"
else
throw "Don't know how to rebuild FamiStudio's vendored ${depname} for ${stdenv.hostPlatform.system}";
2023-12-04 14:11:42 +00:00
in
stdenv.mkDerivation {
pname = "famistudio-nativedep-${depname}";
2024-12-04 18:56:59 +00:00
inherit
version
src
sourceRoot
patches
buildInputs
;
2023-12-04 14:11:42 +00:00
2024-12-04 18:56:59 +00:00
postPatch =
let
libnameBase = lib.optionalString stdenv.hostPlatform.isLinux "lib" + depname;
in
''
# Use one name for build script, eases with patching
mv ${rebuildscriptName}.sh build.sh
2023-12-04 14:11:42 +00:00
2024-12-04 18:56:59 +00:00
# Scripts use hardcoded compilers and try to copy built libraries into FamiStudio's build tree
# Not all scripts use the same compiler, so don't fail on replacing that
substituteInPlace build.sh \
--replace-fail '../../FamiStudio/' "$out/lib/" \
--replace-quiet 'g++' "$CXX"
2023-12-04 14:11:42 +00:00
2024-12-04 18:56:59 +00:00
# Replacing gcc via sed, would break -static-libgcc otherwise
sed -i -e "s/^gcc/$CC/g" build.sh
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
# Darwin rebuild scripts try to make a universal2 dylib
# - build dylib for non-hostPlatform
# - copy built library into special directory for later packaging script
# - join two dylibs together into a universal2 dylib
# Remove everything we don't need
sed -ri \
-e '/-target ${if stdenv.hostPlatform.isx86_64 then "arm64" else "x86_64"}/d' \
-e '/..\/..\/Setup/d' \
build.sh
2023-12-04 14:11:42 +00:00
2024-12-04 18:56:59 +00:00
# Replace joining multi-arch dylibs with copying dylib for target arch
substituteInPlace build.sh \
--replace-fail 'lipo -create -output ${libnameBase}.dylib' 'cp ${libnameBase}_${
if stdenv.hostPlatform.isx86_64 then "x86_64" else "arm64"
}.dylib ${libnameBase}.dylib #'
''
+ extraPostPatch;
2023-12-04 14:11:42 +00:00
dontConfigure = true;
dontInstall = true; # rebuild script automatically installs
buildPhase = ''
runHook preBuild
mkdir -p $out/lib
# Delete all prebuilt libraries, make sure everything is rebuilt
find . -name '*.so' -or -name '*.dylib' -or -name '*.a' -delete
# When calling normally, an error won't cause derivation to fail
source ./build.sh
runHook postBuild
'';
}