mirror of
https://github.com/autc04/Retro68.git
synced 2025-08-17 15:30:15 +00:00
some dependency inversion: make sure gcc does not depend on retro68_tools
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
42
flake.nix
42
flake.nix
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user