diff options
Diffstat (limited to 'pkgs/build-support/builder-defs/builder-defs.nix')
-rw-r--r-- | pkgs/build-support/builder-defs/builder-defs.nix | 607 |
1 files changed, 0 insertions, 607 deletions
diff --git a/pkgs/build-support/builder-defs/builder-defs.nix b/pkgs/build-support/builder-defs/builder-defs.nix deleted file mode 100644 index e21b032aacb..00000000000 --- a/pkgs/build-support/builder-defs/builder-defs.nix +++ /dev/null @@ -1,607 +0,0 @@ -args @ {stringsWithDeps, lib, stdenv, writeScript, fetchurl, fetchmtn, fetchgit, ...}: with args; with stringsWithDeps; with lib; -let inherit (builtins) head tail trace; in -(rec -{ - inherit writeScript; - - src = attrByPath ["src"] "" args; - - addSbinPath = attrByPath ["addSbinPath"] false args; - - forceShare = if args ? forceShare then args.forceShare else ["man" "doc" "info"]; - forceCopy = ["COPYING" "LICENSE" "DISTRIBUTION" "LEGAL" - "README" "AUTHORS" "ChangeLog" "CHANGES" "LICENCE" "COPYRIGHT"] ++ - (optional (attrByPath ["forceCopyDoc"] true args) "doc"); - - hasSuffixHack = a: b: hasSuffix (a+(substring 0 0 b)) ((substring 0 0 a)+b); - - archiveType = s: - (if hasSuffixHack ".tar" s then "tar" - else if (hasSuffixHack ".tar.gz" s) || (hasSuffixHack ".tgz" s) then "tgz" - else if (hasSuffixHack ".tar.bz2" s) || (hasSuffixHack ".tbz2" s) || - (hasSuffixHack ".tbz" s) then "tbz2" - else if hasSuffixHack ".tar.Z" s then "tZ" - else if hasSuffixHack ".tar.lzma" s then "tar.lzma" - else if hasSuffixHack ".tar.xz" s then "tar.xz" - else if hasSuffixHack ".rar" s then "rar" - else if (hasSuffixHack ".zip" s) || (hasSuffixHack ".ZIP" s) then "zip" - else if hasSuffixHack "-cvs-export" s then "cvs-dir" - else if hasSuffixHack "-git-export" s then "git-dir" - else if hasSuffixHack ".nar.bz2" s then "narbz2" - else if hasSuffixHack ".rpm" s then "rpm" - - # Mostly for manually specified directories.. - else if hasSuffixHack "/" s then "dir" - - # Last block - for single files!! It should be always after .tar.* - else if hasSuffixHack ".bz2" s then "plain-bz2" - else if hasSuffixHack ".gz" s then "plain-gz" - - # For bootstrap calls - else if (s ==("" + (substring 0 0 s))) then "empty" - - else (abort "unknown archive type : ${s}")); - - # changing this ? see [1] - defAddToSearchPath = fullDepEntry (" - addToSearchPathWithCustomDelimiter() { - local delimiter=\$1 - local varName=\$2 - local needDir=\$3 - local addDir=\${4:-\$needDir} - local prefix=\$5 - if [ -d \$prefix\$needDir ]; then - if [ -z \${!varName} ]; then - eval export \${varName}=\${prefix}\$addDir - else - eval export \${varName}=\${!varName}\${delimiter}\${prefix}\$addDir - fi - fi - } - - addToSearchPath() - { - addToSearchPathWithCustomDelimiter \"\${PATH_DELIMITER}\" \"\$@\" - } - ") ["defNest"]; - - # changing this ? see [1] - defNest = noDepEntry (" - nestingLevel=0 - - startNest() { - nestingLevel=\$((\$nestingLevel + 1)) - echo -en \"\\e[\$1p\" - } - - stopNest() { - nestingLevel=\$((\$nestingLevel - 1)) - echo -en \"\\e[q\" - } - - header() { - startNest \"\$2\" - echo \"\$1\" - } - - # Make sure that even when we exit abnormally, the original nesting - # level is properly restored. - closeNest() { - while test \$nestingLevel -gt 0; do - stopNest - done - } - - trap \"closeNest\" EXIT - "); - - - # changing this ? see [1] - minInit = fullDepEntry (" - ${stdenv.preHook} - - set -e - NIX_CC=${stdenv.cc} - export SHELL=${stdenv.shell} - PATH_DELIMITER=':' - - # Set up the initial path. - PATH= - for i in \$NIX_CC ${toString stdenv.initialPath}; do - PATH=\$PATH\${PATH:+\"\${PATH_DELIMITER}\"}\$i/bin - done - - export TZ=UTC - - prefix=${if args ? prefix then (toString args.prefix) else "\$out"} - - ") ["defNest" "defAddToSearchPath"]; - - # if you change this rewrite using '' instead of "" to get rid of indentation in builder scripts - addInputs = fullDepEntry (" - # Recursively find all build inputs. - findInputs() - { - local pkg=\$1 - - case \$pkgs in - *\\ \$pkg\\ *) - return 0 - ;; - esac - - pkgs=\"\$pkgs \$pkg \" - - echo \$pkg - if test -f \$pkg/nix-support/setup-hook; then - source \$pkg/nix-support/setup-hook - fi - } - - pkgs=\"\" - for i in \$NIX_CC ${toString realBuildInputs}; do - findInputs \$i - done - - - # Set the relevant environment variables to point to the build inputs - # found above. - addToEnv() - { - local pkg=\$1 - "+ - (if !((args ? ignoreFailedInputs) && (args.ignoreFailedInputs == 1)) then " - if [ -e \$1/nix-support/failed ]; then - echo \"failed input \$1\" >&2 - fail - fi - " else "") - +(if addSbinPath then " - if test -d \$1/sbin; then - export _PATH=\$_PATH\${_PATH:+\"\${PATH_DELIMITER}\"}\$1/sbin - fi - " else "") - +" - if test -d \$1/bin; then - export _PATH=\$_PATH\${_PATH:+\"\${PATH_DELIMITER}\"}\$1/bin - fi - - for i in \"\${envHooks[@]}\"; do - \$i \$pkg - done - } - - for i in \$pkgs; do - addToEnv \$i - done - - - # Add the output as an rpath. - if test \"\$NIX_NO_SELF_RPATH\" != \"1\"; then - export NIX_LDFLAGS=\"-rpath \$out/lib \$NIX_LDFLAGS\" - fi - - PATH=\$_PATH\${_PATH:+\"\${PATH_DELIMITER}\"}\$PATH - ") ["minInit"]; - - # changing this ? see [1] - defEnsureDir = fullDepEntry (" - # Ensure that the given directories exists. - ensureDir() { - local dir - for dir in \"\$@\"; do - if ! test -x \"\$dir\"; then mkdir -p \"\$dir\"; fi - done - } - ") ["minInit"]; - - # changing this ? see [1] - toSrcDir = s : fullDepEntry ((if (archiveType s) == "tar" then " - tar xvf '${s}' - cd \"\$(tar tf '${s}' | head -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "tgz" then " - tar xvzf '${s}' - cd \"\$(tar tzf '${s}' | head -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "tbz2" then " - tar xvjf '${s}' - cd \"\$(tar tjf '${s}' | head -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "tZ" then " - uncompress < '${s}' | tar x - cd \"\$(uncompress < '${s}' | tar t | head -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "tar.lzma" then " - unlzma -d -c <'${s}' | tar xv - cd \"\$(unlzma -d -c <'${s}' | tar t | head -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "tar.xz" then " - xz -d -c <'${s}' | tar xv - cd \"\$(xz -d -c <'${s}' | tar t | head -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "rar" then " - unrar x '${s}' - cd \"$(unrar lb '${s}' | tail -1 | sed -e 's@/.*@@' )\" - " else if (archiveType s) == "zip" then " - unzip '${s}' - cd \"$( unzip -lqq '${s}' | tail -1 | - sed -e 's@^\\(\\s\\+[-0-9:]\\+\\)\\{3,3\\}\\s\\+\\([^/]\\+\\)/.*@\\2@' )\" - " else if (archiveType s) == "cvs-dir" then " - cp -r '${s}' . - cd \$(basename ${s}) - chmod u+rwX -R . - " else if (archiveType s) == "git-dir" then " - cp -r '${s}' . - cd \$(basename ${s}) - chmod u+rwX -R . - " else if (archiveType s) == "dir" then " - cp -r '${s}' . - cd \$(basename ${s}) - chmod u+rwX -R . - " else if (archiveType s) == "narbz2" then " - bzip2 <${s} | nix-store --restore \$PWD/\$(basename ${s} .nar.bz2) - cd \$(basename ${s} .nar.bz2) - " else if (archiveType s) == "rpm" then '' - rpm2cpio ${s} > ${s}.cpio - cpio -iv < ${s}.cpio - test -f *.tar.* && tar -xvf *.tar.* - test -d */ && cd */ - '' else if (archiveType s) == "plain-bz2" then " - mkdir \$PWD/\$(basename ${s} .bz2) - NAME=\$(basename ${s} .bz2) - bzip2 -d <${s} > \$PWD/\$(basename ${s} .bz2)/\${NAME#*-} - cd \$(basename ${s} .bz2) - " else if (archiveType s) == "plain-gz" then " - mkdir \$PWD/\$(basename ${s} .gz) - NAME=\$(basename ${s} .gz) - gzip -d <${s} > \$PWD/\$(basename ${s} .gz)/\${NAME#*-} - cd \$(basename ${s} .gz) - " else if (archiveType s) == "empty" then " - echo No source to unpack - doing nothing .. - " else (abort "unknown archive type : ${s}"))+ - # goSrcDir is typically something like "cd mysubdir" .. but can be anything else - (if args ? goSrcDir then args.goSrcDir else "") - ) ["minInit"]; - - configureCommand = attrByPath ["configureCommand"] "./configure" args; - - # changing this ? see [1] - doConfigure = fullDepEntry (" - ${configureCommand} --prefix=\"\$prefix\" ${toString configureFlags} - ") ["minInit" "addInputs" "doUnpack"]; - - # changing this ? see [1] - doIntltool = fullDepEntry (" - mkdir -p config - intltoolize --copy --force - ") ["minInit" "addInputs" "doUnpack"]; - - # changing this ? see [1] - doAutotools = fullDepEntry (" - mkdir -p config - libtoolize --copy --force - aclocal --force - #Some packages do not need this - autoheader || true; - automake --add-missing --copy - autoconf - ")["minInit" "addInputs" "doUnpack"]; - - # changing this ? see [1] - doAutogen = fullDepEntry ('' - ./autogen.sh - '')["minInit" "addInputs" "doUnpack"]; - - # changing this ? see [1] - doMake = fullDepEntry (" - make ${toString makeFlags} - ") ["minInit" "addInputs" "doUnpack"]; - - doUnpack = toSrcDir (toString src); - - # changing this ? see [1] - installPythonPackage = fullDepEntry (" - python setup.py install --prefix=\"\$prefix\" - ") ["minInit" "addInputs" "doUnpack"]; - - doPythonConfigure = fullDepEntry ('' - pythonVersion=$(toPythonPath "$prefix") - pythonVersion=''${pythonVersion#*/lib/python} - pythonVersion=''${pythonVersion%%/site-packages} - ${if args ? extraPythonConfigureCommand then - args.extraPythonConfigureCommand - else ""} - python configure.py -b "$prefix/bin" -d "$(toPythonPath "$prefix")" -v "$prefix/share/sip" ${toString configureFlags} - '') ["minInit" "addInputs" "doUnpack"]; - - # changing this ? see [1] - doMakeInstall = fullDepEntry (" - make ${toString (attrByPath ["makeFlags"] "" args)} "+ - "${toString (attrByPath ["installFlags"] "" args)} install") ["doMake"]; - - # changing this ? see [1] - doForceShare = fullDepEntry (" - mkdir -p \"\$prefix/share\" - for d in ${toString forceShare}; do - if [ -d \"\$prefix/\$d\" -a ! -d \"\$prefix/share/\$d\" ]; then - mv -v \"\$prefix/\$d\" \"\$prefix/share\" - ln -sv share/\$d \"\$prefix\" - fi; - done; - ") ["minInit" "defEnsureDir"]; - - doForceCopy = fullDepEntry ('' - name="$(basename $out)" - name="''${name#*-}" - mkdir -p "$prefix/share/$name" - for f in ${toString forceCopy}; do - cp -r "$f" "$prefix/share/$name/$f" || true - done; - '') ["minInit" "defEnsureDir"]; - - doDump = n: noDepEntry "echo Dump number ${n}; set"; - - saveEnv = noDepEntry ''export > "$TMP/env-vars" || true''; - - doDumpBuildInputs = noDepEntry ('' - echo "${toString realBuildInputs}" - ''); - - patchFlags = if args ? patchFlags then args.patchFlags else "-p1"; - - patches = attrByPath ["patches"] [] args; - - toPatchCommand = s: "cat ${s} | patch ${toString patchFlags}"; - - doPatch = fullDepEntry (concatStringsSep ";" - (map toPatchCommand patches) - ) ["minInit" "doUnpack"]; - - envAdderInner = s: x: if x==null then s else y: - a: envAdderInner (s+"echo export ${x}='\"'\"\$${x}:${y}\";'\"'\n") a; - - envAdder = envAdderInner ""; - - envAdderList = l: if l==[] then "" else - "echo export ${head l}='\"'\"\\\$${head l}:${head (tail l)}\"'\"';\n" + - envAdderList (tail (tail l)); - - # changing this ? see [1] - wrapEnv = cmd: env: " - mv \"${cmd}\" \"${cmd}-orig\"; - touch \"${cmd}\"; - chmod a+rx \"${cmd}\"; - (${envAdderList env} - echo '\"'\"${cmd}-orig\"'\"' '\"'\\\$@'\"' \n) > \"${cmd}\""; - - doWrap = cmd: fullDepEntry (wrapEnv cmd (attrByPath ["wrappedEnv"] [] args)) ["minInit"]; - - makeManyWrappers = wildcard : wrapperFlags : fullDepEntry ('' - for i in ${wildcard}; do - wrapProgram "$i" ${wrapperFlags} - done - '') ["minInit" "addInputs" "defEnsureDir"]; - - wrapBinContentsPython = (makeManyWrappers - ''$out/bin/*'' - pythonWrapperArguments - ); - - pythonWrapperArguments = - (''--prefix PYTHONPATH : $(toPythonPath $out)'' + - ''''${PYTHONPATH:+ --prefix PYTHONPATH : $PYTHONPATH}''); - - preservePathWrapperArguments = ''''${PATH:+ --prefix PATH : $PATH }''; - - doPropagate = fullDepEntry (" - mkdir -p \$out/nix-support - echo '${toString (attrByPath ["propagatedBuildInputs"] [] args)}' >\$out/nix-support/propagated-build-inputs - ") ["minInit" "defEnsureDir"]; - - cmakeFlags = attrByPath ["cmakeFlags"] [] args; - - cmakeRPathFlag = if attrByPath ["cmakeSkipRpath "] true args then " -DCMAKE_SKIP_BUILD_RPATH=ON " else ""; - - cmakeBuildDir = attrByPath ["cmakeBuildDir"] "build" args; - - doCmake = fullDepEntry ('' - mkdir ${cmakeBuildDir} - cd ${cmakeBuildDir} - cmake -D CMAKE_INSTALL_PREFIX="$out" ${cmakeRPathFlag}${toString cmakeFlags} .. - '') ["minInit" "addInputs" "doUnpack"]; - - doScons = fullDepEntry ('' - mkdir -p $out - ${if (attrByPath ["sconsCleanEnv"] false args) - then "" - else '' - sed -e '1iimport os' -i SConstruct - sed -e 's/env *= *Environment *.*/&; env['"'"'ENV'"'"']=os.environ;/' -i SConstruct - '' - } - scons ${toString (attrByPath ["sconsFlags"] [] args)} PREFIX=$out - scons ${toString (attrByPath ["sconsFlags"] [] args)} PREFIX=$out install - '') ["minInit" "doUnpack" "addInputs" "defEnsureDir"]; - - /*debug = x:(trace x x); - debugX = x:(trace (toXML x) x);*/ - - makeNest = x: if x == defNest.text then x else "startNest\n" + x + "\nstopNest\n"; - textClosure = a: steps: textClosureMap makeNest a (["defNest"] ++ steps); - - inherit noDepEntry fullDepEntry packEntry; - - defList = attrByPath ["defList"] [] args; - getVal = getValue args defList; - check = checkFlag args; - reqsList = attrByPath ["reqsList"] [] args; - buildInputsNames = filter (x: null != getVal x) - (uniqList {inputList = - (concatLists (map - (x: if x==[] then [] else builtins.tail x) - reqsList));}); - configFlags = attrByPath ["configFlags"] [] args; - buildFlags = attrByPath ["buildFlags"] [] args; - nameSuffixes = attrByPath ["nameSuffixes"] [] args; - autoBuildInputs = assert (checkReqs args defList reqsList); - filter (x: x!=null) (map getVal buildInputsNames); - autoConfigureFlags = condConcat "" configFlags check; - autoMakeFlags = condConcat "" buildFlags check; - useConfig = attrByPath ["useConfig"] false args; - realBuildInputs = - lib.closePropagation ((if useConfig then - autoBuildInputs else - attrByPath ["buildInputs"] [] args)++ - (attrByPath ["propagatedBuildInputs"] [] args)); - configureFlags = if useConfig then autoConfigureFlags else - attrByPath ["configureFlags"] "" args; - makeFlags = if useConfig then autoMakeFlags else attrByPath ["makeFlags"] "" args; - - inherit lib; - - surroundWithCommands = x : before : after : {deps=x.deps; text = before + "\n" + - x.text + "\n" + after ;}; - - createDirs = fullDepEntry (concatStringsSep ";" - (map (x: "mkdir -p ${x}") (attrByPath ["neededDirs"] [] args)) - ) ["minInit" "defEnsureDir"]; - - copyExtraDoc = fullDepEntry ('' - name="$(basename $out)" - name="''${name#*-}" - mkdir -p "$out/share/doc/$name" - '' + (concatStringsSep ";" - (map - (x: ''cp "${x}" "$out/share/doc/$name" || true;'') - (attrByPath ["extraDoc"] [] args)))) ["minInit" "defEnsureDir" "doUnpack"]; - - realPhaseNames = - (optional ([] != attrByPath ["neededDirs"] [] args) "createDirs") - ++ - (attrByPath ["phaseNames"] [] args) - ++ - ["doForceShare" "doPropagate" "doForceCopy"] - ++ - (optional ([] != attrByPath ["extraDoc"] [] args) "copyExtraDoc") - ++ - (optional (attrByPath ["doCheck"] false args) "doMakeCheck") - ++ - (optional (attrByPath ["alwaysFail"] false args) "doFail") - ; - - doFail = noDepEntry " - echo 'Failing to keep builddir (and to invalidate result).' - a() { return 127; } ; a ; - "; - - doMakeCheck = fullDepEntry ('' - make check - '') ["minInit"]; - - extraDerivationAttrs = lib.attrByPath ["extraDerivationAttrs"] {} args; - - # for overrides.. - builderDefsArgs = args; - - innerBuilderDefsPackage = bd: args: ( - let localDefs = bd.passthru.function args; in - - stdenv.mkDerivation ((rec { - inherit (localDefs) name; - buildCommand = textClosure localDefs localDefs.realPhaseNames; - meta = localDefs.meta; - passthru = localDefs.passthru // {inherit (localDefs) src; }; - }) // (if localDefs ? propagatedBuildInputs then { - inherit (localDefs) propagatedBuildInputs; - } else {}) // extraDerivationAttrs) - ); - - builderDefsPackage = bd: func: - if builtins.isFunction func then - (foldArgs - (x: y: ((func (bd // x // y)) // y)) - (innerBuilderDefsPackage bd) - {}) - else - (builderDefsPackage bd (import (toString func))) - ; - - generateFontsFromSFD = fullDepEntry ('' - for i in *.sfd; do - echo $i; - fontforge -c \ - 'Open($1); - ${optionalString (args ? extraFontForgeCommands) args.extraFontForgeCommands - }Reencode("unicode"); - ${optionalString (attrByPath ["createTTF"] true args) ''Generate($1:r + ".ttf");''} - ${optionalString (attrByPath ["createOTF"] true args) ''Generate($1:r + ".otf");''} - Reencode("TeX-Base-Encoding"); - ${optionalString (attrByPath ["createAFM"] true args) ''Generate($1:r + ".afm");''} - ${optionalString (attrByPath ["createPFM"] true args) ''Generate($1:r + ".pfm");''} - ${optionalString (attrByPath ["createPFB"] true args) ''Generate($1:r + ".pfb");''} - ${optionalString (attrByPath ["createMAP"] true args) ''Generate($1:r + ".map");''} - ${optionalString (attrByPath ["createENC"] true args) ''Generate($1:r + ".enc");''} - ' $i; - done - '') ["minInit" "addInputs" "doUnpack"]; - - installFonts = - let retrievedName = (if args ? name then args.name else ""); in - fullDepEntry ('' - mkdir -p $out/share/fonts/truetype/public/${retrievedName} - mkdir -p $out/share/fonts/opentype/public/${retrievedName} - mkdir -p $out/share/fonts/type1/public/${retrievedName} - mkdir -p $out/share/texmf/fonts/enc/${retrievedName} - mkdir -p $out/share/texmf/fonts/map/${retrievedName} - - find -name '*.ttf' -exec cp {} $out/share/fonts/truetype/public/${retrievedName} \; - find -name '*.otf' -exec cp {} $out/share/fonts/opentype/public/${retrievedName} \; - find -name '*.pfm' -o -name '*.afm' -o -name '*.pfb' -exec cp {} $out/share/fonts/type1/public/${retrievedName} \; - find -name '*.enc' -exec cp {} $out/share/texmf/fonts/enc/${retrievedName} \; - find -name '*.map' -exec cp {} $out/share/texmf/fonts/map/${retrievedName} \; - '') ["minInit" "defEnsureDir"]; - - simplyShare = shareName: fullDepEntry ('' - mkdir -p $out/share - cp -r . $out/share/${shareName} - '') ["doUnpack" "defEnsureDir"]; - - doPatchShebangs = dir: fullDepEntry ('' - patchShebangFun() { - # Rewrite all script interpreter file names (`#! /path') under the - # specified directory tree to paths found in $PATH. E.g., - # /bin/sh will be rewritten to /nix/store/<hash>-some-bash/bin/sh. - # Interpreters that are already in the store are left untouched. - echo "patching script interpreter paths" - local f - for f in $(find "${dir}" -xtype f -perm -0100); do - local oldPath=$(sed -ne '1 s,^#![ ]*\([^ ]*\).*$,\1,p' "$f") - if test -n "$oldPath" -a "''${oldPath:0:''${#NIX_STORE}}" != "$NIX_STORE"; then - local newPath=$(type -P $(basename $oldPath) || true) - if test -n "$newPath" -a "$newPath" != "$oldPath"; then - echo "$f: interpreter changed from $oldPath to $newPath" - sed -i "1 s,$oldPath,$newPath," "$f" - else - echo "$f: not changing interpreter from $oldPath" - fi - fi - done - } - patchShebangFun; - '') ["minInit"]; - - createPythonInstallationTarget = fullDepEntry ('' - mkdir -p $(toPythonPath $out) - export PYTHONPATH=$PYTHONPATH''${PYTHONPATH:+:}$(toPythonPath $out) - '') ["minInit" "addInputs" "defEnsureDir"]; - - fetchUrlFromSrcInfo = srcInfo: fetchurl ({ - url = srcInfo.url; - sha256 = srcInfo.hash; - } // - (if srcInfo ? downloadName then {name = srcInfo.downloadName;} else {})); - - fetchGitFromSrcInfo = srcInfo: fetchgit { - url = srcInfo.url; - rev = srcInfo.rev; - sha256 = srcInfo.hash; - }; -}) // args - -# [1]: rewrite using '' instead of " so that indentation gets stripped. It's -# only about some spaces but in the end they will sum up |