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
|
#!/bin/sh
#------------------------------------------------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | www.openfoam.com
# \\/ M anipulation |
#-------------------------------------------------------------------------------
# Copyright (C) 2019 OpenCFD Ltd.
#-------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM, licensed under GNU General Public License
# <http://www.gnu.org/licenses/>.
#
# Script
# makeParser
#
# Description
# Pregenerate ragel code and/or lemon parser headers
#
#------------------------------------------------------------------------------
usage() {
exec 1>&2
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat<<USAGE
Usage: ${0##*/} [options]
options:
-prefix=NAME Common prefix for parser and scanner
-parser=FILE Generate lemon parser header
-scanner=FILE Generate ragel scanner code
-code Generate parser code, not header
-header Generate parser header, not code (default)
-dry-run Process m4 only (output on stdout)
-no-tmp Do not retain temporary m4 processed files
-remove Remove generated code
-h, -help Print the usage
Pregenerate ragel code and/or lemon parser headers
USAGE
exit 1
}
#------------------------------------------------------------------------------
# Parse arguments and options
#------------------------------------------------------------------------------
unset prefix parser scanner optHeader optDryRun optRemoveFile optRemoveTmp
while [ "$#" -gt 0 ]
do
case "$1" in
(-h | -help*) usage ;;
(-prefix=*) prefix="${1#*=}" ;;
(-parser=*) parser="${1#*=}" ;;
(-scanner=*) scanner="${1#*=}" ;;
(-code) optHeader=false ;;
(-head*) optHeader=true ;;
(-dry-run) optDryRun="-dry-run" ;; # Pass verbatim to wrapper
(-no-tmp) optRemoveTmp="-no-tmp" ;; # Pass verbatim to wrapper
(-remove) optRemoveFile=true ;;
(*) break ;;
esac
shift
done
#------------------------------------------------------------------------------
# Remove file, with feedback. $1 = file, $2 = message
removeFile() {
if test -f "$1" && rm -f "$1"
then
echo "Removed generated $2 file" 1>&2
else
echo "No generated $2 file to remove" 1>&2
fi
}
case "$scanner" in
(*.rl)
input="${prefix}${scanner}"
output="${prefix}${scanner%.*}.cc"
if [ "$optRemoveFile" = true ]
then
removeFile "$output" "ragel scanner"
elif command -v ragel >/dev/null
then
echo "Generating ragel scanner" 1>&2
ragel -G2 -o "$output" "$input"
else
echo "No ragel, leaving scanner intact" 1>&2
fi
echo
;;
esac
# The output code extension is .c (default) or .cc, but also possibly .C
# - mapping here consistent with wmake/rules/General/{bison,lemon}
extCode=c
case "$parser" in
(*.Y) extCode=C ;;
(*.yy | *.yy-m4 | *.lyy | *.lyy-m4) extCode=cc ;;
esac
# Detect m4, any additional messages (eg, using m4 etc)
unset usingM4 message
case "$parser" in
(*m4)
usingM4=true
message=", using m4 filtering"
;;
esac
case "$parser" in
(*.ly | *.lyy | *.ly-m4 | *.lyy-m4) # Lemon
input="${prefix}${parser}"
output="${parser%.*}.h"
if [ "$optRemoveFile" = true ]
then
removeFile "$output" "lemon header"
else
# Touch parser file time when using m4.
# This ensures that we have a better correspondence between
# generated and compiled versions since changes to the m4 macros
# may otherwise not be noticed.
if [ "$usingM4" = true ] && [ -f "$input" ]
then
message="$message (touching input file time)"
touch "$input"
fi
if [ "$optHeader" = false ]
then
echo "Generating lemon parser code ($extCode)$message" 1>&2
"${WM_PROJECT_DIR:?}/wmake/scripts/wrap-lemon" \
$optDryRun $optRemoveTmp -e"$extCode" -p -s "$input"
else
echo "Generating lemon parser header$message" 1>&2
"${WM_PROJECT_DIR:?}/wmake/scripts/wrap-lemon" \
$optDryRun $optRemoveTmp -header -p -s "$input"
fi
fi
echo
;;
(*.[Yy] | *.yy | *.y-m4 | *.yy-m4) # Bison
input="${prefix}${parser}"
if [ "$optRemoveFile" = true ]
then
echo "File removal not yet supported for bison" 1>&2
else
# Touch parser file time when using m4.
# This ensures that we have a better correspondence between
# generated and compiled versions since changes to the m4 macros
# may otherwise not be noticed.
if [ "$usingM4" = true ] && [ -f "$input" ]
then
message="$message (touching input file time)"
touch "$input"
fi
if [ -n "$optDryRun" ]
then
echo "Generating bison parser code ($extCode)$message" 1>&2
"${WM_PROJECT_DIR:?}/wmake/scripts/wrap-bison" \
$optDryRun $optRemoveTmp "$input"
else
echo "Currently only -dry-run is supported for bison" 1>&2
fi
fi
echo
;;
esac
#------------------------------------------------------------------------------
|