File: wrap-lemon

package info (click to toggle)
openfoam 1912.200626-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 238,940 kB
  • sloc: cpp: 1,159,638; sh: 15,902; ansic: 5,195; lex: 660; xml: 387; python: 282; awk: 212; makefile: 103; sed: 88; csh: 3
file content (285 lines) | stat: -rwxr-xr-x 7,478 bytes parent folder | download | duplicates (2)
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#!/bin/bash
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
#-------------------------------------------------------------------------------
#   Copyright (C) 2019-2020 OpenCFD Ltd.
#-------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
#
# Script
#     wrap-lemon
#
# Usage
#     wrap-lemon [options] [lemon options/args]
#
# Description
#     A wrapper to use lemon compiled with OpenFOAM with the appropriate
#     parser template.
#
#     When called with m4 wrapping, it sets the m4 -I include to have
#     the following:
#     - the directory of the parser.
#     - include/ in the top-level source tree of the current target
#       (eg, src/finiteVolume/include/ when compiling libfiniteVolume)
#     - include/ from OpenFOAM
#
#------------------------------------------------------------------------------

binDir="${WMAKE_BIN:-$WM_PROJECT_DIR/platforms/tools/$WM_ARCH$WM_COMPILER}"
etcDir="${WM_DIR:-$WM_PROJECT_DIR/wmake}/etc"

# Executable and skeleton locations
lemon="$binDir/lemon"
skel="-T${etcDir}/lempar.c"

