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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# 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 ? []
, name ? "source-tarball"
, version ? "0"
, versionSuffix ?
if officialRelease
then ""
else "pre${toString (src.rev or src.revCount or "")}"
, src, stdenv, autoconf, automake, libtool
, # By default, provide all the GNU Build System as input.
bootstrapBuildInputs ? [ autoconf automake libtool ]
, ... } @ args:
stdenv.mkDerivation (
# First, attributes that can be overriden by the caller (via args):
{
# 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;
preConfigurePhases = "autoconfPhase";
postPhases = "finalPhase";
# Autoconfiscate the sources.
autoconfPhase = ''
export VERSION=${version}
export VERSION_SUFFIX=${versionSuffix}
# `svn-revision' is set for backwards compatibility with the old
# Nix buildfarm. (Stratego/XT's autoxt uses it. We should
# update it eventually.)
echo ${versionSuffix} | sed -e s/pre// > svn-revision
eval "$preAutoconf"
if test -x ./bootstrap && test -f ./bootstrap; then ./bootstrap
elif test -x ./bootstrap.sh; then ./bootstrap.sh
elif test -x ./autogen.sh; then ./autogen.sh
elif test -x ./autogen ; then ./autogen
elif test -x ./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"
'';
failureHook = ''
if test -n "$succeedOnFailure"; then
if test -n "$keepBuildDirectory"; then
KEEPBUILDDIR="$out/`basename $TMPDIR`"
header "Copying build directory to $KEEPBUILDDIR"
mkdir -p $KEEPBUILDDIR
cp -R "$TMPDIR/"* $KEEPBUILDDIR
stopNest
fi
fi
'';
}
# Then, the caller-supplied attributes.
// args //
# And finally, our own stuff.
{
name = name + "-" + version + versionSuffix;
buildInputs = buildInputs ++ bootstrapBuildInputs;
preUnpack = ''
mkdir -p $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
rm now then
eval "$nextPostUnpack"
'';
nextPostUnpack = if args ? postUnpack then args.postUnpack else "";
# Cause distPhase to copy tar.bz2 in addition to tar.gz.
tarballs = "*.tar.gz *.tar.bz2 *.tar.xz";
finalPhase = ''
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;
version = version + versionSuffix;
};
meta = (if args ? meta then args.meta else {}) // {
description = "Source distribution";
# Tarball builds are generally important, so give them a high
# default priority.
schedulingPriority = 200;
};
}
)
|