some dependency inversion: make sure gcc does not depend on retro68_tools

This commit is contained in:
Wolfgang Thaller
2021-11-24 23:26:24 +01:00
parent 90b7a3332d
commit 273f7eacba
2 changed files with 139 additions and 140 deletions

View File

@@ -41,13 +41,12 @@ using std::string;
using std::vector;
using std::ofstream;
string argvZero;
string realLdPath;
void RealLD(vector<string> args)
{
vector<const char*> argv;
string realLD = argvZero + ".real";
argv.push_back(realLD.c_str());
argv.push_back(realLdPath.c_str());
for(string& s : args)
argv.push_back(s.c_str());
argv.push_back(NULL);
@@ -90,10 +89,11 @@ int main(int argc, char *argv[])
{
vector<string> args;
std::copy(argv + 1, argv+argc, std::back_inserter(args));
argvZero = argv[0];
realLdPath = string(argv[0]) + ".real";
if (char *path = getenv("RETRO68_REAL_LD"))
realLdPath = path;
if(boost::algorithm::ends_with(argv[0], "ld"))
{
string outputFile = "a.out";
string entryPoint = "_start";
bool elf2mac = false;
@@ -107,7 +107,14 @@ int main(int argc, char *argv[])
vector<string> args2;
for(auto p = args.begin(), e = args.end(); p != e; ++p)
{
if(*p == "-o")
if(*p == "--elf2mac-real-ld")
{
++p;
if(p == e)
errx(EXIT_FAILURE, "--elf2mac-real-ld missing argument");
realLdPath = *p;
}
else if(*p == "-o")
{
++p;
if(p == e)
@@ -210,14 +217,4 @@ int main(int argc, char *argv[])
RealLD(args);
}
return 0;
}
else
{
if(argc != 2)
errx(EXIT_FAILURE, "usage : %s file-name ", argv[0]);
Object theObject(argv[1]);
SegmentMap segmentMap;
theObject.MultiSegmentApp("out.bin", segmentMap);
}
return 0;
}

View File

@@ -154,32 +154,29 @@
[ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ]
++ stdenv.targetPlatform.retro68BinutilsConfig or [ ];
enableParallelBuilding = true;
};
# retro68_binutils_with_tools -- binutils with ld wrapped by retro68_tools.Elf2Mac
retro68_binutils_with_tools = with pkgs;
if stdenv.targetPlatform.system == "m68k-macos" then
symlinkJoin {
name = "retro68_binutils_with_tools";
paths = [ retro68_binutils buildPackages.retro68_tools ];
postInstall = let
ld = "$out/bin/${stdenv.targetPlatform.config}-ld";
ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real";
# Move the real linker aside and install symlinks to Elf2Mac
postBuild = ''
mv $out/bin/m68k-apple-macos-ld $out/bin/m68k-apple-macos-ld.real
mv $out/m68k-apple-macos/bin/ld $out/m68k-apple-macos/bin/ld.real
ln -s $out/bin/Elf2Mac $out/bin/m68k-apple-macos-ld
ln -s $out/bin/Elf2Mac $out/m68k-apple-macos/bin/ld
in ''
mv ${ld} ${ld_real}
echo "#!${stdenv.shell}" > ${ld}
echo "exec \$'' + ''{RETRO68_LD_WRAPPER_${stdenv.targetPlatform.cmakeSystemName}-${ld_real}} \"\$@\"" >> ${ld}
chmod +x ${ld}
rm $out/${stdenv.targetPlatform.config}/bin/ld
ln -s ${ld} $out/${stdenv.targetPlatform.config}/bin/ld
'';
}
else
retro68_binutils;
};
# retro68_gcc -- gcc, without any wrappers
retro68_gcc = with pkgs;
stdenv.mkDerivation rec {
name = "retro68_gcc";
src = filterSrc (self + /gcc);
buildInputs = [ retro68_binutils_with_tools gmp mpfr libmpc ];
buildInputs = [ retro68_binutils gmp mpfr libmpc ];
configureFlags = [
"--target=${stdenv.targetPlatform.config}"
"--enable-languages=c,c++"
@@ -192,7 +189,7 @@
# nix does in-source builds by default, and something breaks
buildCommand = ''
mkdir -p $out/${stdenv.targetPlatform.config}/bin
ln -s ${retro68_binutils_with_tools}/${stdenv.targetPlatform.config}/bin/* $out/${stdenv.targetPlatform.config}/bin/
ln -s ${retro68_binutils}/${stdenv.targetPlatform.config}/bin/* $out/${stdenv.targetPlatform.config}/bin/
export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose"
$src/configure ${builtins.toString configureFlags} --prefix=$out
@@ -206,7 +203,7 @@
# binutils -- binutils with the wrappers provided by nixpkgs
binutils = if pkgs.stdenv.targetPlatform ? retro68 then
pkgs.wrapBintoolsWith {
bintools = pkgs.retro68_binutils_with_tools;
bintools = pkgs.retro68_binutils;
}
else
prev.binutils;
@@ -251,7 +248,12 @@
};
hook = pkgs.writeTextFile {
name = "retro68_setup_hook";
text = "export CMAKE_TOOLCHAIN_FILE=${toolchain}";
text = ''
export CMAKE_TOOLCHAIN_FILE=${toolchain}
'' + (pkgs.lib.optionalString (systemName == "Retro68") ''
export RETRO68_LD_WRAPPER_Retro68="${pkgs.buildPackages.retro68_tools}/bin/Elf2Mac"
export RETRO68_REAL_LD="${pkgs.buildPackages.retro68_binutils}/bin/m68k-apple-macos-ld.real"
'');
};
in pkgs.makeSetupHook { } hook;