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; }