1# This function compiles a source tarball in a virtual machine image 2# that contains a Debian-like (i.e. dpkg-based) OS. 3 4{ 5 name ? "debian-build", 6 diskImage, 7 src, 8 lib, 9 stdenv, 10 vmTools, 11 checkinstall, 12 fsTranslation ? false, 13 # Features provided by this package. 14 debProvides ? [ ], 15 # Features required by this package. 16 debRequires ? [ ], 17 ... 18}@args: 19 20vmTools.runInLinuxImage ( 21 stdenv.mkDerivation ( 22 23 { 24 doCheck = true; 25 26 prefix = "/usr"; 27 28 prePhases = [ 29 "installExtraDebsPhase" 30 "sysInfoPhase" 31 ]; 32 } 33 34 // removeAttrs args [ 35 "vmTools" 36 "lib" 37 ] 38 // 39 40 { 41 name = name + "-" + diskImage.name + (lib.optionalString (src ? version) "-${src.version}"); 42 43 # !!! cut&paste from rpm-build.nix 44 postHook = '' 45 . ${./functions.sh} 46 propagateImageName 47 src=$(findTarball $src) 48 ''; 49 50 installExtraDebsPhase = '' 51 for i in $extraDebs; do 52 dpkg --install $(ls $i/debs/*.deb | sort | head -1) 53 done 54 ''; 55 56 sysInfoPhase = '' 57 [ ! -f /etc/lsb-release ] || (source /etc/lsb-release; echo "OS release: $DISTRIB_DESCRIPTION") 58 echo "System/kernel: $(uname -a)" 59 if test -e /etc/debian_version; then echo "Debian release: $(cat /etc/debian_version)"; fi 60 echo "installed Debian packages" 61 dpkg-query --list 62 ''; 63 64 installPhase = '' 65 eval "$preInstall" 66 export LOGNAME=root 67 68 # otherwise build hangs when it wants to display 69 # the log file 70 export PAGER=cat 71 ${checkinstall}/sbin/checkinstall --nodoc -y -D \ 72 --fstrans=${if fsTranslation then "yes" else "no"} \ 73 --requires="${lib.concatStringsSep "," debRequires}" \ 74 --provides="${lib.concatStringsSep "," debProvides}" \ 75 ${ 76 if (src ? version) then "--pkgversion=$(echo ${src.version} | tr _ -)" else "--pkgversion=0.0.0" 77 } \ 78 ''${debMaintainer:+--maintainer="'$debMaintainer'"} \ 79 ''${debName:+--pkgname="'$debName'"} \ 80 $checkInstallFlags \ 81 -- \ 82 $SHELL -c "''${installCommand:-make install}" 83 84 mkdir -p $out/debs 85 find . -name "*.deb" -exec cp {} $out/debs \; 86 87 [ "$(echo $out/debs/*.deb)" != "" ] 88 89 for i in $out/debs/*.deb; do 90 echo "Generated DEB package: $i" 91 dpkg-deb --info "$i" 92 pkgName=$(dpkg-deb -W "$i" | awk '{print $1}') 93 echo "file deb $i" >> $out/nix-support/hydra-build-products 94 done 95 dpkg -i $out/debs/*.deb 96 97 for i in $extraDebs; do 98 echo "file deb-extra $(ls $i/debs/*.deb | sort | head -1)" >> $out/nix-support/hydra-build-products 99 done 100 101 eval "$postInstall" 102 ''; 103 104 meta = (lib.optionalAttrs (args ? meta) args.meta) // { 105 description = "Deb package for ${diskImage.fullName}"; 106 }; 107 } 108 109 ) 110)