about summary refs log tree commit diff
path: root/pkgs/build-support/release/make-source-tarball.nix
blob: f3a9f168893440ebe3f2cf6ba9369a5bd98a36c2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# This function converts an un-Autoconfed source tarball (typically a
# checkout from a Subversion or CVS repository) into a source tarball
# by running `autoreconf', `configure' and `make dist'.

{ officialRelease ? false
, buildInputs ? []
, src, stdenv, autoconf, automake, libtool
, ...} @ args:

let

  versionSuffix =
    if officialRelease
    then ""
    else if src ? rev then "pre${toString src.rev}" else "";

in

stdenv.mkDerivation (

  # First, attributes that can be overriden by the caller (via args):
  {
    name = "source-tarball";

    # By default, only configure and build a source distribution.
    # Some packages can only build a distribution after a general
    # `make' (or even `make install').
    dontBuild = true;
    dontInstall = true;
    doDist = true;

    # If we do install, install to a dummy location.
    useTempPrefix = true;

    showBuildStats = true;

    phases = "unpackPhase patchPhase autoconfPhase configurePhase buildPhase installPhase checkPhase distPhase";
  }

  # Then, the caller-supplied attributes.
  // args // 

  # And finally, our own stuff.
  {
    src = src.path;

    buildInputs = buildInputs ++ [autoconf automake libtool];
    
    postHook = ''
      ensureDir $out/nix-support
    '';  

    postUnpack = ''
      # Set all source files to the current date.  This is because Nix
      # resets the timestamp on all files to 0 (1/1/1970), which some
      # people don't like (in particular GNU tar prints harmless but
      # frightening warnings about it).
      touch now
      touch -d "1970-01-01 00:00:00 UTC" then
      find $sourceRoot ! -newer then -print0 | xargs -0r touch --reference now
      eval "$nextPostUnpack"
    '';

    nextPostUnpack = if args ? postUnpack then args.postUnpack else "";

    # Autoconfiscate the sources.
    autoconfPhase = ''
      export VERSION_SUFFIX=${versionSuffix}
    
      eval "$preAutoconf"
    
      if test -f ./bootstrap; then ./bootstrap
      elif test -f ./bootstrap.sh; then ./bootstrap.sh
      elif test -f ./reconf; then ./reconf
      elif test -f ./configure.in || test -f ./configure.ac; then
          autoreconf --install --force --verbose
      else
          echo "No bootstrap, bootstrap.sh, configure.in or configure.ac. Assuming this is not an GNU Autotools package."
      fi
    
      eval "$postAutoconf"
    '';

    # Cause distPhase to copy tar.bz2 in addition to tar.gz.
    tarballs = "*.tar.gz *.tar.bz2";

    postDist = ''
      shopt -s nullglob
      for i in $out/tarballs/*; do
        echo "file source-dist $i" >> $out/nix-support/hydra-build-products
      done

      # Try to figure out the release name.
      releaseName=$( (cd $out/tarballs && ls) | head -n 1 | sed -e 's^\.[a-z].*^^')
      test -n "$releaseName" && (echo "$releaseName" >> $out/nix-support/hydra-release-name)
    ''; # */

    passthru = {inherit src;};

    meta = {
      description = "Build of a source distribution from a checkout";
    };
  
  }

)