From dd7fe83b9334bf21d72a1a09119c476a41d90060 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Mon, 22 Nov 2021 21:14:26 +0100 Subject: [PATCH 01/31] initial flake --- flake.nix | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 flake.nix diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..b02e1bb4c9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,188 @@ +{ + description = "Cross compilation toolchain for classic Macs"; + + # Nixpkgs / NixOS version to use. + inputs.nixpkgs.url = "nixpkgs/nixos-21.05"; + + inputs.multiversal_src.url = "github:autc04/multiversal"; + inputs.multiversal_src.flake = false; + + outputs = { self, nixpkgs, multiversal_src }: + let + + # System types to support. + supportedSystems = + [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ]; + + # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'. + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + + # Nixpkgs instantiated for supported system types. + nixpkgsFor = forAllSystems (system: + import nixpkgs { + inherit system; + overlays = [ self.overlay ]; + }); + + in { + + # A Nixpkgs overlay. + overlay = pkgs: prev: + let filterSrc = pkgs.nix-gitignore.gitignoreSource [ ]; + in { + + retro68_binutils_m68k = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_binutils_m68k"; + src = filterSrc (self + /binutils); + + configureFlags = [ "--target=m68k-apple-macos" "--disable-doc" ]; + enableParallelBuilding = true; + }; + + retro68_gcc_m68k = with pkgs; + stdenv.mkDerivation { + name = "retro68_gcc_m68k"; + src = filterSrc (self + /gcc); + buildInputs = [ retro68_binutils_m68k gmp mpfr libmpc ]; + configureFlags = [ + "--target=m68k-apple-macos" + "--enable-languages=c,c++" + "--with-arch=m68k" + "--with-cpu=m68000" + "--disable-libssp" + "MAKEINFO=missing" + ]; + hardeningDisable = [ "format" ]; + enableParallelBuilding = true; + + # nix does in-source builds by default, and something breaks + buildCommand = '' + mkdir -p $out/m68k-apple-macos/bin + ln -s ${retro68_binutils_m68k}/m68k-apple-macos/bin/* $out/m68k-apple-macos/bin/ + + export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose" + $src/configure "--target=m68k-apple-macos" "--enable-languages=c,c++" "--with-arch=m68k" "--with-cpu=m68000" "--disable-libssp" "MAKEINFO=missing" --prefix=$out + make -j$NIX_BUILD_CORES + make install + ''; + }; + + multiversal = with pkgs; + stdenv.mkDerivation { + name = "multiversal"; + src = multiversal_src; + nativeBuildInputs = + [ ruby retro68_gcc_m68k retro68_binutils_m68k ]; + buildCommand = '' + echo $src + build=`pwd` + (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") + mkdir $out + cp -r CIncludes $out/ + cp -r lib68k $out/ + ''; + }; + + hfsutils = with pkgs; + stdenv.mkDerivation { + name = "hfsutils"; + srcs = filterSrc (self + /hfsutils); + + preConfigure = '' + mkdir -p $out/bin + mkdir -p $out/lib + mkdir -p $out/include + mkdir -p $out/share/man/man1 + ''; + configureFlags = + [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; + }; + retro68_tools = with pkgs; + stdenv.mkDerivation { + name = "retro68_tools"; + src = nix-gitignore.gitignoreSource [ + "/*" + "!/CMakeLists.txt" + "!/libelf" # should perhaps use nixpkg's libelf instead? + "!/cmake" + "!/LaunchAPPL" + "!/libretro" + "!/PEFTools" + "!/ResourceFiles" + "!/Rez" + "!/Elf2Mac" + "!/ConvertObj" + "!/ConvertDiskImage" + ] self; + + nativeBuildInputs = [ cmake bison flex ]; + buildInputs = [ boost zlib hfsutils ]; + }; + + libretro_m68k = with pkgs; + let + #toolchainFile = retro68_gcc_m68k + "/m68k-apple-macos/cmake/retro68.toolchain.cmake"; + + toolchainFile = writeText "toolchain.cmake" '' + set( CMAKE_SYSTEM_NAME Retro68 ) + set( CMAKE_SYSTEM_VERSION 1) + + #set( REZ "@CMAKE_BINARY_DIR@/Rez/Rez" ) + #set( REZ_INCLUDE_PATH "${retro68_gcc_m68k}/RIncludes" ) + + set( CMAKE_C_COMPILER "${retro68_gcc_m68k}/bin/m68k-apple-macos-gcc" ) + set( CMAKE_CXX_COMPILER "${retro68_gcc_m68k}/bin/m68k-apple-macos-g++" ) + + set( CMAKE_C_STANDARD_INCLUDE_DIRECTORIES "${multiversal}/CIncludes" ) + set( CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "${multiversal}/CIncludes" ) + + list( APPEND CMAKE_MODULE_PATH "${self}/cmake" ) + + ''; + in pkgs.stdenvNoCC.mkDerivation { + name = "libretro_m68k"; + src = filterSrc (self + /libretro); + + nativeBuildInputs = with pkgs; [ + cmake + gnumake + retro68_gcc_m68k + retro68_binutils_m68k + multiversal + ]; + + buildCommand = '' + echo "Build command." + cmake $src \ + -DCMAKE_TOOLCHAIN_FILE=${toolchainFile} \ + -DCMAKE_INSTALL_PREFIX=$out \ + -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ + -DCMAKE_BUILD_TYPE=Release + cmake --build . + cmake --build . --target install + ''; + + # buildCommand = '' + # echo "Hello, world." + # #cmake $src -DCMAKE_MAKE_PROGRAM=${gnumake + "/bin/make"} -DCMAKE_TOOLCHAIN_FILE=${gcc_m68k + "/m68k-apple-macos/cmake/retro68.toolchain.cmake"} + # cmake --build . + # ''; + }; + + }; + + # Provide some binary packages for selected system types. + packages = forAllSystems (system: { + inherit (nixpkgsFor.${system}) + retro68_binutils_m68k retro68_gcc_m68k multiversal hfsutils + libretro_m68k retro68_tools; + }); + + # The default package for 'nix build'. This makes sense if the + # flake provides only one package or there is a clear "main" + # package. + defaultPackage = + forAllSystems (system: self.packages.${system}.retro68_gcc_m68k); + }; +} From 6c81b0cc511e9ee07eb9c48e67f08171904b0f96 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Mon, 22 Nov 2021 23:38:03 +0100 Subject: [PATCH 02/31] first cross CC --- flake.nix | 118 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 106 insertions(+), 12 deletions(-) diff --git a/flake.nix b/flake.nix index b02e1bb4c9..d441cdcc13 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,63 @@ overlays = [ self.overlay ]; }); + retroSystems = { + m68k = { + system = "m68k-macos"; + config = "m68k-apple-macos"; + libc = "retro68"; + parsed = { + cpu = { + name = "m68k"; + bits = 32; + significantByte = { name = "bigEndian"; }; + family = "m68k"; + }; + kernel = { + name = "macos"; + execFormat = { name = "unknown"; }; + }; + }; + bfdEmulation = "m68k"; + }; + powerpc = { + system = "powerpc-macos"; + config = "powerpc-apple-macos"; + libc = "newlib"; + parsed = { + cpu = { + name = "powerpc"; + bits = 32; + significantByte = { name = "bigEndian"; }; + family = "power"; + }; + kernel = { + name = "macos"; + execFormat = { name = "unknown"; }; + }; + }; + }; + carbon = { + system = "powerpc-carbon"; + config = "powerpc-apple-carbon"; + libc = "newlib"; + parsed = { + cpu = { + name = "powerpc"; + bits = 32; + significantByte = { name = "bigEndian"; }; + family = "power"; + }; + kernel = { + name = "carbon"; + execFormat = { name = "unknown"; }; + }; + }; + }; + }; + in { + inherit retroSystems; # A Nixpkgs overlay. overlay = pkgs: prev: @@ -39,6 +95,17 @@ configureFlags = [ "--target=m68k-apple-macos" "--disable-doc" ]; enableParallelBuilding = true; }; + retro68_binutils_m68k_wrapped = pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; noLibc = true; }; + + binutils = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then + pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; } + else prev.binutils; + + gcc = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then + pkgs.wrapCC pkgs.retro68_gcc_m68k + else prev.gcc; + + libcCrossChooser = name: if name == "retro68" then null else prev.libcCrossChooser name; retro68_gcc_m68k = with pkgs; stdenv.mkDerivation { @@ -102,18 +169,18 @@ stdenv.mkDerivation { name = "retro68_tools"; src = nix-gitignore.gitignoreSource [ - "/*" - "!/CMakeLists.txt" - "!/libelf" # should perhaps use nixpkg's libelf instead? - "!/cmake" - "!/LaunchAPPL" - "!/libretro" - "!/PEFTools" - "!/ResourceFiles" - "!/Rez" - "!/Elf2Mac" - "!/ConvertObj" - "!/ConvertDiskImage" + "/*" + "!/CMakeLists.txt" + "!/libelf" # should perhaps use nixpkg's libelf instead? + "!/cmake" + "!/LaunchAPPL" + "!/libretro" + "!/PEFTools" + "!/ResourceFiles" + "!/Rez" + "!/Elf2Mac" + "!/ConvertObj" + "!/ConvertDiskImage" ] self; nativeBuildInputs = [ cmake bison flex ]; @@ -170,6 +237,8 @@ # ''; }; + newlib = null; + }; # Provide some binary packages for selected system types. @@ -177,6 +246,31 @@ inherit (nixpkgsFor.${system}) retro68_binutils_m68k retro68_gcc_m68k multiversal hfsutils libretro_m68k retro68_tools; + + crosstest = let pkgs = + import nixpkgs { + inherit system; + overlays = [ self.overlay ]; + crossSystem = retroSystems.m68k; + }; + in + pkgs.stdenv.mkDerivation { + #nativeBuildInputs = [pkgs.binutils]; # [nixpkgsFor.${system}.retro68_binutils_m68k_wrapped]; + name = builtins.trace (pkgs.stdenvNoCC.targetPlatform) "crosstest"; + meta = { platforms = [ "m68k-macos" ]; }; + }; + + mingtest = let pkgs = + import nixpkgs { + inherit system; + overlays = [ self.overlay ]; + crossSystem = { config = "x86_64-w64-mingw32"; }; + }; + in + pkgs.stdenv.mkDerivation { + name = "mingtest"; + meta = { platforms = pkgs.lib.platforms.all; }; + }; }); # The default package for 'nix build'. This makes sense if the From 9cdf56d4d5b1eacabad72e190fab2be602969516 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 23 Nov 2021 00:19:23 +0100 Subject: [PATCH 03/31] cross compilation! --- flake.nix | 89 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 29 deletions(-) diff --git a/flake.nix b/flake.nix index d441cdcc13..7596e27375 100644 --- a/flake.nix +++ b/flake.nix @@ -95,17 +95,28 @@ configureFlags = [ "--target=m68k-apple-macos" "--disable-doc" ]; enableParallelBuilding = true; }; - retro68_binutils_m68k_wrapped = pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; noLibc = true; }; + retro68_binutils_m68k_wrapped = pkgs.wrapBintoolsWith { + bintools = pkgs.retro68_binutils_m68k; + noLibc = true; + }; binutils = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then - pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; } - else prev.binutils; + pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; } + else + prev.binutils; gcc = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then - pkgs.wrapCC pkgs.retro68_gcc_m68k - else prev.gcc; + pkgs.wrapCCWith { + cc = pkgs.retro68_gcc_m68k; + extraBuildCommands = '' + echo "" > $out/nix-support/add-hardening.sh + ''; + } + else + prev.gcc; - libcCrossChooser = name: if name == "retro68" then null else prev.libcCrossChooser name; + libcCrossChooser = name: + if name == "retro68" then null else prev.libcCrossChooser name; retro68_gcc_m68k = with pkgs; stdenv.mkDerivation { @@ -136,19 +147,23 @@ }; multiversal = with pkgs; - stdenv.mkDerivation { + stdenvNoCC.mkDerivation { name = "multiversal"; src = multiversal_src; - nativeBuildInputs = - [ ruby retro68_gcc_m68k retro68_binutils_m68k ]; + nativeBuildInputs = [ + buildPackages.ruby + buildPackages.retro68_gcc_m68k + buildPackages.retro68_binutils_m68k + ]; buildCommand = '' echo $src build=`pwd` (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") mkdir $out - cp -r CIncludes $out/ - cp -r lib68k $out/ + cp -r CIncludes $out/include + cp -r lib68k $out/lib ''; + meta = { platforms = [ "m68k-macos" ]; }; }; hfsutils = with pkgs; @@ -187,6 +202,26 @@ buildInputs = [ boost zlib hfsutils ]; }; + libretro = with pkgs; + pkgs.stdenv.mkDerivation { + name = "libretro"; + src = filterSrc (self + /libretro); + + nativeBuildInputs = with pkgs; [ buildPackages.cmake ]; + buildInputs = [ multiversal ]; + + buildCommand = '' + echo "Build command." + cmake $src \ + -DCMAKE_INSTALL_PREFIX=$out \ + -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ + -DCMAKE_BUILD_TYPE=Release + cmake --build . + cmake --build . --target install + ''; + meta = { platforms = [ "m68k-macos" ]; }; + }; + libretro_m68k = with pkgs; let #toolchainFile = retro68_gcc_m68k + "/m68k-apple-macos/cmake/retro68.toolchain.cmake"; @@ -236,9 +271,6 @@ # cmake --build . # ''; }; - - newlib = null; - }; # Provide some binary packages for selected system types. @@ -247,30 +279,29 @@ retro68_binutils_m68k retro68_gcc_m68k multiversal hfsutils libretro_m68k retro68_tools; - crosstest = let pkgs = - import nixpkgs { + crosstest = let + pkgs = import nixpkgs { inherit system; overlays = [ self.overlay ]; crossSystem = retroSystems.m68k; }; - in - pkgs.stdenv.mkDerivation { - #nativeBuildInputs = [pkgs.binutils]; # [nixpkgsFor.${system}.retro68_binutils_m68k_wrapped]; - name = builtins.trace (pkgs.stdenvNoCC.targetPlatform) "crosstest"; - meta = { platforms = [ "m68k-macos" ]; }; - }; + in pkgs.stdenv.mkDerivation { + #nativeBuildInputs = [pkgs.binutils]; # [nixpkgsFor.${system}.retro68_binutils_m68k_wrapped]; + buildInputs = [ pkgs.multiversal pkgs.libretro ]; + name = "crosstest"; + meta = { platforms = [ "m68k-macos" ]; }; + }; - mingtest = let pkgs = - import nixpkgs { + mingtest = let + pkgs = import nixpkgs { inherit system; overlays = [ self.overlay ]; crossSystem = { config = "x86_64-w64-mingw32"; }; }; - in - pkgs.stdenv.mkDerivation { - name = "mingtest"; - meta = { platforms = pkgs.lib.platforms.all; }; - }; + in pkgs.stdenv.mkDerivation { + name = "mingtest"; + meta = { platforms = pkgs.lib.platforms.all; }; + }; }); # The default package for 'nix build'. This makes sense if the From 09f857cc2b61e37478ee834ed64d79f702b654c4 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 23 Nov 2021 00:22:35 +0100 Subject: [PATCH 04/31] delete old stuff --- flake.nix | 54 ------------------------------------------------------ 1 file changed, 54 deletions(-) diff --git a/flake.nix b/flake.nix index 7596e27375..164f21d374 100644 --- a/flake.nix +++ b/flake.nix @@ -95,10 +95,6 @@ configureFlags = [ "--target=m68k-apple-macos" "--disable-doc" ]; enableParallelBuilding = true; }; - retro68_binutils_m68k_wrapped = pkgs.wrapBintoolsWith { - bintools = pkgs.retro68_binutils_m68k; - noLibc = true; - }; binutils = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; } @@ -221,56 +217,6 @@ ''; meta = { platforms = [ "m68k-macos" ]; }; }; - - libretro_m68k = with pkgs; - let - #toolchainFile = retro68_gcc_m68k + "/m68k-apple-macos/cmake/retro68.toolchain.cmake"; - - toolchainFile = writeText "toolchain.cmake" '' - set( CMAKE_SYSTEM_NAME Retro68 ) - set( CMAKE_SYSTEM_VERSION 1) - - #set( REZ "@CMAKE_BINARY_DIR@/Rez/Rez" ) - #set( REZ_INCLUDE_PATH "${retro68_gcc_m68k}/RIncludes" ) - - set( CMAKE_C_COMPILER "${retro68_gcc_m68k}/bin/m68k-apple-macos-gcc" ) - set( CMAKE_CXX_COMPILER "${retro68_gcc_m68k}/bin/m68k-apple-macos-g++" ) - - set( CMAKE_C_STANDARD_INCLUDE_DIRECTORIES "${multiversal}/CIncludes" ) - set( CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "${multiversal}/CIncludes" ) - - list( APPEND CMAKE_MODULE_PATH "${self}/cmake" ) - - ''; - in pkgs.stdenvNoCC.mkDerivation { - name = "libretro_m68k"; - src = filterSrc (self + /libretro); - - nativeBuildInputs = with pkgs; [ - cmake - gnumake - retro68_gcc_m68k - retro68_binutils_m68k - multiversal - ]; - - buildCommand = '' - echo "Build command." - cmake $src \ - -DCMAKE_TOOLCHAIN_FILE=${toolchainFile} \ - -DCMAKE_INSTALL_PREFIX=$out \ - -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ - -DCMAKE_BUILD_TYPE=Release - cmake --build . - cmake --build . --target install - ''; - - # buildCommand = '' - # echo "Hello, world." - # #cmake $src -DCMAKE_MAKE_PROGRAM=${gnumake + "/bin/make"} -DCMAKE_TOOLCHAIN_FILE=${gcc_m68k + "/m68k-apple-macos/cmake/retro68.toolchain.cmake"} - # cmake --build . - # ''; - }; }; # Provide some binary packages for selected system types. From 76b6e67f4e38b074bba06195e613c1dc98f221cc Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 23 Nov 2021 22:45:44 +0100 Subject: [PATCH 05/31] improve flake setup --- flake.nix | 63 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/flake.nix b/flake.nix index 164f21d374..84466de53b 100644 --- a/flake.nix +++ b/flake.nix @@ -42,11 +42,12 @@ }; }; bfdEmulation = "m68k"; + isStatic = true; }; powerpc = { system = "powerpc-macos"; config = "powerpc-apple-macos"; - libc = "newlib"; + libc = "retro68"; parsed = { cpu = { name = "powerpc"; @@ -63,7 +64,7 @@ carbon = { system = "powerpc-carbon"; config = "powerpc-apple-carbon"; - libc = "newlib"; + libc = "retro68"; parsed = { cpu = { name = "powerpc"; @@ -80,8 +81,6 @@ }; in { - inherit retroSystems; - # A Nixpkgs overlay. overlay = pkgs: prev: let filterSrc = pkgs.nix-gitignore.gitignoreSource [ ]; @@ -96,8 +95,24 @@ enableParallelBuilding = true; }; + retro68_binutils_m68k_with_tools = with pkgs; + symlinkJoin { + name = "retro68_buinutils_m68k_with_tools"; + paths = [ retro68_binutils_m68k buildPackages.retro68_tools ]; + + # 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 + ''; + }; + binutils = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then - pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils_m68k; } + pkgs.wrapBintoolsWith { + bintools = pkgs.retro68_binutils_m68k_with_tools; + } else prev.binutils; @@ -107,6 +122,7 @@ extraBuildCommands = '' echo "" > $out/nix-support/add-hardening.sh ''; + extraPackages = with pkgs.targetPackages; [ multiversal libretro ]; } else prev.gcc; @@ -118,7 +134,8 @@ stdenv.mkDerivation { name = "retro68_gcc_m68k"; src = filterSrc (self + /gcc); - buildInputs = [ retro68_binutils_m68k gmp mpfr libmpc ]; + buildInputs = + [ retro68_binutils_m68k_with_tools gmp mpfr libmpc ]; configureFlags = [ "--target=m68k-apple-macos" "--enable-languages=c,c++" @@ -133,7 +150,7 @@ # nix does in-source builds by default, and something breaks buildCommand = '' mkdir -p $out/m68k-apple-macos/bin - ln -s ${retro68_binutils_m68k}/m68k-apple-macos/bin/* $out/m68k-apple-macos/bin/ + ln -s ${retro68_binutils_m68k_with_tools}/m68k-apple-macos/bin/* $out/m68k-apple-macos/bin/ export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose" $src/configure "--target=m68k-apple-macos" "--enable-languages=c,c++" "--with-arch=m68k" "--with-cpu=m68000" "--disable-libssp" "MAKEINFO=missing" --prefix=$out @@ -143,14 +160,10 @@ }; multiversal = with pkgs; - stdenvNoCC.mkDerivation { + (pkgs.stdenv.override { cc = stdenv.cc.override { extraPackages = []; }; }).mkDerivation { name = "multiversal"; src = multiversal_src; - nativeBuildInputs = [ - buildPackages.ruby - buildPackages.retro68_gcc_m68k - buildPackages.retro68_binutils_m68k - ]; + nativeBuildInputs = [ buildPackages.ruby ]; buildCommand = '' echo $src build=`pwd` @@ -199,11 +212,11 @@ }; libretro = with pkgs; - pkgs.stdenv.mkDerivation { + (pkgs.stdenv.override { cc = stdenv.cc.override { extraPackages = []; }; }).mkDerivation { name = "libretro"; src = filterSrc (self + /libretro); - nativeBuildInputs = with pkgs; [ buildPackages.cmake ]; + nativeBuildInputs = [ buildPackages.cmake ]; buildInputs = [ multiversal ]; buildCommand = '' @@ -220,20 +233,22 @@ }; # Provide some binary packages for selected system types. - packages = forAllSystems (system: { + packages = forAllSystems (system: rec { inherit (nixpkgsFor.${system}) retro68_binutils_m68k retro68_gcc_m68k multiversal hfsutils libretro_m68k retro68_tools; - crosstest = let - pkgs = import nixpkgs { - inherit system; - overlays = [ self.overlay ]; - crossSystem = retroSystems.m68k; - }; + crossPkgs = (import nixpkgs { inherit system; }).lib.mapAttrs + (name: plat: + import nixpkgs { + inherit system; + overlays = [ self.overlay ]; + crossSystem = plat; + config = { allowUnsupportedSystem = true; }; + }) retroSystems; + + crosstest = let pkgs = crossPkgs.m68k; in pkgs.stdenv.mkDerivation { - #nativeBuildInputs = [pkgs.binutils]; # [nixpkgsFor.${system}.retro68_binutils_m68k_wrapped]; - buildInputs = [ pkgs.multiversal pkgs.libretro ]; name = "crosstest"; meta = { platforms = [ "m68k-macos" ]; }; }; From 08a619181e9940789e162c36a0d6cf653f5af07c Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 23 Nov 2021 22:45:54 +0100 Subject: [PATCH 06/31] set up editorconfig for .nix files --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index a8faf89def..ba4f753d26 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,6 +6,9 @@ indent_style = space tab_width = 4 charset = utf-8 +[*.nix] +tab_width = 2 + [InterfacesAndLibraries/**/*] indent_style = tab From 8349ce162aa515800127653e0325082cc3e65253 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 23 Nov 2021 22:46:22 +0100 Subject: [PATCH 07/31] nix: hide result-dev and similar directories --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7a686897de..34858dba26 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ CMakeLists.txt.user InterfacesAndLibraries .DS_Store .vscode -result +/result +/result-* From 15596305363fa505a1404de4b096d93a5ed3bbb5 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 23 Nov 2021 23:46:52 +0100 Subject: [PATCH 08/31] platform abstraction --- flake.nix | 73 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/flake.nix b/flake.nix index 84466de53b..1db924bebb 100644 --- a/flake.nix +++ b/flake.nix @@ -43,6 +43,9 @@ }; bfdEmulation = "m68k"; isStatic = true; + + retro68GccConfig = ["--with-arch=m68k" "--with-cpu=m68000"]; + retro68 = true; }; powerpc = { system = "powerpc-macos"; @@ -60,6 +63,10 @@ execFormat = { name = "unknown"; }; }; }; + + retro68BinutilsConfig = ["--disable-plugins"]; + retro68GccConfig = ["--disable-lto"]; + retro68 = true; }; carbon = { system = "powerpc-carbon"; @@ -78,47 +85,55 @@ }; }; }; + + retro68BinutilsConfig = ["--disable-plugins"]; + retro68GccConfig = ["--disable-lto"]; + retro68 = true; }; + in { # A Nixpkgs overlay. overlay = pkgs: prev: let filterSrc = pkgs.nix-gitignore.gitignoreSource [ ]; in { - retro68_binutils_m68k = with pkgs; + retro68_binutils = with pkgs; stdenv.mkDerivation rec { - name = "retro68_binutils_m68k"; + name = "retro68_binutils"; src = filterSrc (self + /binutils); - configureFlags = [ "--target=m68k-apple-macos" "--disable-doc" ]; + configureFlags = [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] + ++ stdenv.targetPlatform.retro68BinutilsConfig or []; enableParallelBuilding = true; }; - retro68_binutils_m68k_with_tools = with pkgs; - symlinkJoin { - name = "retro68_buinutils_m68k_with_tools"; - paths = [ retro68_binutils_m68k buildPackages.retro68_tools ]; + 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 ]; - # 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 - ''; - }; + # 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 + ''; + } + else binutils1; - binutils = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then + binutils = if pkgs.stdenv.targetPlatform ? retro68 then pkgs.wrapBintoolsWith { - bintools = pkgs.retro68_binutils_m68k_with_tools; + bintools = pkgs.retro68_binutils_with_tools; } else prev.binutils; - gcc = if pkgs.stdenv.targetPlatform.system == "m68k-macos" then + gcc = if pkgs.stdenv.targetPlatform ? retro68 then pkgs.wrapCCWith { - cc = pkgs.retro68_gcc_m68k; + cc = pkgs.retro68_gcc; extraBuildCommands = '' echo "" > $out/nix-support/add-hardening.sh ''; @@ -130,30 +145,28 @@ libcCrossChooser = name: if name == "retro68" then null else prev.libcCrossChooser name; - retro68_gcc_m68k = with pkgs; - stdenv.mkDerivation { - name = "retro68_gcc_m68k"; + retro68_gcc = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_gcc"; src = filterSrc (self + /gcc); buildInputs = - [ retro68_binutils_m68k_with_tools gmp mpfr libmpc ]; + [ retro68_binutils_with_tools gmp mpfr libmpc ]; configureFlags = [ - "--target=m68k-apple-macos" + "--target=${stdenv.targetPlatform.config}" "--enable-languages=c,c++" - "--with-arch=m68k" - "--with-cpu=m68000" "--disable-libssp" "MAKEINFO=missing" - ]; + ]++ stdenv.targetPlatform.retro68GccConfig or []; hardeningDisable = [ "format" ]; enableParallelBuilding = true; # nix does in-source builds by default, and something breaks buildCommand = '' - mkdir -p $out/m68k-apple-macos/bin - ln -s ${retro68_binutils_m68k_with_tools}/m68k-apple-macos/bin/* $out/m68k-apple-macos/bin/ + mkdir -p $out/${stdenv.targetPlatform.config}/bin + ln -s ${retro68_binutils_with_tools}/${stdenv.targetPlatform.config}/bin/* $out/${stdenv.targetPlatform.config}/bin/ export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose" - $src/configure "--target=m68k-apple-macos" "--enable-languages=c,c++" "--with-arch=m68k" "--with-cpu=m68000" "--disable-libssp" "MAKEINFO=missing" --prefix=$out + $src/configure ${builtins.toString configureFlags} --prefix=$out make -j$NIX_BUILD_CORES make install ''; From 48c76e72a861fee2f5dc1b5ddcc0a26230c61a9f Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 24 Nov 2021 00:07:29 +0100 Subject: [PATCH 09/31] minor fixes --- flake.nix | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index 1db924bebb..3400ca83c6 100644 --- a/flake.nix +++ b/flake.nix @@ -122,7 +122,7 @@ ln -s $out/bin/Elf2Mac $out/m68k-apple-macos/bin/ld ''; } - else binutils1; + else retro68_binutils; binutils = if pkgs.stdenv.targetPlatform ? retro68 then pkgs.wrapBintoolsWith { @@ -173,7 +173,7 @@ }; multiversal = with pkgs; - (pkgs.stdenv.override { cc = stdenv.cc.override { extraPackages = []; }; }).mkDerivation { + (stdenv.override { cc = stdenv.cc.override { extraPackages = []; }; }).mkDerivation { name = "multiversal"; src = multiversal_src; nativeBuildInputs = [ buildPackages.ruby ]; @@ -183,8 +183,13 @@ (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") mkdir $out cp -r CIncludes $out/include + '' + + (if stdenv.targetPlatform.system == "m68k-macos" then + '' cp -r lib68k $out/lib - ''; + '' + else "") + ; meta = { platforms = [ "m68k-macos" ]; }; }; From dc07bb2c932eb36cfb095eb8318fcedfc26709a6 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 24 Nov 2021 00:08:02 +0100 Subject: [PATCH 10/31] remove mingtest --- flake.nix | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/flake.nix b/flake.nix index 3400ca83c6..024f1eeb8e 100644 --- a/flake.nix +++ b/flake.nix @@ -270,17 +270,6 @@ name = "crosstest"; meta = { platforms = [ "m68k-macos" ]; }; }; - - mingtest = let - pkgs = import nixpkgs { - inherit system; - overlays = [ self.overlay ]; - crossSystem = { config = "x86_64-w64-mingw32"; }; - }; - in pkgs.stdenv.mkDerivation { - name = "mingtest"; - meta = { platforms = pkgs.lib.platforms.all; }; - }; }); # The default package for 'nix build'. This makes sense if the From 76826fb824e73001bd954a4748a47fef77592574 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 24 Nov 2021 00:28:28 +0100 Subject: [PATCH 11/31] powerpc cross compilation --- flake.nix | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 024f1eeb8e..e1970dc017 100644 --- a/flake.nix +++ b/flake.nix @@ -64,6 +64,7 @@ }; }; + isStatic = true; retro68BinutilsConfig = ["--disable-plugins"]; retro68GccConfig = ["--disable-lto"]; retro68 = true; @@ -86,6 +87,7 @@ }; }; + isStatic = true; retro68BinutilsConfig = ["--disable-plugins"]; retro68GccConfig = ["--disable-lto"]; retro68 = true; @@ -188,7 +190,11 @@ '' cp -r lib68k $out/lib '' - else "") + else + '' + mkdir $out/lib + cp -r ${self + "/ImportLibraries/*.a"} $out/lib/ + '') ; meta = { platforms = [ "m68k-macos" ]; }; }; From 347a21596d7b01d21d94c98501594b468ca099ae Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 24 Nov 2021 01:23:55 +0100 Subject: [PATCH 12/31] flake.nix cleanup --- flake.nix | 262 +++++++++++++++++++++++++++++------------------------- 1 file changed, 142 insertions(+), 120 deletions(-) diff --git a/flake.nix b/flake.nix index e1970dc017..4714af5624 100644 --- a/flake.nix +++ b/flake.nix @@ -44,7 +44,7 @@ bfdEmulation = "m68k"; isStatic = true; - retro68GccConfig = ["--with-arch=m68k" "--with-cpu=m68000"]; + retro68GccConfig = [ "--with-arch=m68k" "--with-cpu=m68000" ]; retro68 = true; }; powerpc = { @@ -65,8 +65,8 @@ }; isStatic = true; - retro68BinutilsConfig = ["--disable-plugins"]; - retro68GccConfig = ["--disable-lto"]; + retro68BinutilsConfig = [ "--disable-plugins" ]; + retro68GccConfig = [ "--disable-lto" ]; retro68 = true; }; carbon = { @@ -88,117 +88,19 @@ }; isStatic = true; - retro68BinutilsConfig = ["--disable-plugins"]; - retro68GccConfig = ["--disable-lto"]; + retro68BinutilsConfig = [ "--disable-plugins" ]; + retro68GccConfig = [ "--disable-lto" ]; retro68 = true; }; - in { # A Nixpkgs overlay. overlay = pkgs: prev: let filterSrc = pkgs.nix-gitignore.gitignoreSource [ ]; in { + # ----------- Native Tools ------------- - retro68_binutils = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_binutils"; - src = filterSrc (self + /binutils); - - configureFlags = [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] - ++ stdenv.targetPlatform.retro68BinutilsConfig or []; - enableParallelBuilding = true; - }; - - 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 ]; - - # 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 - ''; - } - else retro68_binutils; - - binutils = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapBintoolsWith { - bintools = pkgs.retro68_binutils_with_tools; - } - else - prev.binutils; - - gcc = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapCCWith { - cc = pkgs.retro68_gcc; - extraBuildCommands = '' - echo "" > $out/nix-support/add-hardening.sh - ''; - extraPackages = with pkgs.targetPackages; [ multiversal libretro ]; - } - else - prev.gcc; - - libcCrossChooser = name: - if name == "retro68" then null else prev.libcCrossChooser name; - - retro68_gcc = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_gcc"; - src = filterSrc (self + /gcc); - buildInputs = - [ retro68_binutils_with_tools gmp mpfr libmpc ]; - configureFlags = [ - "--target=${stdenv.targetPlatform.config}" - "--enable-languages=c,c++" - "--disable-libssp" - "MAKEINFO=missing" - ]++ stdenv.targetPlatform.retro68GccConfig or []; - hardeningDisable = [ "format" ]; - enableParallelBuilding = true; - - # 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/ - - export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose" - $src/configure ${builtins.toString configureFlags} --prefix=$out - make -j$NIX_BUILD_CORES - make install - ''; - }; - - multiversal = with pkgs; - (stdenv.override { cc = stdenv.cc.override { extraPackages = []; }; }).mkDerivation { - name = "multiversal"; - src = multiversal_src; - nativeBuildInputs = [ buildPackages.ruby ]; - buildCommand = '' - echo $src - build=`pwd` - (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") - mkdir $out - cp -r CIncludes $out/include - '' - + (if stdenv.targetPlatform.system == "m68k-macos" then - '' - cp -r lib68k $out/lib - '' - else - '' - mkdir $out/lib - cp -r ${self + "/ImportLibraries/*.a"} $out/lib/ - '') - ; - meta = { platforms = [ "m68k-macos" ]; }; - }; - + # hfsutils -- Utilities for manipulating HFS volumes & disk images. hfsutils = with pkgs; stdenv.mkDerivation { name = "hfsutils"; @@ -213,6 +115,8 @@ configureFlags = [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; }; + + # retro68_tools -- native tools that are part of Retro68 retro68_tools = with pkgs; stdenv.mkDerivation { name = "retro68_tools"; @@ -235,8 +139,127 @@ buildInputs = [ boost zlib hfsutils ]; }; + # ----------- Binutils & GCC ------------- + + # retro68_binutils -- binutils, without any wrappers + retro68_binutils = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_binutils"; + src = filterSrc (self + /binutils); + + configureFlags = + [ "--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 ]; + + # 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 + ''; + } + 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 ]; + configureFlags = [ + "--target=${stdenv.targetPlatform.config}" + "--enable-languages=c,c++" + "--disable-libssp" + "MAKEINFO=missing" + ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; + hardeningDisable = [ "format" ]; + enableParallelBuilding = true; + + # 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/ + + export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose" + $src/configure ${builtins.toString configureFlags} --prefix=$out + make -j$NIX_BUILD_CORES + make install + ''; + }; + + # ----------- Binutils & GCC wrapped for nixpkgs ------------- + + # binutils -- binutils with the wrappers provided by nixpkgs + binutils = if pkgs.stdenv.targetPlatform ? retro68 then + pkgs.wrapBintoolsWith { + bintools = pkgs.retro68_binutils_with_tools; + } + else + prev.binutils; + + # gcc -- gcc with the wrappers provided by nixpkgs + gcc = if pkgs.stdenv.targetPlatform ? retro68 then + pkgs.wrapCCWith { + cc = pkgs.retro68_gcc; + + # don't allow nix to add options for hardening + extraBuildCommands = '' + echo "" > $out/nix-support/add-hardening.sh + ''; + + extraPackages = with pkgs.targetPackages; [ + multiversal + libretro + ]; + } + else + prev.gcc; + + # no separate libc package for now + libcCrossChooser = name: + if name == "retro68" then null else prev.libcCrossChooser name; + + # ----------- Retro68 core libraries ------------- + + # multiversal -- multiversal interfaces + multiversal = with pkgs; + (stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "multiversal"; + src = multiversal_src; + nativeBuildInputs = [ buildPackages.ruby ]; + buildCommand = '' + echo $src + build=`pwd` + (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") + mkdir $out + cp -r CIncludes $out/include + cp -r RIncludes $out/ + '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' + cp -r lib68k $out/lib + '' else '' + mkdir $out/lib + cp -r ${self + "/ImportLibraries/*.a"} $out/lib/ + ''); + meta = { platforms = [ "m68k-macos" ]; }; + }; + libretro = with pkgs; - (pkgs.stdenv.override { cc = stdenv.cc.override { extraPackages = []; }; }).mkDerivation { + (pkgs.stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { name = "libretro"; src = filterSrc (self + /libretro); @@ -256,14 +279,13 @@ }; }; - # Provide some binary packages for selected system types. - packages = forAllSystems (system: rec { - inherit (nixpkgsFor.${system}) - retro68_binutils_m68k retro68_gcc_m68k multiversal hfsutils - libretro_m68k retro68_tools; + # Packages to export from this flake + packages = forAllSystems (system: + let pkgs = nixpkgsFor.${system}; + in rec { + inherit (pkgs) hfsutils retro68_tools; - crossPkgs = (import nixpkgs { inherit system; }).lib.mapAttrs - (name: plat: + crossPkgs = pkgs.lib.mapAttrs (name: plat: import nixpkgs { inherit system; overlays = [ self.overlay ]; @@ -271,17 +293,17 @@ config = { allowUnsupportedSystem = true; }; }) retroSystems; - crosstest = let pkgs = crossPkgs.m68k; - in pkgs.stdenv.mkDerivation { - name = "crosstest"; - meta = { platforms = [ "m68k-macos" ]; }; - }; - }); + shell = pkgs.lib.mapAttrs (name: cross: + cross.mkShell { + nativeBuildInputs = + [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; + }) crossPkgs; + }); # The default package for 'nix build'. This makes sense if the # flake provides only one package or there is a clear "main" # package. defaultPackage = - forAllSystems (system: self.packages.${system}.retro68_gcc_m68k); + forAllSystems (system: self.packages.${system}.shell.m68k); }; } From 90b7a3332dd17a3b0e1d60c24db6e6c60959c087 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 24 Nov 2021 22:07:10 +0100 Subject: [PATCH 13/31] setup hook supplying a cmake toolchain file --- flake.nix | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index 4714af5624..671670aad1 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Cross compilation toolchain for classic Macs"; # Nixpkgs / NixOS version to use. - inputs.nixpkgs.url = "nixpkgs/nixos-21.05"; + inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; inputs.multiversal_src.url = "github:autc04/multiversal"; inputs.multiversal_src.flake = false; @@ -46,6 +46,7 @@ retro68GccConfig = [ "--with-arch=m68k" "--with-cpu=m68000" ]; retro68 = true; + cmakeSystemName = "Retro68"; }; powerpc = { system = "powerpc-macos"; @@ -68,6 +69,7 @@ retro68BinutilsConfig = [ "--disable-plugins" ]; retro68GccConfig = [ "--disable-lto" ]; retro68 = true; + cmakeSystemName = "RetroPPC"; }; carbon = { system = "powerpc-carbon"; @@ -85,6 +87,7 @@ execFormat = { name = "unknown"; }; }; }; + cmakeSystemName = "RetroCarbon"; }; isStatic = true; @@ -213,7 +216,7 @@ pkgs.wrapCCWith { cc = pkgs.retro68_gcc; - # don't allow nix to add options for hardening + # don't allow nix to add options for hardening extraBuildCommands = '' echo "" > $out/nix-support/add-hardening.sh ''; @@ -221,6 +224,7 @@ extraPackages = with pkgs.targetPackages; [ multiversal libretro + retro68_setup_hook ]; } else @@ -230,6 +234,27 @@ libcCrossChooser = name: if name == "retro68" then null else prev.libcCrossChooser name; + retro68_setup_hook = let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) + + set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) + set( REZ_INCLUDE_PATH "${pkgs.multiversal}/RIncludes" ) + + include(${self + "/cmake/add_application.cmake"}) + ''; + }; + hook = pkgs.writeTextFile { + name = "retro68_setup_hook"; + text = "export CMAKE_TOOLCHAIN_FILE=${toolchain}"; + }; + in pkgs.makeSetupHook { } hook; + # ----------- Retro68 core libraries ------------- # multiversal -- multiversal interfaces @@ -264,7 +289,7 @@ src = filterSrc (self + /libretro); nativeBuildInputs = [ buildPackages.cmake ]; - buildInputs = [ multiversal ]; + buildInputs = [ multiversal retro68_setup_hook ]; buildCommand = '' echo "Build command." From 273f7eacba0fb3f2a71805b5c204e8267ae46d8e Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 24 Nov 2021 23:26:24 +0100 Subject: [PATCH 14/31] some dependency inversion: make sure gcc does not depend on retro68_tools --- Elf2Mac/Elf2Mac.cc | 233 ++++++++++++++++++++++----------------------- flake.nix | 46 ++++----- 2 files changed, 139 insertions(+), 140 deletions(-) diff --git a/Elf2Mac/Elf2Mac.cc b/Elf2Mac/Elf2Mac.cc index 48436b5b03..4a4589b2ed 100644 --- a/Elf2Mac/Elf2Mac.cc +++ b/Elf2Mac/Elf2Mac.cc @@ -41,13 +41,12 @@ using std::string; using std::vector; using std::ofstream; -string argvZero; +string realLdPath; void RealLD(vector args) { vector 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,134 +89,132 @@ int main(int argc, char *argv[]) { vector args; std::copy(argv + 1, argv+argc, std::back_inserter(args)); - argvZero = argv[0]; + realLdPath = string(argv[0]) + ".real"; - if(boost::algorithm::ends_with(argv[0], "ld")) + if (char *path = getenv("RETRO68_REAL_LD")) + realLdPath = path; + + string outputFile = "a.out"; + string entryPoint = "_start"; + bool elf2mac = false; + bool flatoutput = false; + bool segments = true; + bool stripMacsbug = false; + bool saveLdScript = false; + + SegmentMap segmentMap; + + vector args2; + for(auto p = args.begin(), e = args.end(); p != e; ++p) { - string outputFile = "a.out"; - string entryPoint = "_start"; - bool elf2mac = false; - bool flatoutput = false; - bool segments = true; - bool stripMacsbug = false; - bool saveLdScript = false; - - SegmentMap segmentMap; - - vector args2; - for(auto p = args.begin(), e = args.end(); p != e; ++p) + if(*p == "--elf2mac-real-ld") { - if(*p == "-o") - { - ++p; - if(p == e) - errx(EXIT_FAILURE, "-o missing argument"); - outputFile = *p; - } - else if(boost::algorithm::starts_with(*p, "-o")) - { - outputFile = (*p).substr(2); - } - else if(*p == "-elf2mac" || *p == "--elf2mac") - { - elf2mac = true; - } - else if(*p == "-e") - { - ++p; - if(p == e) - errx(EXIT_FAILURE, "-e missing argument"); - entryPoint = *p; - } - else if(boost::algorithm::starts_with(*p, "-e")) - { - entryPoint = (*p).substr(2); - } - else if(*p == "--mac-flat") - { - elf2mac = true; - flatoutput = true; - segments = false; - } - else if(*p == "--mac-single") - { - elf2mac = true; - flatoutput = false; - segments = false; - } - else if(*p == "--mac-segments") - { - elf2mac = true; - if(flatoutput) - errx(EXIT_FAILURE, "--mac-segments can't be used with --mac-flat"); - ++p; - if(p == e) - errx(EXIT_FAILURE, "--mac-segments missing argument"); - segmentMap = SegmentMap(*p); - } - else if(*p == "--mac-strip-macsbug") - { - stripMacsbug = true; - } - else if(*p == "--mac-keep-ldscript") - { - saveLdScript = true; - } - else - { - args2.push_back(*p); - } + ++p; + if(p == e) + errx(EXIT_FAILURE, "--elf2mac-real-ld missing argument"); + realLdPath = *p; } - - if(elf2mac) + else if(*p == "-o") { - char tmpfile[] = "/tmp/ldscriptXXXXXX"; - int fd = mkstemp(tmpfile); - if(fd < 0) - errx(EXIT_FAILURE, "can't create temp file"); - - { - ofstream out(tmpfile); - if(segments) - { - segmentMap.CreateLdScript(out, entryPoint, stripMacsbug); - } - else - { - CreateFlatLdScript(out, entryPoint, stripMacsbug); - } - } - - args2.push_back("-o"); - args2.push_back(outputFile + ".gdb"); - args2.push_back("-T"); - args2.push_back(tmpfile); - RealLD(args2); - if(saveLdScript) - std::cerr << "Ld Script at: " << tmpfile << std::endl; - else - unlink(tmpfile); - Object theObject(outputFile + ".gdb"); + ++p; + if(p == e) + errx(EXIT_FAILURE, "-o missing argument"); + outputFile = *p; + } + else if(boost::algorithm::starts_with(*p, "-o")) + { + outputFile = (*p).substr(2); + } + else if(*p == "-elf2mac" || *p == "--elf2mac") + { + elf2mac = true; + } + else if(*p == "-e") + { + ++p; + if(p == e) + errx(EXIT_FAILURE, "-e missing argument"); + entryPoint = *p; + } + else if(boost::algorithm::starts_with(*p, "-e")) + { + entryPoint = (*p).substr(2); + } + else if(*p == "--mac-flat") + { + elf2mac = true; + flatoutput = true; + segments = false; + } + else if(*p == "--mac-single") + { + elf2mac = true; + flatoutput = false; + segments = false; + } + else if(*p == "--mac-segments") + { + elf2mac = true; if(flatoutput) - theObject.FlatCode(outputFile); - else if(segments) - theObject.MultiSegmentApp(outputFile, segmentMap); - else - theObject.SingleSegmentApp(outputFile); + errx(EXIT_FAILURE, "--mac-segments can't be used with --mac-flat"); + ++p; + if(p == e) + errx(EXIT_FAILURE, "--mac-segments missing argument"); + segmentMap = SegmentMap(*p); + } + else if(*p == "--mac-strip-macsbug") + { + stripMacsbug = true; + } + else if(*p == "--mac-keep-ldscript") + { + saveLdScript = true; } else { - RealLD(args); + args2.push_back(*p); } - return 0; + } + + if(elf2mac) + { + char tmpfile[] = "/tmp/ldscriptXXXXXX"; + int fd = mkstemp(tmpfile); + if(fd < 0) + errx(EXIT_FAILURE, "can't create temp file"); + + { + ofstream out(tmpfile); + if(segments) + { + segmentMap.CreateLdScript(out, entryPoint, stripMacsbug); + } + else + { + CreateFlatLdScript(out, entryPoint, stripMacsbug); + } + } + + args2.push_back("-o"); + args2.push_back(outputFile + ".gdb"); + args2.push_back("-T"); + args2.push_back(tmpfile); + RealLD(args2); + if(saveLdScript) + std::cerr << "Ld Script at: " << tmpfile << std::endl; + else + unlink(tmpfile); + Object theObject(outputFile + ".gdb"); + if(flatoutput) + theObject.FlatCode(outputFile); + else if(segments) + theObject.MultiSegmentApp(outputFile, segmentMap); + else + theObject.SingleSegmentApp(outputFile); } else { - if(argc != 2) - errx(EXIT_FAILURE, "usage : %s file-name ", argv[0]); - Object theObject(argv[1]); - SegmentMap segmentMap; - theObject.MultiSegmentApp("out.bin", segmentMap); + RealLD(args); } return 0; } diff --git a/flake.nix b/flake.nix index 671670aad1..e4946fdbc3 100644 --- a/flake.nix +++ b/flake.nix @@ -154,32 +154,29 @@ [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; enableParallelBuilding = true; + + postInstall = let + ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; + ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; + + 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 + ''; }; - # 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 ]; - - # 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 - ''; - } - 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; From c0dbb90b0b71637fda5388c20fa3030876f103ce Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Thu, 25 Nov 2021 00:40:36 +0100 Subject: [PATCH 15/31] rez include paths --- Rez/Rez.cc | 12 ++++++++++++ cmake/add_application.cmake | 6 +++++- flake.nix | 20 +++++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Rez/Rez.cc b/Rez/Rez.cc index 5b24e4554f..a6a247a1ab 100644 --- a/Rez/Rez.cc +++ b/Rez/Rez.cc @@ -136,6 +136,18 @@ int main(int argc, const char *argv[]) for(std::string path : options["include"].as>()) lexer.addIncludePath(path); + if(const char *path = getenv("REZ_INCLUDE_PATH")) + { + while(const char* end = strchr(path, ':')) + { + if(end != path) + lexer.addIncludePath(std::string(path, end)); + path = end + 1; + } + if(*path) + lexer.addIncludePath(path); + } + if(world.verboseFlag) { std::cerr << "Compiling " << fn << "...\n"; diff --git a/cmake/add_application.cmake b/cmake/add_application.cmake index c899af741e..1a723dc286 100644 --- a/cmake/add_application.cmake +++ b/cmake/add_application.cmake @@ -23,11 +23,15 @@ function(add_application name) set(files) set(rsrc_files) set(rez_files) + + set(rez_include_options ${REZ_INCLUDE_PATH}) + list(TRANSFORM rez_include_options PREPEND -I) + foreach(f ${ARGS_FILES}) if(${f} MATCHES "\\.r$") add_custom_command( OUTPUT ${f}.rsrc.bin - COMMAND ${REZ} ${REZ_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${f} -I ${REZ_INCLUDE_PATH} -o ${f}.rsrc.bin + COMMAND ${REZ} ${REZ_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${f} ${rez_include_options} -o ${f}.rsrc.bin DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${f}) list(APPEND rsrc_files "${CMAKE_CURRENT_BINARY_DIR}/${f}.rsrc.bin") list(APPEND rez_files "${f}") diff --git a/flake.nix b/flake.nix index e4946fdbc3..8f8eb73257 100644 --- a/flake.nix +++ b/flake.nix @@ -241,7 +241,6 @@ set(CMAKE_CROSSCOMPILING TRUE) set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) - set( REZ_INCLUDE_PATH "${pkgs.multiversal}/RIncludes" ) include(${self + "/cmake/add_application.cmake"}) ''; @@ -250,6 +249,25 @@ name = "retro68_setup_hook"; text = '' export CMAKE_TOOLCHAIN_FILE=${toolchain} + + retro68_addRIncludes() { + echo "retro68_addRIncludes: $1 $depHostOffset" + case $depHostOffset in + -1) local role='BUILD_' ;; + 0) local role="" ;; + 1) local role='TARGET_' ;; + *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; + return 1 ;; + esac + + if [[ -d "$1/RIncludes" ]]; then + export REZ_INCLUDE_PATH+=":$1/RIncludes" + fi + } + + echo "targetOffset: $targetOffset" + addEnvHooks "$targetOffset" retro68_addRIncludes + '' + (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" From dff691c443fe0e043b863f0ca58dd3a7fa283996 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Thu, 25 Nov 2021 01:13:24 +0100 Subject: [PATCH 16/31] setup REZ_TEMPLATES_PATH --- flake.nix | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 8f8eb73257..41613ed6f7 100644 --- a/flake.nix +++ b/flake.nix @@ -241,6 +241,7 @@ set(CMAKE_CROSSCOMPILING TRUE) set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) + set(REZ_TEMPLATES_PATH ${pkgs.libretro}/RIncludes) include(${self + "/cmake/add_application.cmake"}) ''; @@ -302,6 +303,17 @@ }; libretro = with pkgs; + let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain-bootstrap"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) + ''; + }; + in (pkgs.stdenv.override { cc = stdenv.cc.override { extraPackages = [ ]; }; }).mkDerivation { @@ -309,14 +321,15 @@ src = filterSrc (self + /libretro); nativeBuildInputs = [ buildPackages.cmake ]; - buildInputs = [ multiversal retro68_setup_hook ]; + buildInputs = [ multiversal ]; buildCommand = '' echo "Build command." cmake $src \ -DCMAKE_INSTALL_PREFIX=$out \ -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=${toolchain} cmake --build . cmake --build . --target install ''; From 87bfd091303a893628696b9a93137fa1ab3bc808 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sat, 27 Nov 2021 01:29:55 +0100 Subject: [PATCH 17/31] plain default.nix --- default.nix | 360 +++++++++++++++++++++++++++++++++++++++++++++++---- flake.nix | 367 ---------------------------------------------------- 2 files changed, 338 insertions(+), 389 deletions(-) delete mode 100644 flake.nix diff --git a/default.nix b/default.nix index e32d96e78e..58ad98c233 100644 --- a/default.nix +++ b/default.nix @@ -1,27 +1,343 @@ { system ? builtins.currentSystem, pkgs ? import { inherit system; } , ... }: -pkgs.callPackage ({ - stdenv, cmake, ninja, bison, flex,ruby, boost, gmp, mpfr, libmpc, zlib, - lib, bash }: +let + retroSystems = { + m68k = { + system = "m68k-macos"; + config = "m68k-apple-macos"; + libc = "retro68"; + parsed = { + cpu = { + name = "m68k"; + bits = 32; + significantByte = { name = "bigEndian"; }; + family = "m68k"; + }; + kernel = { + name = "macos"; + execFormat = { name = "unknown"; }; + }; + }; + bfdEmulation = "m68k"; + isStatic = true; - stdenv.mkDerivation { - name = "retro68"; - nativeBuildInputs = [ cmake bison ruby flex ]; - buildInputs = [ - boost - gmp - mpfr - libmpc - zlib - bash - ]; - src = if lib.inNixShell then null else pkgs.nix-gitignore.gitignoreSource [ ] ./.; - - builder = ./nix/builder.sh; + retro68GccConfig = [ "--with-arch=m68k" "--with-cpu=m68000" ]; + retro68 = true; + cmakeSystemName = "Retro68"; + }; + powerpc = { + system = "powerpc-macos"; + config = "powerpc-apple-macos"; + libc = "retro68"; + parsed = { + cpu = { + name = "powerpc"; + bits = 32; + significantByte = { name = "bigEndian"; }; + family = "power"; + }; + kernel = { + name = "macos"; + execFormat = { name = "unknown"; }; + }; + }; - hardeningDisable = ["all"]; - } - - - ) { } + isStatic = true; + retro68BinutilsConfig = [ "--disable-plugins" ]; + retro68GccConfig = [ "--disable-lto" ]; + retro68 = true; + cmakeSystemName = "RetroPPC"; + }; + carbon = { + system = "powerpc-carbon"; + config = "powerpc-apple-carbon"; + libc = "retro68"; + parsed = { + cpu = { + name = "powerpc"; + bits = 32; + significantByte = { name = "bigEndian"; }; + family = "power"; + }; + kernel = { + name = "carbon"; + execFormat = { name = "unknown"; }; + }; + }; + cmakeSystemName = "RetroCarbon"; + }; + + isStatic = true; + retro68BinutilsConfig = [ "--disable-plugins" ]; + retro68GccConfig = [ "--disable-lto" ]; + retro68 = true; + }; + +in rec { + # A Nixpkgs overlay. + overlay = pkgs: prev: + { + # ----------- Native Tools ------------- + + # hfsutils -- Utilities for manipulating HFS volumes & disk images. + hfsutils = with pkgs; + stdenv.mkDerivation { + name = "hfsutils"; + srcs = ./hfsutils; + + preConfigure = '' + mkdir -p $out/bin + mkdir -p $out/lib + mkdir -p $out/include + mkdir -p $out/share/man/man1 + ''; + configureFlags = [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; + }; + + # retro68_tools -- native tools that are part of Retro68 + retro68_tools = with pkgs; + stdenv.mkDerivation { + name = "retro68_tools"; + src = nix-gitignore.gitignoreSource [ + "/*" + "!/CMakeLists.txt" + "!/libelf" # should perhaps use nixpkg's libelf instead? + "!/cmake" + "!/LaunchAPPL" + "!/libretro" + "!/PEFTools" + "!/ResourceFiles" + "!/Rez" + "!/Elf2Mac" + "!/ConvertObj" + "!/ConvertDiskImage" + ] ./.; + + nativeBuildInputs = [ cmake bison flex ]; + buildInputs = [ boost zlib hfsutils ]; + }; + + # ----------- Binutils & GCC ------------- + + # retro68_binutils -- binutils, without any wrappers + retro68_binutils = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_binutils"; + src = ./binutils; + + configureFlags = + [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] + ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; + enableParallelBuilding = true; + + postInstall = let + ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; + ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; + + 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 + ''; + }; + + # retro68_gcc -- gcc, without any wrappers + retro68_gcc = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_gcc"; + src = ./gcc; + buildInputs = [ retro68_binutils gmp mpfr libmpc ]; + configureFlags = [ + "--target=${stdenv.targetPlatform.config}" + "--enable-languages=c,c++" + "--disable-libssp" + "MAKEINFO=missing" + ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; + hardeningDisable = [ "format" ]; + enableParallelBuilding = true; + + # nix does in-source builds by default, and something breaks + buildCommand = '' + mkdir -p $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 + make -j$NIX_BUILD_CORES + make install + ''; + }; + + # ----------- Binutils & GCC wrapped for nixpkgs ------------- + + # binutils -- binutils with the wrappers provided by nixpkgs + binutils = if pkgs.stdenv.targetPlatform ? retro68 then + pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils; } + else + prev.binutils; + + # gcc -- gcc with the wrappers provided by nixpkgs + gcc = if pkgs.stdenv.targetPlatform ? retro68 then + pkgs.wrapCCWith { + cc = pkgs.retro68_gcc; + + # don't allow nix to add options for hardening + extraBuildCommands = '' + echo "" > $out/nix-support/add-hardening.sh + ''; + + extraPackages = with pkgs.targetPackages; [ + multiversal + import-libraries + libretro + retro68_setup_hook + ]; + } + else + prev.gcc; + + # no separate libc package for now + libcCrossChooser = name: + if name == "retro68" then null else prev.libcCrossChooser name; + + retro68_setup_hook = let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) + + set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) + set(REZ_TEMPLATES_PATH ${pkgs.libretro}/RIncludes) + + include(${./cmake/add_application.cmake}) + ''; + }; + hook = pkgs.writeTextFile { + name = "retro68_setup_hook"; + text = '' + export CMAKE_TOOLCHAIN_FILE=${toolchain} + + retro68_addRIncludes() { + echo "retro68_addRIncludes: $1 $depHostOffset" + case $depHostOffset in + -1) local role='BUILD_' ;; + 0) local role="" ;; + 1) local role='TARGET_' ;; + *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; + return 1 ;; + esac + + if [[ -d "$1/RIncludes" ]]; then + export REZ_INCLUDE_PATH+=":$1/RIncludes" + fi + } + + echo "targetOffset: $targetOffset" + addEnvHooks "$targetOffset" retro68_addRIncludes + + '' + (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; + + # ----------- Retro68 core libraries ------------- + + # multiversal -- multiversal interfaces + multiversal = with pkgs; + (stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "multiversal"; + src = ./multiversal; + nativeBuildInputs = [ buildPackages.ruby ]; + buildCommand = '' + echo $src + build=`pwd` + (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") + mkdir $out + cp -r CIncludes $out/include + cp -r RIncludes $out/ + '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' + cp -r lib68k $out/lib + '' else '' + ''); + meta = { platforms = [ "m68k-macos" ]; }; + }; + + import-libraries = with pkgs; + if stdenvNoCC.targetPlatform != retroSystems.m68k + then stdenvNoCC.mkDerivation { + name = "import-libraries"; + src = ./ImportLibraries; + buildCommand = '' + mkdir -p $out/lib + cp $src/*.a $out/lib/ + ''; + } + else null; + + libretro = with pkgs; + let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain-bootstrap"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) + ''; + }; + in (pkgs.stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "libretro"; + src = ./libretro; + + nativeBuildInputs = [ buildPackages.cmake ]; + buildInputs = [ multiversal ]; + + buildCommand = '' + echo "Build command." + cmake $src \ + -DCMAKE_INSTALL_PREFIX=$out \ + -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=${toolchain} + cmake --build . + cmake --build . --target install + ''; + meta = { platforms = [ "m68k-macos" ]; }; + }; + }; + + pkgs = import { + inherit system; + overlays = [ overlay ]; + }; + + crossPkgs = pkgs.lib.mapAttrs (name: plat: + import { + inherit system; + overlays = [ overlay ]; + crossSystem = plat; + config = { allowUnsupportedSystem = true; }; + }) retroSystems; + + shell = pkgs.lib.mapAttrs (name: cross: + cross.mkShell { + nativeBuildInputs = + [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; + }) crossPkgs; +} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 41613ed6f7..0000000000 --- a/flake.nix +++ /dev/null @@ -1,367 +0,0 @@ -{ - description = "Cross compilation toolchain for classic Macs"; - - # Nixpkgs / NixOS version to use. - inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; - - inputs.multiversal_src.url = "github:autc04/multiversal"; - inputs.multiversal_src.flake = false; - - outputs = { self, nixpkgs, multiversal_src }: - let - - # System types to support. - supportedSystems = - [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ]; - - # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'. - forAllSystems = nixpkgs.lib.genAttrs supportedSystems; - - # Nixpkgs instantiated for supported system types. - nixpkgsFor = forAllSystems (system: - import nixpkgs { - inherit system; - overlays = [ self.overlay ]; - }); - - retroSystems = { - m68k = { - system = "m68k-macos"; - config = "m68k-apple-macos"; - libc = "retro68"; - parsed = { - cpu = { - name = "m68k"; - bits = 32; - significantByte = { name = "bigEndian"; }; - family = "m68k"; - }; - kernel = { - name = "macos"; - execFormat = { name = "unknown"; }; - }; - }; - bfdEmulation = "m68k"; - isStatic = true; - - retro68GccConfig = [ "--with-arch=m68k" "--with-cpu=m68000" ]; - retro68 = true; - cmakeSystemName = "Retro68"; - }; - powerpc = { - system = "powerpc-macos"; - config = "powerpc-apple-macos"; - libc = "retro68"; - parsed = { - cpu = { - name = "powerpc"; - bits = 32; - significantByte = { name = "bigEndian"; }; - family = "power"; - }; - kernel = { - name = "macos"; - execFormat = { name = "unknown"; }; - }; - }; - - isStatic = true; - retro68BinutilsConfig = [ "--disable-plugins" ]; - retro68GccConfig = [ "--disable-lto" ]; - retro68 = true; - cmakeSystemName = "RetroPPC"; - }; - carbon = { - system = "powerpc-carbon"; - config = "powerpc-apple-carbon"; - libc = "retro68"; - parsed = { - cpu = { - name = "powerpc"; - bits = 32; - significantByte = { name = "bigEndian"; }; - family = "power"; - }; - kernel = { - name = "carbon"; - execFormat = { name = "unknown"; }; - }; - }; - cmakeSystemName = "RetroCarbon"; - }; - - isStatic = true; - retro68BinutilsConfig = [ "--disable-plugins" ]; - retro68GccConfig = [ "--disable-lto" ]; - retro68 = true; - }; - - in { - # A Nixpkgs overlay. - overlay = pkgs: prev: - let filterSrc = pkgs.nix-gitignore.gitignoreSource [ ]; - in { - # ----------- Native Tools ------------- - - # hfsutils -- Utilities for manipulating HFS volumes & disk images. - hfsutils = with pkgs; - stdenv.mkDerivation { - name = "hfsutils"; - srcs = filterSrc (self + /hfsutils); - - preConfigure = '' - mkdir -p $out/bin - mkdir -p $out/lib - mkdir -p $out/include - mkdir -p $out/share/man/man1 - ''; - configureFlags = - [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; - }; - - # retro68_tools -- native tools that are part of Retro68 - retro68_tools = with pkgs; - stdenv.mkDerivation { - name = "retro68_tools"; - src = nix-gitignore.gitignoreSource [ - "/*" - "!/CMakeLists.txt" - "!/libelf" # should perhaps use nixpkg's libelf instead? - "!/cmake" - "!/LaunchAPPL" - "!/libretro" - "!/PEFTools" - "!/ResourceFiles" - "!/Rez" - "!/Elf2Mac" - "!/ConvertObj" - "!/ConvertDiskImage" - ] self; - - nativeBuildInputs = [ cmake bison flex ]; - buildInputs = [ boost zlib hfsutils ]; - }; - - # ----------- Binutils & GCC ------------- - - # retro68_binutils -- binutils, without any wrappers - retro68_binutils = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_binutils"; - src = filterSrc (self + /binutils); - - configureFlags = - [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] - ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; - enableParallelBuilding = true; - - postInstall = let - ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; - ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; - - 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 - ''; - }; - - # retro68_gcc -- gcc, without any wrappers - retro68_gcc = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_gcc"; - src = filterSrc (self + /gcc); - buildInputs = [ retro68_binutils gmp mpfr libmpc ]; - configureFlags = [ - "--target=${stdenv.targetPlatform.config}" - "--enable-languages=c,c++" - "--disable-libssp" - "MAKEINFO=missing" - ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; - hardeningDisable = [ "format" ]; - enableParallelBuilding = true; - - # nix does in-source builds by default, and something breaks - buildCommand = '' - mkdir -p $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 - make -j$NIX_BUILD_CORES - make install - ''; - }; - - # ----------- Binutils & GCC wrapped for nixpkgs ------------- - - # binutils -- binutils with the wrappers provided by nixpkgs - binutils = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapBintoolsWith { - bintools = pkgs.retro68_binutils; - } - else - prev.binutils; - - # gcc -- gcc with the wrappers provided by nixpkgs - gcc = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapCCWith { - cc = pkgs.retro68_gcc; - - # don't allow nix to add options for hardening - extraBuildCommands = '' - echo "" > $out/nix-support/add-hardening.sh - ''; - - extraPackages = with pkgs.targetPackages; [ - multiversal - libretro - retro68_setup_hook - ]; - } - else - prev.gcc; - - # no separate libc package for now - libcCrossChooser = name: - if name == "retro68" then null else prev.libcCrossChooser name; - - retro68_setup_hook = let - systemName = pkgs.targetPlatform.cmakeSystemName; - toolchain = pkgs.writeTextFile { - name = "retro68-cmake-toolchain"; - text = '' - set(CMAKE_SYSTEM_NAME ${systemName}) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_CROSSCOMPILING TRUE) - - set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) - set(REZ_TEMPLATES_PATH ${pkgs.libretro}/RIncludes) - - include(${self + "/cmake/add_application.cmake"}) - ''; - }; - hook = pkgs.writeTextFile { - name = "retro68_setup_hook"; - text = '' - export CMAKE_TOOLCHAIN_FILE=${toolchain} - - retro68_addRIncludes() { - echo "retro68_addRIncludes: $1 $depHostOffset" - case $depHostOffset in - -1) local role='BUILD_' ;; - 0) local role="" ;; - 1) local role='TARGET_' ;; - *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; - return 1 ;; - esac - - if [[ -d "$1/RIncludes" ]]; then - export REZ_INCLUDE_PATH+=":$1/RIncludes" - fi - } - - echo "targetOffset: $targetOffset" - addEnvHooks "$targetOffset" retro68_addRIncludes - - '' + (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; - - # ----------- Retro68 core libraries ------------- - - # multiversal -- multiversal interfaces - multiversal = with pkgs; - (stdenv.override { - cc = stdenv.cc.override { extraPackages = [ ]; }; - }).mkDerivation { - name = "multiversal"; - src = multiversal_src; - nativeBuildInputs = [ buildPackages.ruby ]; - buildCommand = '' - echo $src - build=`pwd` - (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") - mkdir $out - cp -r CIncludes $out/include - cp -r RIncludes $out/ - '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' - cp -r lib68k $out/lib - '' else '' - mkdir $out/lib - cp -r ${self + "/ImportLibraries/*.a"} $out/lib/ - ''); - meta = { platforms = [ "m68k-macos" ]; }; - }; - - libretro = with pkgs; - let - systemName = pkgs.targetPlatform.cmakeSystemName; - toolchain = pkgs.writeTextFile { - name = "retro68-cmake-toolchain-bootstrap"; - text = '' - set(CMAKE_SYSTEM_NAME ${systemName}) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_CROSSCOMPILING TRUE) - ''; - }; - in - (pkgs.stdenv.override { - cc = stdenv.cc.override { extraPackages = [ ]; }; - }).mkDerivation { - name = "libretro"; - src = filterSrc (self + /libretro); - - nativeBuildInputs = [ buildPackages.cmake ]; - buildInputs = [ multiversal ]; - - buildCommand = '' - echo "Build command." - cmake $src \ - -DCMAKE_INSTALL_PREFIX=$out \ - -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE=${toolchain} - cmake --build . - cmake --build . --target install - ''; - meta = { platforms = [ "m68k-macos" ]; }; - }; - }; - - # Packages to export from this flake - packages = forAllSystems (system: - let pkgs = nixpkgsFor.${system}; - in rec { - inherit (pkgs) hfsutils retro68_tools; - - crossPkgs = pkgs.lib.mapAttrs (name: plat: - import nixpkgs { - inherit system; - overlays = [ self.overlay ]; - crossSystem = plat; - config = { allowUnsupportedSystem = true; }; - }) retroSystems; - - shell = pkgs.lib.mapAttrs (name: cross: - cross.mkShell { - nativeBuildInputs = - [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; - }) crossPkgs; - }); - - # The default package for 'nix build'. This makes sense if the - # flake provides only one package or there is a clear "main" - # package. - defaultPackage = - forAllSystems (system: self.packages.${system}.shell.m68k); - }; -} From dd85a3d89ca1933b428846f20267b90e504b3a6c Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sat, 27 Nov 2021 01:32:30 +0100 Subject: [PATCH 18/31] simplify --- default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/default.nix b/default.nix index 58ad98c233..e463c0e9b9 100644 --- a/default.nix +++ b/default.nix @@ -74,7 +74,6 @@ let retro68 = true; }; -in rec { # A Nixpkgs overlay. overlay = pkgs: prev: { @@ -228,7 +227,6 @@ in rec { export CMAKE_TOOLCHAIN_FILE=${toolchain} retro68_addRIncludes() { - echo "retro68_addRIncludes: $1 $depHostOffset" case $depHostOffset in -1) local role='BUILD_' ;; 0) local role="" ;; @@ -242,7 +240,6 @@ in rec { fi } - echo "targetOffset: $targetOffset" addEnvHooks "$targetOffset" retro68_addRIncludes '' + (pkgs.lib.optionalString (systemName == "Retro68") '' @@ -340,4 +337,7 @@ in rec { nativeBuildInputs = [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; }) crossPkgs; -} + + in { + inherit overlay crossPkgs shell; + } From 6258f1e0c05b6679333e5e8caeef5853b6c1995a Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sat, 27 Nov 2021 12:34:02 +0100 Subject: [PATCH 19/31] rearrange attributes --- default.nix | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/default.nix b/default.nix index e463c0e9b9..ac42e758ac 100644 --- a/default.nix +++ b/default.nix @@ -65,6 +65,10 @@ let execFormat = { name = "unknown"; }; }; }; + isStatic = true; + retro68BinutilsConfig = [ "--disable-plugins" ]; + retro68GccConfig = [ "--disable-lto" ]; + retro68 = true; cmakeSystemName = "RetroCarbon"; }; @@ -336,8 +340,6 @@ let cross.mkShell { nativeBuildInputs = [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; - }) crossPkgs; + } // cross) crossPkgs; - in { - inherit overlay crossPkgs shell; - } + in shell.m68k // shell // { inherit overlay; } From 000fe4d7124d1449a1477b2d67552e69a80e7075 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sat, 27 Nov 2021 12:34:16 +0100 Subject: [PATCH 20/31] nixfmt --- default.nix | 408 ++++++++++++++++++++++++++-------------------------- 1 file changed, 204 insertions(+), 204 deletions(-) diff --git a/default.nix b/default.nix index ac42e758ac..15ecb005a5 100644 --- a/default.nix +++ b/default.nix @@ -79,207 +79,206 @@ let }; # A Nixpkgs overlay. - overlay = pkgs: prev: - { - # ----------- Native Tools ------------- + overlay = pkgs: prev: { + # ----------- Native Tools ------------- - # hfsutils -- Utilities for manipulating HFS volumes & disk images. - hfsutils = with pkgs; - stdenv.mkDerivation { - name = "hfsutils"; - srcs = ./hfsutils; + # hfsutils -- Utilities for manipulating HFS volumes & disk images. + hfsutils = with pkgs; + stdenv.mkDerivation { + name = "hfsutils"; + srcs = ./hfsutils; - preConfigure = '' - mkdir -p $out/bin - mkdir -p $out/lib - mkdir -p $out/include - mkdir -p $out/share/man/man1 - ''; - configureFlags = [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; - }; + preConfigure = '' + mkdir -p $out/bin + mkdir -p $out/lib + mkdir -p $out/include + mkdir -p $out/share/man/man1 + ''; + configureFlags = [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; + }; - # retro68_tools -- native tools that are part of Retro68 - retro68_tools = with pkgs; - stdenv.mkDerivation { - name = "retro68_tools"; - src = nix-gitignore.gitignoreSource [ - "/*" - "!/CMakeLists.txt" - "!/libelf" # should perhaps use nixpkg's libelf instead? - "!/cmake" - "!/LaunchAPPL" - "!/libretro" - "!/PEFTools" - "!/ResourceFiles" - "!/Rez" - "!/Elf2Mac" - "!/ConvertObj" - "!/ConvertDiskImage" - ] ./.; + # retro68_tools -- native tools that are part of Retro68 + retro68_tools = with pkgs; + stdenv.mkDerivation { + name = "retro68_tools"; + src = nix-gitignore.gitignoreSource [ + "/*" + "!/CMakeLists.txt" + "!/libelf" # should perhaps use nixpkg's libelf instead? + "!/cmake" + "!/LaunchAPPL" + "!/libretro" + "!/PEFTools" + "!/ResourceFiles" + "!/Rez" + "!/Elf2Mac" + "!/ConvertObj" + "!/ConvertDiskImage" + ] ./.; - nativeBuildInputs = [ cmake bison flex ]; - buildInputs = [ boost zlib hfsutils ]; - }; + nativeBuildInputs = [ cmake bison flex ]; + buildInputs = [ boost zlib hfsutils ]; + }; - # ----------- Binutils & GCC ------------- + # ----------- Binutils & GCC ------------- - # retro68_binutils -- binutils, without any wrappers - retro68_binutils = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_binutils"; - src = ./binutils; + # retro68_binutils -- binutils, without any wrappers + retro68_binutils = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_binutils"; + src = ./binutils; - configureFlags = - [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] - ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; - enableParallelBuilding = true; + configureFlags = + [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] + ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; + enableParallelBuilding = true; - postInstall = let - ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; - ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; + postInstall = let + ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; + ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; - in '' - mv ${ld} ${ld_real} + in '' + mv ${ld} ${ld_real} - echo "#!${stdenv.shell}" > ${ld} - echo "exec \$'' + '' - {RETRO68_LD_WRAPPER_${stdenv.targetPlatform.cmakeSystemName}-${ld_real}} \"\$@\"" >> ${ld} - chmod +x ${ld} + 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 - ''; - }; + rm $out/${stdenv.targetPlatform.config}/bin/ld + ln -s ${ld} $out/${stdenv.targetPlatform.config}/bin/ld + ''; + }; - # retro68_gcc -- gcc, without any wrappers - retro68_gcc = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_gcc"; - src = ./gcc; - buildInputs = [ retro68_binutils gmp mpfr libmpc ]; - configureFlags = [ - "--target=${stdenv.targetPlatform.config}" - "--enable-languages=c,c++" - "--disable-libssp" - "MAKEINFO=missing" - ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; - hardeningDisable = [ "format" ]; - enableParallelBuilding = true; + # retro68_gcc -- gcc, without any wrappers + retro68_gcc = with pkgs; + stdenv.mkDerivation rec { + name = "retro68_gcc"; + src = ./gcc; + buildInputs = [ retro68_binutils gmp mpfr libmpc ]; + configureFlags = [ + "--target=${stdenv.targetPlatform.config}" + "--enable-languages=c,c++" + "--disable-libssp" + "MAKEINFO=missing" + ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; + hardeningDisable = [ "format" ]; + enableParallelBuilding = true; - # nix does in-source builds by default, and something breaks - buildCommand = '' - mkdir -p $out/${stdenv.targetPlatform.config}/bin - ln -s ${retro68_binutils}/${stdenv.targetPlatform.config}/bin/* $out/${stdenv.targetPlatform.config}/bin/ + # nix does in-source builds by default, and something breaks + buildCommand = '' + mkdir -p $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 - make -j$NIX_BUILD_CORES - make install - ''; - }; + export target_configargs="--disable-nls --enable-libstdcxx-dual-abi=no --disable-libstdcxx-verbose" + $src/configure ${builtins.toString configureFlags} --prefix=$out + make -j$NIX_BUILD_CORES + make install + ''; + }; - # ----------- Binutils & GCC wrapped for nixpkgs ------------- + # ----------- Binutils & GCC wrapped for nixpkgs ------------- - # binutils -- binutils with the wrappers provided by nixpkgs - binutils = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils; } - else - prev.binutils; + # binutils -- binutils with the wrappers provided by nixpkgs + binutils = if pkgs.stdenv.targetPlatform ? retro68 then + pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils; } + else + prev.binutils; - # gcc -- gcc with the wrappers provided by nixpkgs - gcc = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapCCWith { - cc = pkgs.retro68_gcc; + # gcc -- gcc with the wrappers provided by nixpkgs + gcc = if pkgs.stdenv.targetPlatform ? retro68 then + pkgs.wrapCCWith { + cc = pkgs.retro68_gcc; - # don't allow nix to add options for hardening - extraBuildCommands = '' - echo "" > $out/nix-support/add-hardening.sh - ''; + # don't allow nix to add options for hardening + extraBuildCommands = '' + echo "" > $out/nix-support/add-hardening.sh + ''; - extraPackages = with pkgs.targetPackages; [ - multiversal - import-libraries - libretro - retro68_setup_hook - ]; - } - else - prev.gcc; + extraPackages = with pkgs.targetPackages; [ + multiversal + import-libraries + libretro + retro68_setup_hook + ]; + } + else + prev.gcc; - # no separate libc package for now - libcCrossChooser = name: - if name == "retro68" then null else prev.libcCrossChooser name; + # no separate libc package for now + libcCrossChooser = name: + if name == "retro68" then null else prev.libcCrossChooser name; - retro68_setup_hook = let - systemName = pkgs.targetPlatform.cmakeSystemName; - toolchain = pkgs.writeTextFile { - name = "retro68-cmake-toolchain"; - text = '' - set(CMAKE_SYSTEM_NAME ${systemName}) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_CROSSCOMPILING TRUE) + retro68_setup_hook = let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) - set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) - set(REZ_TEMPLATES_PATH ${pkgs.libretro}/RIncludes) + set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) + set(REZ_TEMPLATES_PATH ${pkgs.libretro}/RIncludes) - include(${./cmake/add_application.cmake}) - ''; - }; - hook = pkgs.writeTextFile { - name = "retro68_setup_hook"; - text = '' - export CMAKE_TOOLCHAIN_FILE=${toolchain} + include(${./cmake/add_application.cmake}) + ''; + }; + hook = pkgs.writeTextFile { + name = "retro68_setup_hook"; + text = '' + export CMAKE_TOOLCHAIN_FILE=${toolchain} - retro68_addRIncludes() { - case $depHostOffset in - -1) local role='BUILD_' ;; - 0) local role="" ;; - 1) local role='TARGET_' ;; - *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; - return 1 ;; - esac + retro68_addRIncludes() { + case $depHostOffset in + -1) local role='BUILD_' ;; + 0) local role="" ;; + 1) local role='TARGET_' ;; + *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; + return 1 ;; + esac - if [[ -d "$1/RIncludes" ]]; then - export REZ_INCLUDE_PATH+=":$1/RIncludes" - fi - } + if [[ -d "$1/RIncludes" ]]; then + export REZ_INCLUDE_PATH+=":$1/RIncludes" + fi + } - addEnvHooks "$targetOffset" retro68_addRIncludes + addEnvHooks "$targetOffset" retro68_addRIncludes - '' + (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; + '' + (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; - # ----------- Retro68 core libraries ------------- + # ----------- Retro68 core libraries ------------- - # multiversal -- multiversal interfaces - multiversal = with pkgs; - (stdenv.override { - cc = stdenv.cc.override { extraPackages = [ ]; }; - }).mkDerivation { - name = "multiversal"; - src = ./multiversal; - nativeBuildInputs = [ buildPackages.ruby ]; - buildCommand = '' - echo $src - build=`pwd` - (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") - mkdir $out - cp -r CIncludes $out/include - cp -r RIncludes $out/ - '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' - cp -r lib68k $out/lib - '' else '' - ''); - meta = { platforms = [ "m68k-macos" ]; }; - }; + # multiversal -- multiversal interfaces + multiversal = with pkgs; + (stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "multiversal"; + src = ./multiversal; + nativeBuildInputs = [ buildPackages.ruby ]; + buildCommand = '' + echo $src + build=`pwd` + (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") + mkdir $out + cp -r CIncludes $out/include + cp -r RIncludes $out/ + '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' + cp -r lib68k $out/lib + '' else + ""); + meta = { platforms = [ "m68k-macos" ]; }; + }; - import-libraries = with pkgs; - if stdenvNoCC.targetPlatform != retroSystems.m68k - then stdenvNoCC.mkDerivation { + import-libraries = with pkgs; + if stdenvNoCC.targetPlatform != retroSystems.m68k then + stdenvNoCC.mkDerivation { name = "import-libraries"; src = ./ImportLibraries; buildCommand = '' @@ -287,41 +286,42 @@ let cp $src/*.a $out/lib/ ''; } - else null; + else + null; - libretro = with pkgs; - let - systemName = pkgs.targetPlatform.cmakeSystemName; - toolchain = pkgs.writeTextFile { - name = "retro68-cmake-toolchain-bootstrap"; - text = '' - set(CMAKE_SYSTEM_NAME ${systemName}) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_CROSSCOMPILING TRUE) - ''; - }; - in (pkgs.stdenv.override { - cc = stdenv.cc.override { extraPackages = [ ]; }; - }).mkDerivation { - name = "libretro"; - src = ./libretro; - - nativeBuildInputs = [ buildPackages.cmake ]; - buildInputs = [ multiversal ]; - - buildCommand = '' - echo "Build command." - cmake $src \ - -DCMAKE_INSTALL_PREFIX=$out \ - -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE=${toolchain} - cmake --build . - cmake --build . --target install + libretro = with pkgs; + let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain-bootstrap"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) ''; - meta = { platforms = [ "m68k-macos" ]; }; }; - }; + in (pkgs.stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "libretro"; + src = ./libretro; + + nativeBuildInputs = [ buildPackages.cmake ]; + buildInputs = [ multiversal ]; + + buildCommand = '' + echo "Build command." + cmake $src \ + -DCMAKE_INSTALL_PREFIX=$out \ + -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=${toolchain} + cmake --build . + cmake --build . --target install + ''; + meta = { platforms = [ "m68k-macos" ]; }; + }; + }; pkgs = import { inherit system; @@ -342,4 +342,4 @@ let [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; } // cross) crossPkgs; - in shell.m68k // shell // { inherit overlay; } +in shell.m68k // shell // { inherit overlay; } From 11fb59b65257ab5543e95a3b9ef2c5066e1c47c3 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sat, 27 Nov 2021 14:44:56 +0100 Subject: [PATCH 21/31] remove useless and incorrect meta.platforms annotations --- default.nix | 2 -- 1 file changed, 2 deletions(-) diff --git a/default.nix b/default.nix index 15ecb005a5..2d303c03dd 100644 --- a/default.nix +++ b/default.nix @@ -273,7 +273,6 @@ let cp -r lib68k $out/lib '' else ""); - meta = { platforms = [ "m68k-macos" ]; }; }; import-libraries = with pkgs; @@ -319,7 +318,6 @@ let cmake --build . cmake --build . --target install ''; - meta = { platforms = [ "m68k-macos" ]; }; }; }; From 7b0091ae492e83cdc48f3a788b02754842574a79 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sun, 28 Nov 2021 01:02:08 +0100 Subject: [PATCH 22/31] rearrange packages --- default.nix | 457 ++++++++++++++++++++++++++-------------------------- 1 file changed, 232 insertions(+), 225 deletions(-) diff --git a/default.nix b/default.nix index 2d303c03dd..d97e9834ba 100644 --- a/default.nix +++ b/default.nix @@ -79,247 +79,250 @@ let }; # A Nixpkgs overlay. - overlay = pkgs: prev: { - # ----------- Native Tools ------------- + overlay = pkgs: prev: + { + retro68 = { + # ----------- Native Tools ------------- + # hfsutils -- Utilities for manipulating HFS volumes & disk images. + hfsutils = with pkgs; + stdenv.mkDerivation { + name = "retro68.hfsutils"; + srcs = ./hfsutils; - # hfsutils -- Utilities for manipulating HFS volumes & disk images. - hfsutils = with pkgs; - stdenv.mkDerivation { - name = "hfsutils"; - srcs = ./hfsutils; + preConfigure = '' + mkdir -p $out/bin + mkdir -p $out/lib + mkdir -p $out/include + mkdir -p $out/share/man/man1 + ''; + configureFlags = [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; + }; - preConfigure = '' - mkdir -p $out/bin - mkdir -p $out/lib - mkdir -p $out/include - mkdir -p $out/share/man/man1 - ''; - configureFlags = [ "--mandir=$(out)/share/man" "--enable-devlibs" ]; + # tools -- native tools that are part of Retro68 + tools = with pkgs; + stdenv.mkDerivation { + name = "retro68.tools"; + src = nix-gitignore.gitignoreSource [ + "/*" + "!/CMakeLists.txt" + "!/libelf" # should perhaps use nixpkg's libelf instead? + "!/cmake" + "!/LaunchAPPL" + "!/libretro" + "!/PEFTools" + "!/ResourceFiles" + "!/Rez" + "!/Elf2Mac" + "!/ConvertObj" + "!/ConvertDiskImage" + ] ./.; + + nativeBuildInputs = [ cmake bison flex ]; + buildInputs = [ boost zlib retro68.hfsutils ]; + }; + + } // prev.lib.optionalAttrs (prev.targetPlatform ? retro68) { + + # ----------- Binutils & GCC ------------- + + # binutils_unwrapped -- binutils, without any wrappers + binutils_unwrapped = with pkgs; + stdenv.mkDerivation rec { + name = "retro68.binutils_unwrapped"; + src = ./binutils; + + configureFlags = + [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] + ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; + enableParallelBuilding = true; + + postInstall = let + ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; + ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; + + 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 + ''; + }; + + # gcc -- gcc, without any wrappers + gcc_unwrapped = with pkgs; + stdenv.mkDerivation rec { + name = "retro68.gcc_unwrapped"; + src = ./gcc; + buildInputs = [ retro68.binutils_unwrapped gmp mpfr libmpc ]; + configureFlags = [ + "--target=${stdenv.targetPlatform.config}" + "--enable-languages=c,c++" + "--disable-libssp" + "MAKEINFO=missing" + ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; + hardeningDisable = [ "format" ]; + enableParallelBuilding = true; + + # nix does in-source builds by default, and something breaks + buildCommand = '' + mkdir -p $out/${stdenv.targetPlatform.config}/bin + ln -s ${retro68.binutils_unwrapped}/${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 + make -j$NIX_BUILD_CORES + make install + ''; + }; + + } // prev.lib.optionalAttrs (prev.hostPlatform ? retro68) { + + setup_hook = let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68.cmake-toolchain"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) + + set( REZ "${pkgs.buildPackages.retro68.tools}/bin/Rez" ) + set(REZ_TEMPLATES_PATH ${pkgs.retro68.libretro}/RIncludes) + + include(${./cmake/add_application.cmake}) + ''; + }; + hook = pkgs.writeTextFile { + name = "retro68.setup_hook"; + text = '' + export CMAKE_TOOLCHAIN_FILE=${toolchain} + + retro68_addRIncludes() { + case $depHostOffset in + -1) local role='BUILD_' ;; + 0) local role="" ;; + 1) local role='TARGET_' ;; + *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; + return 1 ;; + esac + + if [[ -d "$1/RIncludes" ]]; then + export REZ_INCLUDE_PATH+=":$1/RIncludes" + fi + } + + addEnvHooks "$targetOffset" retro68_addRIncludes + + '' + (pkgs.lib.optionalString (systemName == "Retro68") '' + export RETRO68_LD_WRAPPER_Retro68="${pkgs.buildPackages.retro68.tools}/bin/Elf2Mac" + export RETRO68_REAL_LD="${pkgs.buildPackages.retro68.binutils_unwrapped}/bin/m68k-apple-macos-ld.real" + ''); + }; + in pkgs.makeSetupHook { } hook; + + # ----------- Retro68 core libraries ------------- + + # multiversal -- multiversal interfaces + multiversal = with pkgs; + (stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "retro68.multiversal"; + src = ./multiversal; + nativeBuildInputs = [ buildPackages.ruby ]; + buildCommand = '' + echo $src + build=`pwd` + (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") + mkdir $out + cp -r CIncludes $out/include + cp -r RIncludes $out/ + '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' + cp -r lib68k $out/lib + '' else + ""); + }; + + import_libraries = with pkgs; + if stdenvNoCC.targetPlatform != retroSystems.m68k then + stdenvNoCC.mkDerivation { + name = "retro68.import_libraries"; + src = ./ImportLibraries; + buildCommand = '' + mkdir -p $out/lib + cp $src/*.a $out/lib/ + ''; + } + else + null; + + libretro = with pkgs; + let + systemName = pkgs.targetPlatform.cmakeSystemName; + toolchain = pkgs.writeTextFile { + name = "retro68-cmake-toolchain-bootstrap"; + text = '' + set(CMAKE_SYSTEM_NAME ${systemName}) + set(CMAKE_SYSTEM_VERSION 1) + set(CMAKE_CROSSCOMPILING TRUE) + ''; + }; + in (pkgs.stdenv.override { + cc = stdenv.cc.override { extraPackages = [ ]; }; + }).mkDerivation { + name = "libretro"; + src = ./libretro; + + nativeBuildInputs = [ buildPackages.cmake ]; + buildInputs = [ retro68.multiversal ]; + + buildCommand = '' + echo "Build command." + cmake $src \ + -DCMAKE_INSTALL_PREFIX=$out \ + -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=${toolchain} + cmake --build . + cmake --build . --target install + ''; + }; }; + } // prev.lib.optionalAttrs (prev.targetPlatform ? retro68) { - # retro68_tools -- native tools that are part of Retro68 - retro68_tools = with pkgs; - stdenv.mkDerivation { - name = "retro68_tools"; - src = nix-gitignore.gitignoreSource [ - "/*" - "!/CMakeLists.txt" - "!/libelf" # should perhaps use nixpkg's libelf instead? - "!/cmake" - "!/LaunchAPPL" - "!/libretro" - "!/PEFTools" - "!/ResourceFiles" - "!/Rez" - "!/Elf2Mac" - "!/ConvertObj" - "!/ConvertDiskImage" - ] ./.; + # ----------- Binutils & GCC wrapped for nixpkgs ------------- - nativeBuildInputs = [ cmake bison flex ]; - buildInputs = [ boost zlib hfsutils ]; - }; + # binutils -- binutils with the wrappers provided by nixpkgs + binutils = + pkgs.wrapBintoolsWith { bintools = pkgs.retro68.binutils_unwrapped; }; - # ----------- Binutils & GCC ------------- - - # retro68_binutils -- binutils, without any wrappers - retro68_binutils = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_binutils"; - src = ./binutils; - - configureFlags = - [ "--target=${stdenv.targetPlatform.config}" "--disable-doc" ] - ++ stdenv.targetPlatform.retro68BinutilsConfig or [ ]; - enableParallelBuilding = true; - - postInstall = let - ld = "$out/bin/${stdenv.targetPlatform.config}-ld"; - ld_real = "$out/bin/${stdenv.targetPlatform.config}-ld.real"; - - 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 - ''; - }; - - # retro68_gcc -- gcc, without any wrappers - retro68_gcc = with pkgs; - stdenv.mkDerivation rec { - name = "retro68_gcc"; - src = ./gcc; - buildInputs = [ retro68_binutils gmp mpfr libmpc ]; - configureFlags = [ - "--target=${stdenv.targetPlatform.config}" - "--enable-languages=c,c++" - "--disable-libssp" - "MAKEINFO=missing" - ] ++ stdenv.targetPlatform.retro68GccConfig or [ ]; - hardeningDisable = [ "format" ]; - enableParallelBuilding = true; - - # nix does in-source builds by default, and something breaks - buildCommand = '' - mkdir -p $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 - make -j$NIX_BUILD_CORES - make install - ''; - }; - - # ----------- Binutils & GCC wrapped for nixpkgs ------------- - - # binutils -- binutils with the wrappers provided by nixpkgs - binutils = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapBintoolsWith { bintools = pkgs.retro68_binutils; } - else - prev.binutils; - - # gcc -- gcc with the wrappers provided by nixpkgs - gcc = if pkgs.stdenv.targetPlatform ? retro68 then - pkgs.wrapCCWith { - cc = pkgs.retro68_gcc; + # gcc -- gcc with the wrappers provided by nixpkgs + gcc = pkgs.wrapCCWith { + cc = pkgs.retro68.gcc_unwrapped; # don't allow nix to add options for hardening extraBuildCommands = '' echo "" > $out/nix-support/add-hardening.sh ''; - extraPackages = with pkgs.targetPackages; [ + extraPackages = with pkgs.targetPackages.retro68; [ multiversal - import-libraries + import_libraries libretro - retro68_setup_hook + setup_hook ]; - } - else - prev.gcc; - - # no separate libc package for now - libcCrossChooser = name: - if name == "retro68" then null else prev.libcCrossChooser name; - - retro68_setup_hook = let - systemName = pkgs.targetPlatform.cmakeSystemName; - toolchain = pkgs.writeTextFile { - name = "retro68-cmake-toolchain"; - text = '' - set(CMAKE_SYSTEM_NAME ${systemName}) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_CROSSCOMPILING TRUE) - - set( REZ "${pkgs.buildPackages.retro68_tools}/bin/Rez" ) - set(REZ_TEMPLATES_PATH ${pkgs.libretro}/RIncludes) - - include(${./cmake/add_application.cmake}) - ''; - }; - hook = pkgs.writeTextFile { - name = "retro68_setup_hook"; - text = '' - export CMAKE_TOOLCHAIN_FILE=${toolchain} - - retro68_addRIncludes() { - case $depHostOffset in - -1) local role='BUILD_' ;; - 0) local role="" ;; - 1) local role='TARGET_' ;; - *) echo "retro68_addRIncludes: Error: Cannot be used with $depHostOffset-offset deps" >2; - return 1 ;; - esac - - if [[ -d "$1/RIncludes" ]]; then - export REZ_INCLUDE_PATH+=":$1/RIncludes" - fi - } - - addEnvHooks "$targetOffset" retro68_addRIncludes - - '' + (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; - - # ----------- Retro68 core libraries ------------- - - # multiversal -- multiversal interfaces - multiversal = with pkgs; - (stdenv.override { - cc = stdenv.cc.override { extraPackages = [ ]; }; - }).mkDerivation { - name = "multiversal"; - src = ./multiversal; - nativeBuildInputs = [ buildPackages.ruby ]; - buildCommand = '' - echo $src - build=`pwd` - (cd $src && ruby make-multiverse.rb -G CIncludes -o "$build") - mkdir $out - cp -r CIncludes $out/include - cp -r RIncludes $out/ - '' + (if stdenv.targetPlatform.system == "m68k-macos" then '' - cp -r lib68k $out/lib - '' else - ""); }; - import-libraries = with pkgs; - if stdenvNoCC.targetPlatform != retroSystems.m68k then - stdenvNoCC.mkDerivation { - name = "import-libraries"; - src = ./ImportLibraries; - buildCommand = '' - mkdir -p $out/lib - cp $src/*.a $out/lib/ - ''; - } - else - null; + # no separate libc package for now + libcCrossChooser = name: + if name == "retro68" then null else prev.libcCrossChooser name; - libretro = with pkgs; - let - systemName = pkgs.targetPlatform.cmakeSystemName; - toolchain = pkgs.writeTextFile { - name = "retro68-cmake-toolchain-bootstrap"; - text = '' - set(CMAKE_SYSTEM_NAME ${systemName}) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_CROSSCOMPILING TRUE) - ''; - }; - in (pkgs.stdenv.override { - cc = stdenv.cc.override { extraPackages = [ ]; }; - }).mkDerivation { - name = "libretro"; - src = ./libretro; - - nativeBuildInputs = [ buildPackages.cmake ]; - buildInputs = [ multiversal ]; - - buildCommand = '' - echo "Build command." - cmake $src \ - -DCMAKE_INSTALL_PREFIX=$out \ - -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE=${toolchain} - cmake --build . - cmake --build . --target install - ''; - }; - }; + }; pkgs = import { inherit system; @@ -336,8 +339,12 @@ let shell = pkgs.lib.mapAttrs (name: cross: cross.mkShell { - nativeBuildInputs = - [ pkgs.hfsutils pkgs.retro68_tools pkgs.cmake pkgs.gnumake ]; + nativeBuildInputs = with pkgs; [ + retro68.hfsutils + retro68.tools + cmake + gnumake + ]; } // cross) crossPkgs; in shell.m68k // shell // { inherit overlay; } From 9e1b653f3a4985ad1a02cbc5aeb8b328134159f6 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sun, 28 Nov 2021 02:06:00 +0100 Subject: [PATCH 23/31] add RetroConsole --- default.nix | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/default.nix b/default.nix index d97e9834ba..a95845ecea 100644 --- a/default.nix +++ b/default.nix @@ -2,7 +2,7 @@ , ... }: let - retroSystems = { + retroPlatforms = { m68k = { system = "m68k-macos"; config = "m68k-apple-macos"; @@ -82,6 +82,8 @@ let overlay = pkgs: prev: { retro68 = { + platforms = retroPlatforms; + # ----------- Native Tools ------------- # hfsutils -- Utilities for manipulating HFS volumes & disk images. hfsutils = with pkgs; @@ -191,9 +193,11 @@ let set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_CROSSCOMPILING TRUE) - set( REZ "${pkgs.buildPackages.retro68.tools}/bin/Rez" ) + set(REZ "${pkgs.buildPackages.retro68.tools}/bin/Rez" ) set(REZ_TEMPLATES_PATH ${pkgs.retro68.libretro}/RIncludes) + set(MAKE_PEF "${pkgs.buildPackages.retro68.tools}/bin/MakePEF" ) + include(${./cmake/add_application.cmake}) ''; }; @@ -249,7 +253,7 @@ let }; import_libraries = with pkgs; - if stdenvNoCC.targetPlatform != retroSystems.m68k then + if stdenvNoCC.targetPlatform != retroPlatforms.m68k then stdenvNoCC.mkDerivation { name = "retro68.import_libraries"; src = ./ImportLibraries; @@ -292,6 +296,14 @@ let cmake --build . --target install ''; }; + + console = with pkgs; + stdenv.mkDerivation { + name = "retro68.console"; + src = ./Console; + + nativeBuildInputs = [ buildPackages.cmake ]; + }; }; } // prev.lib.optionalAttrs (prev.targetPlatform ? retro68) { @@ -335,7 +347,7 @@ let overlays = [ overlay ]; crossSystem = plat; config = { allowUnsupportedSystem = true; }; - }) retroSystems; + }) retroPlatforms; shell = pkgs.lib.mapAttrs (name: cross: cross.mkShell { @@ -345,6 +357,7 @@ let cmake gnumake ]; + buildInputs = [ cross.retro68.console ]; } // cross) crossPkgs; in shell.m68k // shell // { inherit overlay; } From 73e4ff652086a3f9ef79038cd14bc560e1a0d6c7 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sun, 5 Dec 2021 14:39:17 +0100 Subject: [PATCH 24/31] delete unneeded builder --- nix/builder.sh | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 nix/builder.sh diff --git a/nix/builder.sh b/nix/builder.sh deleted file mode 100644 index 54bdf180a6..0000000000 --- a/nix/builder.sh +++ /dev/null @@ -1,3 +0,0 @@ -source $stdenv/setup - -bash $src/build-toolchain.bash --prefix=$out From b6df9e8fdaf56428369707c586d554169efd3d85 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sun, 5 Dec 2021 22:42:15 +0100 Subject: [PATCH 25/31] darwin LaunchAPPL needs ApplicationServices framework --- default.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/default.nix b/default.nix index a95845ecea..0b6e81fcc2 100644 --- a/default.nix +++ b/default.nix @@ -120,7 +120,8 @@ let ] ./.; nativeBuildInputs = [ cmake bison flex ]; - buildInputs = [ boost zlib retro68.hfsutils ]; + buildInputs = [ boost zlib retro68.hfsutils ] + ++ lib.optional hostPlatform.isDarwin darwin.apple_sdk.frameworks.ApplicationServices; }; } // prev.lib.optionalAttrs (prev.targetPlatform ? retro68) { From e980af9b910321e2efcd2699b63217baff7f87ba Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 7 Dec 2021 20:10:37 +0100 Subject: [PATCH 26/31] build fixes for LaunchAPPL client --- LaunchAPPL/Client/Classic.cc | 9 ++++----- LaunchAPPL/Client/LaunchAPPL.cc | 5 +---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/LaunchAPPL/Client/Classic.cc b/LaunchAPPL/Client/Classic.cc index 18a3deb94f..912a050cd0 100644 --- a/LaunchAPPL/Client/Classic.cc +++ b/LaunchAPPL/Client/Classic.cc @@ -1,11 +1,10 @@ -#define ResType MacResType -#include -#undef ResType - -#if TARGET_CPU_PPC +#ifdef __powerpc #include "Classic.h" #include "Launcher.h" +#define ResType MacResType +#include +#undef ResType namespace po = boost::program_options; diff --git a/LaunchAPPL/Client/LaunchAPPL.cc b/LaunchAPPL/Client/LaunchAPPL.cc index 32745a1446..0841a80871 100644 --- a/LaunchAPPL/Client/LaunchAPPL.cc +++ b/LaunchAPPL/Client/LaunchAPPL.cc @@ -9,10 +9,7 @@ #include "Launcher.h" #if defined(__APPLE__) -# define ResType MacResType -# include -# undef ResType -# if TARGET_CPU_PPC +# ifdef __powerpc # include "Classic.h" # endif # include "Carbon.h" From cdaaa9718469095dd2c25385a2b02c67cdfd9514 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 8 Dec 2021 10:58:51 +0100 Subject: [PATCH 27/31] add retro68.monolithic --- default.nix | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/default.nix b/default.nix index 0b6e81fcc2..874a261e75 100644 --- a/default.nix +++ b/default.nix @@ -84,6 +84,18 @@ let retro68 = { platforms = retroPlatforms; + monolithic = with pkgs; + stdenv.mkDerivation { + name = "retro68.monolithic"; + srcs = ./.; + nativeBuildInputs = [cmake bison flex ruby ninja]; + buildInputs = [boost gmp mpfr libmpc zlib] + ++ lib.optional hostPlatform.isDarwin darwin.apple_sdk.frameworks.ApplicationServices; + buildCommand = '' + bash $src/build-toolchain.bash --ninja --prefix=$out --no-carbon + ''; + }; + # ----------- Native Tools ------------- # hfsutils -- Utilities for manipulating HFS volumes & disk images. hfsutils = with pkgs; @@ -361,4 +373,4 @@ let buildInputs = [ cross.retro68.console ]; } // cross) crossPkgs; -in shell.m68k // shell // { inherit overlay; } +in shell.m68k // shell // { inherit overlay; inherit (pkgs) retro68; } From a40848ba3927eb8aeb4f36a07c2e69b0eb26c9a8 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 8 Dec 2021 15:59:50 +0100 Subject: [PATCH 28/31] fix monolithic build --- default.nix | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/default.nix b/default.nix index 874a261e75..d0528043da 100644 --- a/default.nix +++ b/default.nix @@ -87,13 +87,14 @@ let monolithic = with pkgs; stdenv.mkDerivation { name = "retro68.monolithic"; - srcs = ./.; - nativeBuildInputs = [cmake bison flex ruby ninja]; + src = ./.; + nativeBuildInputs = [cmake bison flex ruby ninja bash]; buildInputs = [boost gmp mpfr libmpc zlib] ++ lib.optional hostPlatform.isDarwin darwin.apple_sdk.frameworks.ApplicationServices; buildCommand = '' bash $src/build-toolchain.bash --ninja --prefix=$out --no-carbon ''; + hardeningDisable = [ "format" ]; }; # ----------- Native Tools ------------- From 41474074e4502f9d46c4b42ff9d41e8bfa00cf12 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 8 Dec 2021 22:25:19 +0100 Subject: [PATCH 29/31] initial docs for nix support --- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.md b/README.md index 3611fc8369..cd27791067 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ after cloning. To get the latest changes, use git submodule update +Note: There is now experimental support for the [Nix Package Manager](www.nixos.org). If you're a nix user, skip ahead to the [Using Retro68 with Nix](#using-retro68-with-nix) section. + ### Prerequisites - Linux, Mac OS X or Windows (via Cygwin) @@ -143,6 +145,49 @@ The `build-host`, `build-target`, `build-target-ppc` and `build-target-carbon` directories are CMake build directories generated from the top-level `CMakeLists.txt`, so you can also `cd` to one of these and run `make` separately if you've made changes. +Using Retro68 with Nix +---------------------- + +If you are not using the [Nix Package Manager](www.nixos.org), please skip this section. But maybe you should be using it ;-). + +Nix is a package manager that runs on Linux and macOS, and NixOS is a Linux distribution based on it. + +If you've got `nix` installed, after downloading Retro68, you can run + + nix-shell + +from the Retro68 directory to get a shell with the compiler tools targeting +68K Macs available in the path, and `CC` and other environment variables already +set up for you. You can then `cd` to one of the example directories or to your +own project and use `cmake` to build it. + +You can use the `nix-shell` command to invoke various useful shell environments: + +| Command | What | +|-------------------------------------|----------------------------------------------| +| `nix-shell` | 68K development environment | +| `nix-shell -A m68k` | 68K development environment | +| `nix-shell -A ppc` | PowerPC development environment | +| `nix-shell -A retro68.monolithic` | Shell for running `build-toolchain.bash` | + +You can also use the `nix-build` command to build packages. As always with `nix`, +the result will be somewhere in a subdirectory of `/nix/store`, with a symlink +named `result` placed in your Retro68 directory. + +| Command | What | +|-------------------------------------|----------------------------------------------| +| `nix-build -A m68k.retro68.samples` | Sample programs for 68K | +| `nix-build -A ppc.retro68.samples` | Sample programs for PowerPC | +| `nix-build -A retro68.monolithic` | Result of `build-toolchain.bash --no-carbon` | +| `nix-build -A m68k.zlib` | zlib library, cross-compiled for 68K Macs | +| `nix-build -A m68k.`*packagename* | cross-compile *packagename* to 68K | +| `nix-build -A ppc.`*packagename* | cross-compile *packagename* to PowerPC | + +You can attempt to cross-compile *any* package from the `nixpkgs` collection. Unless the +package contains a very portable library, the command will of course fail. Please don't +report bugs, please report successes instead! + + Sample programs --------------- From 2d89db2e3c8c209c94dcffa20ac97922902a21ba Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 7 Dec 2021 20:01:41 +0100 Subject: [PATCH 30/31] MPWTest: only include Retro68Runtime.h on 68K --- Samples/MPWTool/main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Samples/MPWTool/main.c b/Samples/MPWTool/main.c index ab92416742..4ec66f9ae6 100644 --- a/Samples/MPWTool/main.c +++ b/Samples/MPWTool/main.c @@ -34,11 +34,14 @@ */ #include -#include #include #include #include +#if !TARGET_CPU_PPC +#include +#endif + #pragma pack (push, 2) struct MPWFile; From fe4914374f510346136b2dacec7efd2c22931074 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Wed, 8 Dec 2021 23:39:19 +0100 Subject: [PATCH 31/31] add samples to default.nix --- default.nix | 77 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/default.nix b/default.nix index d0528043da..cc16e30473 100644 --- a/default.nix +++ b/default.nix @@ -88,9 +88,10 @@ let stdenv.mkDerivation { name = "retro68.monolithic"; src = ./.; - nativeBuildInputs = [cmake bison flex ruby ninja bash]; - buildInputs = [boost gmp mpfr libmpc zlib] - ++ lib.optional hostPlatform.isDarwin darwin.apple_sdk.frameworks.ApplicationServices; + nativeBuildInputs = [ cmake bison flex ruby ninja bash ]; + buildInputs = [ boost gmp mpfr libmpc zlib ] + ++ lib.optional hostPlatform.isDarwin + darwin.apple_sdk.frameworks.ApplicationServices; buildCommand = '' bash $src/build-toolchain.bash --ninja --prefix=$out --no-carbon ''; @@ -134,7 +135,8 @@ let nativeBuildInputs = [ cmake bison flex ]; buildInputs = [ boost zlib retro68.hfsutils ] - ++ lib.optional hostPlatform.isDarwin darwin.apple_sdk.frameworks.ApplicationServices; + ++ lib.optional hostPlatform.isDarwin + darwin.apple_sdk.frameworks.ApplicationServices; }; } // prev.lib.optionalAttrs (prev.targetPlatform ? retro68) { @@ -311,13 +313,63 @@ let ''; }; - console = with pkgs; - stdenv.mkDerivation { - name = "retro68.console"; - src = ./Console; + console = with pkgs; + stdenv.mkDerivation { + name = "retro68.console"; + src = ./Console; + + nativeBuildInputs = [ buildPackages.cmake ]; + }; + + samples = with pkgs; + let + individualSamples = lib.mapAttrs (key: path: + stdenv.mkDerivation { + name = "retro68.samples." + key; + src = path; + nativeBuildInputs = [ buildPackages.ninja buildPackages.cmake ]; + buildInputs = [ retro68.console ]; + buildCommand = '' + mkdir build + cd build + cmake $src -G Ninja + ninja + mkdir -p $out/Applications + mkdir -p $out/Applications/.finf + mkdir -p $out/Applications/.rsrc + + cp *.APPL $out/Applications + cp .finf/*.APPL $out/Applications/.finf + cp .rsrc/*.APPL $out/Applications/.rsrc + for f in *.APPL; do + cp $'' + '' + {f%.APPL}.bin $out/Applications + done + ''; + }) ({ + dialog = ./Samples/Dialog; + helloworld = ./Samples/HelloWorld; + mpwtool = ./Samples/MPWTool; + raytracer = ./Samples/Raytracer; + #systemextension = ./Samples/SystemExtension; + wdef = ./Samples/WDEF; + } // lib.optionalAttrs + (targetPlatform.cmakeSystemName != "Retro68") { + sharedlibrary = ./Samples/SharedLibrary; + } // lib.optionalAttrs + (targetPlatform.cmakeSystemName == "Retro68") { + launcher = ./Samples/Launcher; + }); + in runCommand "retro68.samples" { } '' + mkdir -p $out/Applications + mkdir -p $out/Applications/.rsrc + mkdir -p $out/Applications/.finf + + ${lib.concatMapStrings (x: '' + cp -r ${lib.escapeShellArg x}/Applications $out/ + '') (builtins.attrValues individualSamples)} + '' // individualSamples; - nativeBuildInputs = [ buildPackages.cmake ]; - }; }; } // prev.lib.optionalAttrs (prev.targetPlatform ? retro68) { @@ -374,4 +426,7 @@ let buildInputs = [ cross.retro68.console ]; } // cross) crossPkgs; -in shell.m68k // shell // { inherit overlay; inherit (pkgs) retro68; } +in shell.m68k // shell // { + inherit overlay; + inherit (pkgs) retro68; +}