usage() {
    exec 1>&2
    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
    cat<<USAGE

Usage: ${0##*/} [options] [lemon args/options]

options:
  -header           Generate header only, suppressing other output
  -dry-run          Process m4 only (output on stdout)
  -no-tmp           Do not retain temporary m4 processed files
  -h, -help         Print the usage

A lemon wrapper using predefined executable and skeleton locations.
Files ending with 'm4' (eg, .lyym4, .lyy-m4) will be filtered through
the m4(1) macro processor and lemon will be called with 'm4' as a macro
definition, which can be used in conditions (%ifdef m4, %ifndef m4)

USAGE
    exit 1
}

#------------------------------------------------------------------------------
# Parse arguments and options
#------------------------------------------------------------------------------

# Eg, wrap-lemon -header
unset optHeader optDryRun optRemoveTmp m4Flags
while [ "$#" -gt 0 ]
do
    case "$1" in
    (-h | -help*)   usage ;;

    (-head*)        optHeader=true ;;
    (-dry-run)      optDryRun=true ;;
    (-no-tmp)       optRemoveTmp=true ;;

    (*) break ;;
    esac
    shift
done


#------------------------------------------------------------------------------

# Additional m4Flags (for includes etc)
#
# $1 : path-qualified name of the parser
#
# Set includes accordingly to
# - the directory containing the parser
# - include/ in the top-level source tree of the current target
# - include/ from OpenFOAM

defineM4Flags()
{
    # Always include the directory containing the parser file
    m4Flags="$m4Flags${m4Flags:+ }-I$(dirname ${1:-.})"

    local proj="$WM_PROJECT_DIR/src/${WM_PROJECT:-OpenFOAM}"
    local curr="$PWD"

    # Called from the Makefile (PWD contains the parser source)
    # or from elsewhere (eg, createCode)?
    if [ ! -f "$curr/Make/options" ]
    then
        # No Make/options (eg createCode) - discover with "wmake -pwd"
        curr="$(wmake -pwd 2>/dev/null)"
    fi

    # Avoid examining twice
    [ "$curr" != "$proj" ] || unset curr

    if [ -n "$curr" ] && [ -d "$curr/include" ]
    then
        m4Flags="$m4Flags -I$curr/include"
    fi

    if [ -n "$proj" ] && [ -d "$proj/include" ]
    then
        m4Flags="$m4Flags -I$proj/include"
    fi
}


#------------------------------------------------------------------------------
# Get some information based on the lemon options
# * '-dXX' for the output directory
# * '-eXX' for the output extension
# The last argument is the input file

unset tmpDir tmpFile outputDir parser extCode
findLemonOptions()
{
    while [ "$#" -gt 1 ]
    do
        case "$1" in
        (-d*) outputDir="${1#-d}" ;;
        (-e*) extCode="${1#-e}" ;;
        esac
        shift
    done

    if [ "$#" -eq 1 ]
    then
        parser="$1"
    fi
}

findLemonOptions "$@"

unset parserFlags extParser usingM4

# Detect m4 use (defines parser macro too) and get extension without m4
case "$parser" in
(*.*m4)
    usingM4=true
    parserFlags="-Dm4"
    defineM4Flags "$parser"

    extParser=".${parser##*.}"      # The extension (with dot)
    extParser="${extParser%m4}"     # Without trailing m4
    extParser="${extParser/%[-_]/}" # Without - or _ separators
    ;;
esac

exitCode=0  # No failures

#------------------------------------------------------------------------------
# Dry-run

if [ "$optDryRun" = true ]
then
    if [ "$usingM4" = true ]
    then
        echo "m4 flags: $m4Flags" 1>&2
        m4 $m4Flags "$parser"; exitCode=$?
    else
        echo "Nothing to do - not using m4" 2>/dev/null
    fi
    [ "$exitCode" -eq 0 ] || echo "m4 failed" 2>/dev/null
    exit "$exitCode"  # Done
fi


#------------------------------------------------------------------------------

unset tmpFile tmpDir

if [ -n "$optHeader" ]
then
    # Drop last argument (the parser input file)
    set -- "${@:1:${#}-1}"

    # Header only, which means we create a temp directory for the output
    tmpDir="lemonWrapper-$$"
    rm -rf "$tmpDir" 2>/dev/null
    mkdir "$tmpDir" 2>/dev/null

    # We may want this:
    # trap 'rm -f $tmpDir 2>/dev/null; exit $exitCode' EXIT TERM INT

    if [ "$usingM4" = true ]
    then
        # Using m4 - redirect to a temporary file
        tmpFile="$tmpDir/${parser##*/}"
        tmpFile="${tmpFile%.*}$extParser"   # Eg, from .lyy-m4 -> .lyy

        if m4 $m4Flags "$parser" > "$tmpFile" && [ -f "$tmpFile" ]
        then
            parser="$tmpFile"
        else
            echo "m4 stage failed on $parser" 2>/dev/null
            exitCode=1
        fi
    fi

    if [ "$exitCode" -eq 0 ]
    then
        "$lemon" "$skel" "-d$tmpDir" "$@" $parserFlags "$parser"
        exitCode=$?
    fi

    if [ "$exitCode" -eq 0 ]
    then
        for src in "$tmpDir"/*.h
        do
            dst="${src##*/}"
            if [ -f "$src" ]
            then
                if ! cmp "$src" "$dst" 2>/dev/null
                then
                    mv "$src" "$dst"
                    echo "Updating $dst" 1>&2
                fi
            fi
        done
    fi

    rm -rf "$tmpDir" 2>/dev/null

elif [ "$usingM4" = true ]
then
    # Drop last argument (the parser input file)
    set -- "${@:1:${#}-1}"

    # Filter via m4
    if [ -n "$outputDir" ]
    then
        tmpFile="$outputDir/${parser##*/}"
    else
        tmpFile="${parser}"
    fi
    tmpFile="${tmpFile%.*}$extParser"   # Eg, from .lyy-m4 -> .lyy

    # We may want this:
    # trap 'rm -f $tmpFile 2>/dev/null; exit $exitCode' EXIT TERM INT

    if m4 $m4Flags "$parser" > "$tmpFile" && [ -f "$tmpFile" ]
    then
        "$lemon" "$skel" "$@" $parserFlags "$tmpFile"
        exitCode=$?
    else
        echo "m4 stage failed on $parser" 2>/dev/null
        exitCode=1
    fi

    if [ -n "$optRemoveTmp" ]
    then
        rm -f "$tmpFile" 2>/dev/null
    else
        echo "Retaining intermediate: $tmpFile" 2>/dev/null
    fi

else

    # No special handling

    "$lemon" "$skel" "$@"
    exitCode=$?
fi


exit "$exitCode"   # Exit with lemon return code

#------------------------------------------------------------------------------