summaryrefslogtreecommitdiff
path: root/scripts/dev/makedist
blob: 515e4ba722870882d825457a96b65932071f1e16 (plain)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/bin/sh
#
# Creates PHP release packages.
#
# Written by Stig Bakken <ssb@guardian.no> 1997-05-28.
# Adapted to Git by Stanislav Malyshev <stas@php.net>.

# Go to project root directory.
cd $(CDPATH= cd -- "$(dirname -- "$0")/../../" && pwd -P)

# Process options and arguments.
while :; do
  case $1 in
    -h|--help)
      cat << HELP
PHP distribution generator

Creates PHP release packages (tar.gz, tar.bz2, tar.xz) from the php-src Git
repository. The snapshot archive includes also generated configure script,
configuration headers, parsers, lexers, and similar generated files to simplify
the installation on the *nix systems.

SYNOPSIS:
  makedist [options] <tree-ish>

OPTIONS:
  -h, --help        Display this help.
  --remote=<repo>   Instead of using a local repository, retrieve a tar archive
                    from a remote repository.
  <tree-ish>        The Git tree or Git commit to produce an archive for. This
                    script needs a consistent tagging of releases. Each release
                    of a package should have a tag of the form:
                      php-X.Y.Z[alpha|beta|RC]

                    or branch:
                       PHP-X.Y[.Z]

                    Where:
                      - X is major version number
                      - Y is minor version number
                      - Z is patch version number
                      - last part of tag is optional and is one of RC, alpha, or
                        beta and belonging number.

EXAMPLES:

  Create snapshot of the master branch:
    scripts/dev/makedist

  Create snapshot of the PHP-7.4 branch:
    scripts/dev/makedist PHP-7.4

  Create release packages for the stable tag php-7.4.0:
    scripts/dev/makedist php-7.4.0

  Create release candidate packages for the tag php-7.4.0RC1:
    scripts/dev/makedist php-7.4.0RC1

  Create release packages from a remote Git repository for the tag php-7.4.0:
    scripts/dev/makedist --remote=git@git.php.net:php-src.git php-7.4.0
HELP
      exit
      ;;
    --remote)
      # Check for an option argument.
      if test -n "$2"; then
        remote=$2
        shift
      else
        echo "makedist: '--remote' requires a non-empty option argument." >&2
        exit 1
      fi
      ;;
    --remote=?*)
      # Set everything after the "=".
      remote=${1#*=}
      ;;
    --remote=)
      # When passing empty "--remote=" option.
      echo "makedist: '--remote' requires a non-empty option argument." >&2
      exit 1
      ;;
    -?*)
      echo "makedist WARNING: Unknown option (ignored): '$1'" >&2
      ;;
    *)
      # When no more options, check for an argument and break out of the loop.
      if test -n "$1"; then
        treeish="$1"
        prefix="$treeish"
      elif test -z "$treeish"; then
        treeish="master"
        prefix="php-master-"$(date +"%Y-%m-%d-%H-%M")
      fi
      break
  esac

  shift
done

# Verify that the temporary directory for the package files doesn't exist.
if test -d "$prefix"; then
  echo "makedist: The directory $prefix" >&2
  echo "          already exists. Rename or remove it and run makedist again." >&2
  exit 1
fi

if test -n "$remote"; then
  remote_option="--remote=$remote"
  git=$remote
else
  echo "makedist: Verifying that tree-ish $treeish exists in Git repository."
  git rev-parse --verify $treeish
  exit_code=$?
  if test "$exit_code" != "0"; then
    echo "makedist: $treeish is not found in the Git repository." >&2
    exit $exit_code
  else
    echo "makedist: OK"
  fi

  git="current Git repository."
fi

# Export PHP.
echo "makedist: Exporting $treeish from $git"
git archive --format=tar $remote_option --prefix=$prefix/ $treeish | tar xvf - || exit 4

cd $prefix || exit 5

# Generate configure script so autoconf is not required to install.
echo ""
echo "makedist: Generating files."
./buildconf --force

# Generate lexer and parser files so bison and re2c aren't required to install.
./scripts/dev/genfiles
exit_code=$?
if test "$exit_code" != "0"; then
  exit $exit_code
fi

# Remove not needed files.
rm -rf autom4te.cache/

# Download PEAR.
echo ""
echo "makedist: Attempting to download PEAR's phar archive."
if test ! -x wget; then
  wget https://pear.php.net/install-pear-nozlib.phar -nd -P pear/
  if [ "x$?" != "x0" ]; then
    echo "makedist: PEAR download failed." >&2
    exit 1
  fi
else
  echo "makedist: Missing wget binary needed for PEAR download." >&2
  exit 1
fi

# Reset the modification and access times of all files to be packaged.
echo "makedist: Resetting the modification and access times of package files."
find . -exec touch -c {} \;

cd ..

echo ""
echo "makedist: Creating $prefix.tar archive."
tar cf "$prefix".tar "$prefix"
rm -rf "$prefix" "$prefix".tar.*

echo "makedist: Creating $prefix.tar.gz archive."
gzip -9 -k "$prefix".tar || exit 6
md5sum "$prefix".tar.gz
gzip -t "$prefix".tar.gz

sync
sleep 2

echo "makedist: Creating $prefix.tar.bz2 archive."
bzip2 -9 -k $prefix.tar || exit 7
md5sum $prefix.tar.bz2
bzip2 -t $prefix.tar.bz2

sync
sleep 2

echo "makedist: Creating $prefix.tar.xz archive."
xz -9 -k "$prefix".tar || exit 9
md5sum "$prefix".tar.xz
xz -t "$prefix".tar.xz

echo ""
echo "makedist: Cleaning up."
rm -f "$prefix".tar || exit 13
echo ""
echo "makedist: All done."