summaryrefslogtreecommitdiff
path: root/scripts/dev/genfiles
blob: 3e085c3e5397fb68492a1a4849c3dd3b55142605 (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
#!/bin/sh
#
#  +----------------------------------------------------------------------+
#  | Copyright (c) The PHP Group                                          |
#  +----------------------------------------------------------------------+
#  | This source file is subject to version 3.01 of the PHP license,      |
#  | that is bundled with this package in the file LICENSE, and is        |
#  | available through the world-wide-web at the following url:           |
#  | https://php.net/license/3_01.txt                                     |
#  | If you did not receive a copy of the PHP license and are unable to   |
#  | obtain it through the world-wide-web, please send a note to          |
#  | license@php.net so we can mail you a copy immediately.               |
#  +----------------------------------------------------------------------+
#  | Authors: Sascha Schumann <sascha@schumann.cx>                        |
#  +----------------------------------------------------------------------+
#
# This script generates PHP lexer and parser files required to build PHP. The
# generated files are ignored in the Git repository and packaged during the PHP
# release process into the release installation archive download. This way the
# bison and re2c dependencies are not required to build PHP when downloading
# release archive.
#
# Usage: genfiles
#
# Environment:
#   The following environment variables can override default generators paths.
#
#     YACC    Parser generator program, default bison
#     RE2C    Lexer generator program, default re2c
#     SED     Path to sed program, default sed
#     MAKE    Path to make program, default make
#
#   For example:
#     YACC=/path/to/bison ./genfiles

YACC=${YACC:-bison}
YACC="$YACC -l"
RE2C=${RE2C:-re2c}
RE2C_FLAGS="-i"
SED=${SED:-sed}
MAKE=${MAKE:-make}

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

# Check required bison version from the configure.ac file.
required_bison_version=$($SED -n 's/PHP_PROG_BISON(\[\([0-9\.]*\)\].*/\1/p' configure.ac)
set -f; IFS='.'; set -- $required_bison_version; set +f; IFS=' '
required_bison_num="$(expr ${1:-0} \* 10000 + ${2:-0} \* 100 + ${3:-0})"

current_version=$($YACC --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | tr -d a-z)
set -f; IFS='.'; set -- $current_version; set +f; IFS=' '
current_bison_num="$(expr ${1:-0} \* 10000 + ${2:-0} \* 100 + ${3:-0})"

if test -z "$current_version"; then
  echo "genfiles: bison not found." >&2
  echo "          You need bison version $required_bison_version or newer installed" >&2
  echo "          to regenerate parser files." >&2
  exit 1
fi

if test "$current_bison_num" -lt "$required_bison_num"; then
  echo "genfiles: bison version $current_version found." >&2
  echo "          You need bison version $required_bison_version or newer installed" >&2
  echo "          to build parser files." >&2
  exit 1
else
  echo "genfiles: bison version $current_version (ok)"
fi

# Check required re2c version from the configure.ac file.
required_re2c_version=$($SED -n 's/PHP_PROG_RE2C(\[\(.*\)\])/\1/p' configure.ac)
set -f; IFS='.'; set -- $required_re2c_version; set +f; IFS=' '
required_re2c_num="$(expr ${1:-0} \* 10000 + ${2:-0} \* 100 + ${3:-0})"

current_version="$($RE2C --version | cut -d ' ' -f 2  2>/dev/null)"
set -f; IFS='.'; set -- $current_version; set +f; IFS=' '
current_re2c_num="$(expr ${1:-0} \* 10000 + ${2:-0} \* 100 + ${3:-0})"

if test -z "$current_version"; then
  echo "genfiles: re2c not found." >&2
  echo "          You need re2c version $required_re2c_version or newer installed" >&2
  echo "          to regenerate lexer files." >&2
  exit 1
fi

if test "$current_re2c_num" -lt "$required_re2c_num"; then
  echo "genfiles: re2c version $current_version found." >&2
  echo "          You need re2c version $required_re2c_version or newer installed" >&2
  echo "          to build lexer files." >&2
  exit 1
else
  echo "genfiles: re2c version $current_version (ok)"
fi

# Check if make exists.
if ! test -x "$(command -v $MAKE)"; then
  echo "genfiles: make not found. Please install make to generate files." >&2
  exit 1
fi

echo "genfiles: Generating Zend parser and lexer files"
$MAKE RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" YACC="$YACC" SED="$SED" srcdir=Zend builddir=Zend top_srcdir=. \
  -f Zend/Makefile.frag \
  Zend/zend_language_parser.c \
  Zend/zend_language_scanner.c \
  Zend/zend_ini_parser.c \
  Zend/zend_ini_scanner.c

echo "genfiles: Generating phpdbg parser and lexer files"
$MAKE RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" YACC="$YACC" srcdir=sapi/phpdbg builddir=sapi/phpdbg top_srcdir=. \
  -f sapi/phpdbg/Makefile.frag \
  sapi/phpdbg/phpdbg_parser.c \
  sapi/phpdbg/phpdbg_lexer.c

echo "genfiles: Generating json extension parser and lexer files"
$MAKE RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" YACC="$YACC" srcdir=ext/json builddir=ext/json top_srcdir=. \
  -f ext/json/Makefile.frag \
  ext/json/json_parser.tab.c \
  ext/json/json_scanner.c

echo "genfiles: Generating PDO lexer file"
$MAKE RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" srcdir=ext/pdo builddir=ext/pdo top_srcdir=. \
  -f ext/pdo/Makefile.frag \
  ext/pdo/pdo_sql_parser.c

echo "genfiles: Generating standard extension lexer files"
$MAKE RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" srcdir=ext/standard builddir=ext/standard top_srcdir=. \
  -f ext/standard/Makefile.frag \
  ext/standard/var_unserializer.c \
  ext/standard/url_scanner_ex.c

echo "genfiles: Generating phar extension lexer file"
$MAKE RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" srcdir=ext/phar builddir=ext/phar top_srcdir=. \
  -f ext/phar/Makefile.frag \
  ext/phar/phar_path_check.c