1*a67afe4dSAndroid Build Coastguard Worker#!/bin/awk -f 2*a67afe4dSAndroid Build Coastguard Worker 3*a67afe4dSAndroid Build Coastguard Worker# scripts/options.awk - library build configuration control 4*a67afe4dSAndroid Build Coastguard Worker# 5*a67afe4dSAndroid Build Coastguard Worker# Copyright (c) 1998-2014 Glenn Randers-Pehrson 6*a67afe4dSAndroid Build Coastguard Worker# 7*a67afe4dSAndroid Build Coastguard Worker# This code is released under the libpng license. 8*a67afe4dSAndroid Build Coastguard Worker# For conditions of distribution and use, see the disclaimer 9*a67afe4dSAndroid Build Coastguard Worker# and license in png.h 10*a67afe4dSAndroid Build Coastguard Worker 11*a67afe4dSAndroid Build Coastguard Worker# The output of this script is written to the file given by 12*a67afe4dSAndroid Build Coastguard Worker# the variable 'out'. The script is run twice, once with 13*a67afe4dSAndroid Build Coastguard Worker# an intermediate output file, 'options.tmp' then again on 14*a67afe4dSAndroid Build Coastguard Worker# that file to produce the final output: 15*a67afe4dSAndroid Build Coastguard Worker# 16*a67afe4dSAndroid Build Coastguard Worker# awk -f scripts/options.awk out=options.tmp scripts/options.dfa 1>&2 17*a67afe4dSAndroid Build Coastguard Worker# awk -f scripts/options.awk out=options.dfn options.tmp 1>&2 18*a67afe4dSAndroid Build Coastguard Worker# 19*a67afe4dSAndroid Build Coastguard Worker# Some options may be specified on the command line: 20*a67afe4dSAndroid Build Coastguard Worker# 21*a67afe4dSAndroid Build Coastguard Worker# deb=1 Causes debugging to be output 22*a67afe4dSAndroid Build Coastguard Worker# logunsupported=1 Causes all options to be recorded in the output 23*a67afe4dSAndroid Build Coastguard Worker# everything=off Causes all options to be disabled by default 24*a67afe4dSAndroid Build Coastguard Worker# everything=on Causes all options to be enabled by default 25*a67afe4dSAndroid Build Coastguard Worker# 26*a67afe4dSAndroid Build Coastguard Worker# If awk fails on your platform, try nawk instead. 27*a67afe4dSAndroid Build Coastguard Worker# 28*a67afe4dSAndroid Build Coastguard Worker# These options may also be specified in the original input file (and 29*a67afe4dSAndroid Build Coastguard Worker# are copied to the preprocessed file). 30*a67afe4dSAndroid Build Coastguard Worker 31*a67afe4dSAndroid Build Coastguard WorkerBEGIN{ 32*a67afe4dSAndroid Build Coastguard Worker out="" # intermediate, preprocessed, file 33*a67afe4dSAndroid Build Coastguard Worker pre=-1 # preprocess (first line) 34*a67afe4dSAndroid Build Coastguard Worker version="libpng version unknown" # version information 35*a67afe4dSAndroid Build Coastguard Worker version_file="" # where to find the version 36*a67afe4dSAndroid Build Coastguard Worker err=0 # in-line exit sets this 37*a67afe4dSAndroid Build Coastguard Worker # The following definitions prevent the C preprocessor noticing the lines 38*a67afe4dSAndroid Build Coastguard Worker # that will be in the final output file. Some C preprocessors tokenise 39*a67afe4dSAndroid Build Coastguard Worker # the lines, for example by inserting spaces around operators, and all 40*a67afe4dSAndroid Build Coastguard Worker # C preprocessors notice lines that start with '#', most remove comments. 41*a67afe4dSAndroid Build Coastguard Worker # The technique adopted here is to make the final output lines into 42*a67afe4dSAndroid Build Coastguard Worker # C strings (enclosed in double quotes), preceded by PNG_DFN. As a 43*a67afe4dSAndroid Build Coastguard Worker # consequence the output cannot contain a 'raw' double quote - instead put 44*a67afe4dSAndroid Build Coastguard Worker # @' in, this will be replaced by a single " afterward. See the parser 45*a67afe4dSAndroid Build Coastguard Worker # script dfn.awk for more capabilities (not required here). Note that if 46*a67afe4dSAndroid Build Coastguard Worker # you need a " in a 'setting' in pnglibconf.dfa it must also be @'! 47*a67afe4dSAndroid Build Coastguard Worker dq="@'" # For a single double quote 48*a67afe4dSAndroid Build Coastguard Worker start=" PNG_DFN \"" # Start stuff to output (can't contain a "!) 49*a67afe4dSAndroid Build Coastguard Worker end="\" " # End stuff to output 50*a67afe4dSAndroid Build Coastguard Worker subs="@\" " # Substitute start (substitute a C macro) 51*a67afe4dSAndroid Build Coastguard Worker sube=" \"@" # Substitute end 52*a67afe4dSAndroid Build Coastguard Worker comment=start "/*" # Comment start 53*a67afe4dSAndroid Build Coastguard Worker cend="*/" end # Comment end 54*a67afe4dSAndroid Build Coastguard Worker def=start "#define PNG_" # Arbitrary define 55*a67afe4dSAndroid Build Coastguard Worker sup="_SUPPORTED" end # end supported option 56*a67afe4dSAndroid Build Coastguard Worker und=comment "#undef PNG_" # Unsupported option 57*a67afe4dSAndroid Build Coastguard Worker une="_SUPPORTED" cend # end unsupported option 58*a67afe4dSAndroid Build Coastguard Worker error=start "ERROR:" # error message, terminate with 'end' 59*a67afe4dSAndroid Build Coastguard Worker 60*a67afe4dSAndroid Build Coastguard Worker # Variables 61*a67afe4dSAndroid Build Coastguard Worker deb=0 # debug - set on command line 62*a67afe4dSAndroid Build Coastguard Worker everything="" # do not override defaults 63*a67afe4dSAndroid Build Coastguard Worker logunsupported=0 # write unsupported options too 64*a67afe4dSAndroid Build Coastguard Worker 65*a67afe4dSAndroid Build Coastguard Worker # Precreate arrays 66*a67afe4dSAndroid Build Coastguard Worker # for each option: 67*a67afe4dSAndroid Build Coastguard Worker option[""] = "" # list of all options: default enabled/disabled 68*a67afe4dSAndroid Build Coastguard Worker done[""] = 1 # marks option as having been output 69*a67afe4dSAndroid Build Coastguard Worker requires[""] = "" # requires by option 70*a67afe4dSAndroid Build Coastguard Worker iffs[""] = "" # if by option 71*a67afe4dSAndroid Build Coastguard Worker enabledby[""] = "" # options that enable it by option 72*a67afe4dSAndroid Build Coastguard Worker sets[""] = "" # settings set by each option 73*a67afe4dSAndroid Build Coastguard Worker setval[""] = "" # value to set (indexed: 'option sets[option]') 74*a67afe4dSAndroid Build Coastguard Worker # for each setting: 75*a67afe4dSAndroid Build Coastguard Worker setting[""] = "" # requires by setting 76*a67afe4dSAndroid Build Coastguard Worker defaults[""] = "" # used for a defaulted value 77*a67afe4dSAndroid Build Coastguard Worker doneset[""] = 1 # marks setting as having been output 78*a67afe4dSAndroid Build Coastguard Worker r[""] = "" # Temporary array 79*a67afe4dSAndroid Build Coastguard Worker 80*a67afe4dSAndroid Build Coastguard Worker # For decorating the output file 81*a67afe4dSAndroid Build Coastguard Worker protect = "" 82*a67afe4dSAndroid Build Coastguard Worker} 83*a67afe4dSAndroid Build Coastguard Worker 84*a67afe4dSAndroid Build Coastguard Worker# The output file must be specified before any input: 85*a67afe4dSAndroid Build Coastguard Workerout == "" { 86*a67afe4dSAndroid Build Coastguard Worker print "out=output.file must be given on the command line" 87*a67afe4dSAndroid Build Coastguard Worker err = 1 88*a67afe4dSAndroid Build Coastguard Worker exit 1 89*a67afe4dSAndroid Build Coastguard Worker} 90*a67afe4dSAndroid Build Coastguard Worker 91*a67afe4dSAndroid Build Coastguard Worker# The very first line indicates whether we are reading pre-processed 92*a67afe4dSAndroid Build Coastguard Worker# input or not, this must come *first* because 'PREPROCESSED' needs 93*a67afe4dSAndroid Build Coastguard Worker# to be the very first line in the temporary file. 94*a67afe4dSAndroid Build Coastguard Workerpre == -1{ 95*a67afe4dSAndroid Build Coastguard Worker if ($0 == "PREPROCESSED") { 96*a67afe4dSAndroid Build Coastguard Worker pre = 0 97*a67afe4dSAndroid Build Coastguard Worker next 98*a67afe4dSAndroid Build Coastguard Worker } else { 99*a67afe4dSAndroid Build Coastguard Worker pre = 1 100*a67afe4dSAndroid Build Coastguard Worker print "PREPROCESSED" >out 101*a67afe4dSAndroid Build Coastguard Worker # And fall through to continue processing 102*a67afe4dSAndroid Build Coastguard Worker } 103*a67afe4dSAndroid Build Coastguard Worker} 104*a67afe4dSAndroid Build Coastguard Worker 105*a67afe4dSAndroid Build Coastguard Worker# While pre-processing if version is set to "search" look for a version string 106*a67afe4dSAndroid Build Coastguard Worker# in the following file. 107*a67afe4dSAndroid Build Coastguard Workerpre && version == "search" && version_file == ""{ 108*a67afe4dSAndroid Build Coastguard Worker version_file = FILENAME 109*a67afe4dSAndroid Build Coastguard Worker} 110*a67afe4dSAndroid Build Coastguard Worker 111*a67afe4dSAndroid Build Coastguard Workerpre && version == "search" && version_file != FILENAME{ 112*a67afe4dSAndroid Build Coastguard Worker print "version string not found in", version_file 113*a67afe4dSAndroid Build Coastguard Worker err = 1 114*a67afe4dSAndroid Build Coastguard Worker exit 1 115*a67afe4dSAndroid Build Coastguard Worker} 116*a67afe4dSAndroid Build Coastguard Worker 117*a67afe4dSAndroid Build Coastguard Workerpre && version == "search" && $0 ~ /^ \* libpng version/{ 118*a67afe4dSAndroid Build Coastguard Worker version = substr($0, 4) 119*a67afe4dSAndroid Build Coastguard Worker print "version =", version >out 120*a67afe4dSAndroid Build Coastguard Worker next 121*a67afe4dSAndroid Build Coastguard Worker} 122*a67afe4dSAndroid Build Coastguard Worker 123*a67afe4dSAndroid Build Coastguard Workerpre && FILENAME == version_file{ 124*a67afe4dSAndroid Build Coastguard Worker next 125*a67afe4dSAndroid Build Coastguard Worker} 126*a67afe4dSAndroid Build Coastguard Worker 127*a67afe4dSAndroid Build Coastguard Worker# variable=value 128*a67afe4dSAndroid Build Coastguard Worker# Sets the given variable to the given value (the syntax is fairly 129*a67afe4dSAndroid Build Coastguard Worker# free form, except for deb (you are expected to understand how to 130*a67afe4dSAndroid Build Coastguard Worker# set the debug variable...) 131*a67afe4dSAndroid Build Coastguard Worker# 132*a67afe4dSAndroid Build Coastguard Worker# This happens before the check on 'pre' below skips most of the 133*a67afe4dSAndroid Build Coastguard Worker# rest of the actions, so the variable settings happen during 134*a67afe4dSAndroid Build Coastguard Worker# preprocessing but are recorded in the END action too. This 135*a67afe4dSAndroid Build Coastguard Worker# allows them to be set on the command line too. 136*a67afe4dSAndroid Build Coastguard Worker$0 ~ /^[ ]*version[ ]*=/{ 137*a67afe4dSAndroid Build Coastguard Worker sub(/^[ ]*version[ ]*=[ ]*/, "") 138*a67afe4dSAndroid Build Coastguard Worker version = $0 139*a67afe4dSAndroid Build Coastguard Worker next 140*a67afe4dSAndroid Build Coastguard Worker} 141*a67afe4dSAndroid Build Coastguard Worker$0 ~ /^[ ]*everything[ =]*off[ ]*$/{ 142*a67afe4dSAndroid Build Coastguard Worker everything = "off" 143*a67afe4dSAndroid Build Coastguard Worker next 144*a67afe4dSAndroid Build Coastguard Worker} 145*a67afe4dSAndroid Build Coastguard Worker$0 ~ /^[ ]*everything[ =]*on[ ]*$/{ 146*a67afe4dSAndroid Build Coastguard Worker everything = "on" 147*a67afe4dSAndroid Build Coastguard Worker next 148*a67afe4dSAndroid Build Coastguard Worker} 149*a67afe4dSAndroid Build Coastguard Worker$0 ~ /^[ ]*logunsupported[ =]*0[ ]*$/{ 150*a67afe4dSAndroid Build Coastguard Worker logunsupported = 0 151*a67afe4dSAndroid Build Coastguard Worker next 152*a67afe4dSAndroid Build Coastguard Worker} 153*a67afe4dSAndroid Build Coastguard Worker$0 ~ /^[ ]*logunsupported[ =]*1[ ]*$/{ 154*a67afe4dSAndroid Build Coastguard Worker logunsupported = 1 155*a67afe4dSAndroid Build Coastguard Worker next 156*a67afe4dSAndroid Build Coastguard Worker} 157*a67afe4dSAndroid Build Coastguard Worker$1 == "deb" && $2 == "=" && NF == 3{ 158*a67afe4dSAndroid Build Coastguard Worker deb = $3 159*a67afe4dSAndroid Build Coastguard Worker next 160*a67afe4dSAndroid Build Coastguard Worker} 161*a67afe4dSAndroid Build Coastguard Worker 162*a67afe4dSAndroid Build Coastguard Worker# Preprocessing - this just copies the input file with lines 163*a67afe4dSAndroid Build Coastguard Worker# that need preprocessing (just chunk at present) expanded 164*a67afe4dSAndroid Build Coastguard Worker# The bare "pre" instead of "pre != 0" crashes under Sunos awk 165*a67afe4dSAndroid Build Coastguard Workerpre && $1 != "chunk"{ 166*a67afe4dSAndroid Build Coastguard Worker print >out 167*a67afe4dSAndroid Build Coastguard Worker next 168*a67afe4dSAndroid Build Coastguard Worker} 169*a67afe4dSAndroid Build Coastguard Worker 170*a67afe4dSAndroid Build Coastguard Worker# The first characters of the line determine how it is processed, 171*a67afe4dSAndroid Build Coastguard Worker# leading spaces are ignored. In general tokens that are not 172*a67afe4dSAndroid Build Coastguard Worker# keywords are the names of options. An option 'name' is 173*a67afe4dSAndroid Build Coastguard Worker# controlled by the definition of the corresponding macros: 174*a67afe4dSAndroid Build Coastguard Worker# 175*a67afe4dSAndroid Build Coastguard Worker# PNG_name_SUPPORTED The option is turned on 176*a67afe4dSAndroid Build Coastguard Worker# PNG_NO_name 177*a67afe4dSAndroid Build Coastguard Worker# PNG_NO_name_SUPPORTED If the first macro is not defined 178*a67afe4dSAndroid Build Coastguard Worker# either of these will turn the option off 179*a67afe4dSAndroid Build Coastguard Worker# 180*a67afe4dSAndroid Build Coastguard Worker# If none of these macros are defined the option is turned on, unless 181*a67afe4dSAndroid Build Coastguard Worker# the keyword 'off' is given in a line relating to the option. The 182*a67afe4dSAndroid Build Coastguard Worker# keyword 'on' can also be given, but it will be ignored (since it is 183*a67afe4dSAndroid Build Coastguard Worker# the default.) 184*a67afe4dSAndroid Build Coastguard Worker# 185*a67afe4dSAndroid Build Coastguard Worker# In the syntax below a 'name' is indicated by "NAME", other macro 186*a67afe4dSAndroid Build Coastguard Worker# values are indicated by "MACRO", as with "NAME" the leading "PNG_" 187*a67afe4dSAndroid Build Coastguard Worker# is omitted, but in this case the "NO_" prefix and the "_SUPPORTED" 188*a67afe4dSAndroid Build Coastguard Worker# suffix are never used. 189*a67afe4dSAndroid Build Coastguard Worker# 190*a67afe4dSAndroid Build Coastguard Worker# Each line is introduced by a keyword - the first non-space characters 191*a67afe4dSAndroid Build Coastguard Worker# on the line. A line starting with a '#' is a comment - it is totally 192*a67afe4dSAndroid Build Coastguard Worker# ignored. Keywords are as follows, a NAME, is simply a macro name 193*a67afe4dSAndroid Build Coastguard Worker# without the leading PNG_, PNG_NO_ or the trailing _SUPPORTED. 194*a67afe4dSAndroid Build Coastguard Worker 195*a67afe4dSAndroid Build Coastguard Worker$1 ~ /^#/ || $0 ~ /^[ ]*$/{ 196*a67afe4dSAndroid Build Coastguard Worker next 197*a67afe4dSAndroid Build Coastguard Worker} 198*a67afe4dSAndroid Build Coastguard Worker 199*a67afe4dSAndroid Build Coastguard Worker# com <comment> 200*a67afe4dSAndroid Build Coastguard Worker# The whole line is placed in the output file as a comment with 201*a67afe4dSAndroid Build Coastguard Worker# the preceding 'com' removed 202*a67afe4dSAndroid Build Coastguard Worker$1 == "com"{ 203*a67afe4dSAndroid Build Coastguard Worker if (NF > 1) { 204*a67afe4dSAndroid Build Coastguard Worker # sub(/^[ ]*com[ ]*/, "") 205*a67afe4dSAndroid Build Coastguard Worker $1 = "" 206*a67afe4dSAndroid Build Coastguard Worker print comment $0, cend >out 207*a67afe4dSAndroid Build Coastguard Worker } else 208*a67afe4dSAndroid Build Coastguard Worker print start end >out 209*a67afe4dSAndroid Build Coastguard Worker next 210*a67afe4dSAndroid Build Coastguard Worker} 211*a67afe4dSAndroid Build Coastguard Worker 212*a67afe4dSAndroid Build Coastguard Worker# version 213*a67afe4dSAndroid Build Coastguard Worker# Inserts a version comment 214*a67afe4dSAndroid Build Coastguard Worker$1 == "version" && NF == 1{ 215*a67afe4dSAndroid Build Coastguard Worker if (version == "") { 216*a67afe4dSAndroid Build Coastguard Worker print "ERROR: no version string set" 217*a67afe4dSAndroid Build Coastguard Worker err = 1 # prevent END{} running 218*a67afe4dSAndroid Build Coastguard Worker exit 1 219*a67afe4dSAndroid Build Coastguard Worker } 220*a67afe4dSAndroid Build Coastguard Worker 221*a67afe4dSAndroid Build Coastguard Worker print comment, version, cend >out 222*a67afe4dSAndroid Build Coastguard Worker next 223*a67afe4dSAndroid Build Coastguard Worker} 224*a67afe4dSAndroid Build Coastguard Worker 225*a67afe4dSAndroid Build Coastguard Worker# file output input protect 226*a67afe4dSAndroid Build Coastguard Worker# Informational: the official name of the input file (without 227*a67afe4dSAndroid Build Coastguard Worker# make generated local directories), the official name of the 228*a67afe4dSAndroid Build Coastguard Worker# output file and, if required, a name to use in a protection 229*a67afe4dSAndroid Build Coastguard Worker# macro for the contents. 230*a67afe4dSAndroid Build Coastguard Worker$1 == "file" && NF >= 2{ 231*a67afe4dSAndroid Build Coastguard Worker print comment, $2, cend >out 232*a67afe4dSAndroid Build Coastguard Worker print comment, "Machine generated file: DO NOT EDIT", cend >out 233*a67afe4dSAndroid Build Coastguard Worker if (NF >= 3) 234*a67afe4dSAndroid Build Coastguard Worker print comment, "Derived from:", $3, cend >out 235*a67afe4dSAndroid Build Coastguard Worker protect = $4 236*a67afe4dSAndroid Build Coastguard Worker if (protect != "") { 237*a67afe4dSAndroid Build Coastguard Worker print start "#ifndef", protect end >out 238*a67afe4dSAndroid Build Coastguard Worker print start "#define", protect end >out 239*a67afe4dSAndroid Build Coastguard Worker } 240*a67afe4dSAndroid Build Coastguard Worker next 241*a67afe4dSAndroid Build Coastguard Worker} 242*a67afe4dSAndroid Build Coastguard Worker 243*a67afe4dSAndroid Build Coastguard Worker# option NAME ( (requires|enables|if) NAME* | on | off | disabled | 244*a67afe4dSAndroid Build Coastguard Worker# sets SETTING VALUE+ )* 245*a67afe4dSAndroid Build Coastguard Worker# 246*a67afe4dSAndroid Build Coastguard Worker# Declares an option 'NAME' and describes its default setting (disabled) 247*a67afe4dSAndroid Build Coastguard Worker# and its relationship to other options. The option is disabled 248*a67afe4dSAndroid Build Coastguard Worker# unless *all* the options listed after 'requires' are set and at 249*a67afe4dSAndroid Build Coastguard Worker# least one of the options listed after 'if' is set. If the 250*a67afe4dSAndroid Build Coastguard Worker# option is set then it turns on all the options listed after 'enables'. 251*a67afe4dSAndroid Build Coastguard Worker# 252*a67afe4dSAndroid Build Coastguard Worker# Note that "enables" takes priority over the required/if/disabled/off 253*a67afe4dSAndroid Build Coastguard Worker# setting of the target option. 254*a67afe4dSAndroid Build Coastguard Worker# 255*a67afe4dSAndroid Build Coastguard Worker# The definition file may list an option as 'disabled': off by default, 256*a67afe4dSAndroid Build Coastguard Worker# otherwise the option is enabled: on by default. A later (and it must 257*a67afe4dSAndroid Build Coastguard Worker# be later) entry may turn an option on or off explicitly. 258*a67afe4dSAndroid Build Coastguard Worker 259*a67afe4dSAndroid Build Coastguard Worker$1 == "option" && NF >= 2{ 260*a67afe4dSAndroid Build Coastguard Worker opt = $2 261*a67afe4dSAndroid Build Coastguard Worker sub(/,$/,"",opt) 262*a67afe4dSAndroid Build Coastguard Worker onoff = option[opt] # records current (and the default is "", enabled) 263*a67afe4dSAndroid Build Coastguard Worker key = "" 264*a67afe4dSAndroid Build Coastguard Worker istart = 3 265*a67afe4dSAndroid Build Coastguard Worker do { 266*a67afe4dSAndroid Build Coastguard Worker if (istart == 1) { # continuation line 267*a67afe4dSAndroid Build Coastguard Worker val = getline 268*a67afe4dSAndroid Build Coastguard Worker 269*a67afe4dSAndroid Build Coastguard Worker if (val != 1) { # error reading it 270*a67afe4dSAndroid Build Coastguard Worker if (val == 0) 271*a67afe4dSAndroid Build Coastguard Worker print "option", opt ": ERROR: missing continuation line" 272*a67afe4dSAndroid Build Coastguard Worker else 273*a67afe4dSAndroid Build Coastguard Worker print "option", opt ": ERROR: error reading continuation line" 274*a67afe4dSAndroid Build Coastguard Worker 275*a67afe4dSAndroid Build Coastguard Worker # This is a hard error 276*a67afe4dSAndroid Build Coastguard Worker err = 1 # prevent END{} running 277*a67afe4dSAndroid Build Coastguard Worker exit 1 278*a67afe4dSAndroid Build Coastguard Worker } 279*a67afe4dSAndroid Build Coastguard Worker } 280*a67afe4dSAndroid Build Coastguard Worker 281*a67afe4dSAndroid Build Coastguard Worker for (i=istart; i<=NF; ++i) { 282*a67afe4dSAndroid Build Coastguard Worker val=$(i) 283*a67afe4dSAndroid Build Coastguard Worker sub(/,$/,"",val) 284*a67afe4dSAndroid Build Coastguard Worker if (val == "on" || val == "off" || val == "disabled" || val =="enabled") { 285*a67afe4dSAndroid Build Coastguard Worker key = "" 286*a67afe4dSAndroid Build Coastguard Worker if (onoff != val) { 287*a67afe4dSAndroid Build Coastguard Worker # on or off can zap disabled or enabled: 288*a67afe4dSAndroid Build Coastguard Worker if (onoff == "" || (onoff == "disabled" || onoff == "enabled") && 289*a67afe4dSAndroid Build Coastguard Worker (val == "on" || val == "off")) { 290*a67afe4dSAndroid Build Coastguard Worker # It's easy to mis-spell the option when turning it 291*a67afe4dSAndroid Build Coastguard Worker # on or off, so warn about it here: 292*a67afe4dSAndroid Build Coastguard Worker if (onoff == "" && (val == "on" || val == "off")) { 293*a67afe4dSAndroid Build Coastguard Worker print "option", opt ": ERROR: turning unrecognized option", val 294*a67afe4dSAndroid Build Coastguard Worker # For the moment error out - it is safer 295*a67afe4dSAndroid Build Coastguard Worker err = 1 # prevent END{} running 296*a67afe4dSAndroid Build Coastguard Worker exit 1 297*a67afe4dSAndroid Build Coastguard Worker } 298*a67afe4dSAndroid Build Coastguard Worker onoff = val 299*a67afe4dSAndroid Build Coastguard Worker } else { 300*a67afe4dSAndroid Build Coastguard Worker # Print a message, otherwise the error 301*a67afe4dSAndroid Build Coastguard Worker # below is incomprehensible 302*a67afe4dSAndroid Build Coastguard Worker print "option", opt ": currently", onoff ": attempt to turn", val 303*a67afe4dSAndroid Build Coastguard Worker break 304*a67afe4dSAndroid Build Coastguard Worker } 305*a67afe4dSAndroid Build Coastguard Worker } 306*a67afe4dSAndroid Build Coastguard Worker } else if (val == "requires" || val == "if" || val == "enables" || val =="sets") { 307*a67afe4dSAndroid Build Coastguard Worker key = val 308*a67afe4dSAndroid Build Coastguard Worker } else if (key == "requires") { 309*a67afe4dSAndroid Build Coastguard Worker requires[opt] = requires[opt] " " val 310*a67afe4dSAndroid Build Coastguard Worker } else if (key == "if") { 311*a67afe4dSAndroid Build Coastguard Worker iffs[opt] = iffs[opt] " " val 312*a67afe4dSAndroid Build Coastguard Worker } else if (key == "enables") { 313*a67afe4dSAndroid Build Coastguard Worker enabledby[val] = enabledby[val] " " opt 314*a67afe4dSAndroid Build Coastguard Worker } else if (key == "sets") { 315*a67afe4dSAndroid Build Coastguard Worker sets[opt] = sets[opt] " " val 316*a67afe4dSAndroid Build Coastguard Worker key = "setval" 317*a67afe4dSAndroid Build Coastguard Worker set = val 318*a67afe4dSAndroid Build Coastguard Worker } else if (key == "setval") { 319*a67afe4dSAndroid Build Coastguard Worker setval[opt " " set] = setval[opt " " set] " " val 320*a67afe4dSAndroid Build Coastguard Worker } else 321*a67afe4dSAndroid Build Coastguard Worker break # bad line format 322*a67afe4dSAndroid Build Coastguard Worker } 323*a67afe4dSAndroid Build Coastguard Worker 324*a67afe4dSAndroid Build Coastguard Worker istart = 1 325*a67afe4dSAndroid Build Coastguard Worker } while (i > NF && $0 ~ /,$/) 326*a67afe4dSAndroid Build Coastguard Worker 327*a67afe4dSAndroid Build Coastguard Worker if (i > NF) { 328*a67afe4dSAndroid Build Coastguard Worker # Set the option, defaulting to 'enabled' 329*a67afe4dSAndroid Build Coastguard Worker if (onoff == "") onoff = "enabled" 330*a67afe4dSAndroid Build Coastguard Worker option[opt] = onoff 331*a67afe4dSAndroid Build Coastguard Worker next 332*a67afe4dSAndroid Build Coastguard Worker } 333*a67afe4dSAndroid Build Coastguard Worker # Else fall through to the error handler 334*a67afe4dSAndroid Build Coastguard Worker} 335*a67afe4dSAndroid Build Coastguard Worker 336*a67afe4dSAndroid Build Coastguard Worker# chunk NAME [requires OPT] [enables LIST] [on|off|disabled] 337*a67afe4dSAndroid Build Coastguard Worker# Expands to the 'option' settings appropriate to the reading and 338*a67afe4dSAndroid Build Coastguard Worker# writing of an ancillary PNG chunk 'NAME': 339*a67afe4dSAndroid Build Coastguard Worker# 340*a67afe4dSAndroid Build Coastguard Worker# option READ_NAME requires READ_ANCILLARY_CHUNKS [READ_OPT] 341*a67afe4dSAndroid Build Coastguard Worker# option READ_NAME enables NAME LIST 342*a67afe4dSAndroid Build Coastguard Worker# [option READ_NAME off] 343*a67afe4dSAndroid Build Coastguard Worker# option WRITE_NAME requires WRITE_ANCILLARY_CHUNKS [WRITE_OPT] 344*a67afe4dSAndroid Build Coastguard Worker# option WRITE_NAME enables NAME LIST 345*a67afe4dSAndroid Build Coastguard Worker# [option WRITE_NAME off] 346*a67afe4dSAndroid Build Coastguard Worker 347*a67afe4dSAndroid Build Coastguard Workerpre != 0 && $1 == "chunk" && NF >= 2{ 348*a67afe4dSAndroid Build Coastguard Worker # 'chunk' is handled on the first pass by writing appropriate 349*a67afe4dSAndroid Build Coastguard Worker # 'option' lines into the intermediate file. 350*a67afe4dSAndroid Build Coastguard Worker opt = $2 351*a67afe4dSAndroid Build Coastguard Worker sub(/,$/,"",opt) 352*a67afe4dSAndroid Build Coastguard Worker onoff = "" 353*a67afe4dSAndroid Build Coastguard Worker reqread = "" 354*a67afe4dSAndroid Build Coastguard Worker reqwrite = "" 355*a67afe4dSAndroid Build Coastguard Worker enables = "" 356*a67afe4dSAndroid Build Coastguard Worker req = 0 357*a67afe4dSAndroid Build Coastguard Worker istart = 3 358*a67afe4dSAndroid Build Coastguard Worker do { 359*a67afe4dSAndroid Build Coastguard Worker if (istart == 1) { # continuation line 360*a67afe4dSAndroid Build Coastguard Worker val = getline 361*a67afe4dSAndroid Build Coastguard Worker 362*a67afe4dSAndroid Build Coastguard Worker if (val != 1) { # error reading it 363*a67afe4dSAndroid Build Coastguard Worker if (val == 0) 364*a67afe4dSAndroid Build Coastguard Worker print "chunk", opt ": ERROR: missing continuation line" 365*a67afe4dSAndroid Build Coastguard Worker else 366*a67afe4dSAndroid Build Coastguard Worker print "chunk", opt ": ERROR: error reading continuation line" 367*a67afe4dSAndroid Build Coastguard Worker 368*a67afe4dSAndroid Build Coastguard Worker # This is a hard error 369*a67afe4dSAndroid Build Coastguard Worker err = 1 # prevent END{} running 370*a67afe4dSAndroid Build Coastguard Worker exit 1 371*a67afe4dSAndroid Build Coastguard Worker } 372*a67afe4dSAndroid Build Coastguard Worker } 373*a67afe4dSAndroid Build Coastguard Worker 374*a67afe4dSAndroid Build Coastguard Worker # read the keywords/additional OPTS 375*a67afe4dSAndroid Build Coastguard Worker for (i=istart; i<=NF; ++i) { 376*a67afe4dSAndroid Build Coastguard Worker val = $(i) 377*a67afe4dSAndroid Build Coastguard Worker sub(/,$/,"",val) 378*a67afe4dSAndroid Build Coastguard Worker if (val == "on" || val == "off" || val == "disabled") { 379*a67afe4dSAndroid Build Coastguard Worker if (onoff != val) { 380*a67afe4dSAndroid Build Coastguard Worker if (onoff == "") 381*a67afe4dSAndroid Build Coastguard Worker onoff = val 382*a67afe4dSAndroid Build Coastguard Worker else 383*a67afe4dSAndroid Build Coastguard Worker break # on/off conflict 384*a67afe4dSAndroid Build Coastguard Worker } 385*a67afe4dSAndroid Build Coastguard Worker req = 0 386*a67afe4dSAndroid Build Coastguard Worker } else if (val == "requires") 387*a67afe4dSAndroid Build Coastguard Worker req = 1 388*a67afe4dSAndroid Build Coastguard Worker else if (val == "enables") 389*a67afe4dSAndroid Build Coastguard Worker req = 2 390*a67afe4dSAndroid Build Coastguard Worker else if (req == 1){ 391*a67afe4dSAndroid Build Coastguard Worker reqread = reqread " READ_" val 392*a67afe4dSAndroid Build Coastguard Worker reqwrite = reqwrite " WRITE_" val 393*a67afe4dSAndroid Build Coastguard Worker } else if (req == 2) 394*a67afe4dSAndroid Build Coastguard Worker enables = enables " " val 395*a67afe4dSAndroid Build Coastguard Worker else 396*a67afe4dSAndroid Build Coastguard Worker break # bad line: handled below 397*a67afe4dSAndroid Build Coastguard Worker } 398*a67afe4dSAndroid Build Coastguard Worker 399*a67afe4dSAndroid Build Coastguard Worker istart = 1 400*a67afe4dSAndroid Build Coastguard Worker } while (i > NF && $0 ~ /,$/) 401*a67afe4dSAndroid Build Coastguard Worker 402*a67afe4dSAndroid Build Coastguard Worker if (i > NF) { 403*a67afe4dSAndroid Build Coastguard Worker # Output new 'option' lines to the intermediate file (out) 404*a67afe4dSAndroid Build Coastguard Worker print "option READ_" opt, "requires READ_ANCILLARY_CHUNKS" reqread, 405*a67afe4dSAndroid Build Coastguard Worker "enables", opt enables , onoff >out 406*a67afe4dSAndroid Build Coastguard Worker print "option WRITE_" opt, "requires WRITE_ANCILLARY_CHUNKS" reqwrite, 407*a67afe4dSAndroid Build Coastguard Worker "enables", opt enables, onoff >out 408*a67afe4dSAndroid Build Coastguard Worker next 409*a67afe4dSAndroid Build Coastguard Worker } 410*a67afe4dSAndroid Build Coastguard Worker # Else hit the error handler below - bad line format! 411*a67afe4dSAndroid Build Coastguard Worker} 412*a67afe4dSAndroid Build Coastguard Worker 413*a67afe4dSAndroid Build Coastguard Worker# setting MACRO ( requires MACRO* )* [ default VALUE ] 414*a67afe4dSAndroid Build Coastguard Worker# Behaves in a similar way to 'option' without looking for NO_ or 415*a67afe4dSAndroid Build Coastguard Worker# _SUPPORTED; the macro is enabled if it is defined so long as all 416*a67afe4dSAndroid Build Coastguard Worker# the 'requires' macros are also defined. The definitions may be 417*a67afe4dSAndroid Build Coastguard Worker# empty, an error will be issued if the 'requires' macros are 418*a67afe4dSAndroid Build Coastguard Worker# *not* defined. If given the 'default' value is used if the 419*a67afe4dSAndroid Build Coastguard Worker# macro is not defined. The default value will be re-tokenised. 420*a67afe4dSAndroid Build Coastguard Worker# (BTW: this is somewhat restrictive, it mainly exists for the 421*a67afe4dSAndroid Build Coastguard Worker# support of non-standard configurations and numeric parameters, 422*a67afe4dSAndroid Build Coastguard Worker# see the uses in scripts/options.dat 423*a67afe4dSAndroid Build Coastguard Worker 424*a67afe4dSAndroid Build Coastguard Worker$1 == "setting" && (NF == 2 || NF >= 3 && ($3 == "requires" || $3 == "default")){ 425*a67afe4dSAndroid Build Coastguard Worker reqs = "" 426*a67afe4dSAndroid Build Coastguard Worker deflt = "" 427*a67afe4dSAndroid Build Coastguard Worker isdef = 0 428*a67afe4dSAndroid Build Coastguard Worker key = "" 429*a67afe4dSAndroid Build Coastguard Worker for (i=3; i<=NF; ++i) 430*a67afe4dSAndroid Build Coastguard Worker if ($(i) == "requires" || $(i) == "default") { 431*a67afe4dSAndroid Build Coastguard Worker key = $(i) 432*a67afe4dSAndroid Build Coastguard Worker if (key == "default") isdef = 1 433*a67afe4dSAndroid Build Coastguard Worker } else if (key == "requires") 434*a67afe4dSAndroid Build Coastguard Worker reqs = reqs " " $(i) 435*a67afe4dSAndroid Build Coastguard Worker else if (key == "default") 436*a67afe4dSAndroid Build Coastguard Worker deflt = deflt " " $(i) 437*a67afe4dSAndroid Build Coastguard Worker else 438*a67afe4dSAndroid Build Coastguard Worker break # Format error, handled below 439*a67afe4dSAndroid Build Coastguard Worker 440*a67afe4dSAndroid Build Coastguard Worker setting[$2] = reqs 441*a67afe4dSAndroid Build Coastguard Worker # NOTE: this overwrites a previous value silently 442*a67afe4dSAndroid Build Coastguard Worker if (isdef && deflt == "") 443*a67afe4dSAndroid Build Coastguard Worker deflt = " " # as a flag to force output 444*a67afe4dSAndroid Build Coastguard Worker defaults[$2] = deflt 445*a67afe4dSAndroid Build Coastguard Worker next 446*a67afe4dSAndroid Build Coastguard Worker} 447*a67afe4dSAndroid Build Coastguard Worker 448*a67afe4dSAndroid Build Coastguard Worker# The order of the dependency lines (option, chunk, setting) is irrelevant 449*a67afe4dSAndroid Build Coastguard Worker# - the 'enables', 'requires' and 'if' settings will be used to determine 450*a67afe4dSAndroid Build Coastguard Worker# the correct order in the output and the final values in pnglibconf.h are 451*a67afe4dSAndroid Build Coastguard Worker# not order dependent. 'requires' and 'if' entries take precedence over 452*a67afe4dSAndroid Build Coastguard Worker# 'enables' from other options; if an option requires another option it 453*a67afe4dSAndroid Build Coastguard Worker# won't be set regardless of any options that enable it unless the other 454*a67afe4dSAndroid Build Coastguard Worker# option is also enabled. 455*a67afe4dSAndroid Build Coastguard Worker# 456*a67afe4dSAndroid Build Coastguard Worker# Similarly 'enables' trumps a NO_ definition in CFLAGS or pngusr.h 457*a67afe4dSAndroid Build Coastguard Worker# 458*a67afe4dSAndroid Build Coastguard Worker# For simplicity cycles in the definitions are regarded as errors, 459*a67afe4dSAndroid Build Coastguard Worker# even if they are not ambiguous. 460*a67afe4dSAndroid Build Coastguard Worker# A given NAME can be specified in as many 'option' lines as required, the 461*a67afe4dSAndroid Build Coastguard Worker# definitions are additive. 462*a67afe4dSAndroid Build Coastguard Worker 463*a67afe4dSAndroid Build Coastguard Worker# For backwards compatibility equivalent macros may be listed thus: 464*a67afe4dSAndroid Build Coastguard Worker# 465*a67afe4dSAndroid Build Coastguard Worker# = [NO_]NAME MACRO 466*a67afe4dSAndroid Build Coastguard Worker# Makes -DMACRO equivalent to -DPNG_NO_NAME or -DPNG_NAME_SUPPORTED 467*a67afe4dSAndroid Build Coastguard Worker# as appropriate. 468*a67afe4dSAndroid Build Coastguard Worker# 469*a67afe4dSAndroid Build Coastguard Worker# The definition is injected into the C compiler input when encountered 470*a67afe4dSAndroid Build Coastguard Worker# in the second pass (so all these definitions appear *after* the @ 471*a67afe4dSAndroid Build Coastguard Worker# lines!) 472*a67afe4dSAndroid Build Coastguard Worker# 473*a67afe4dSAndroid Build Coastguard Worker# 'NAME' is as above, but 'MACRO' is the full text of the equivalent 474*a67afe4dSAndroid Build Coastguard Worker# old, deprecated, macro. 475*a67afe4dSAndroid Build Coastguard Worker 476*a67afe4dSAndroid Build Coastguard Worker$1 == "=" && NF == 3{ 477*a67afe4dSAndroid Build Coastguard Worker print "#ifdef PNG_" $3 >out 478*a67afe4dSAndroid Build Coastguard Worker if ($2 ~ /^NO_/) 479*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_" $2 >out 480*a67afe4dSAndroid Build Coastguard Worker else 481*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_" $2 "_SUPPORTED" >out 482*a67afe4dSAndroid Build Coastguard Worker print "#endif" >out 483*a67afe4dSAndroid Build Coastguard Worker next 484*a67afe4dSAndroid Build Coastguard Worker} 485*a67afe4dSAndroid Build Coastguard Worker 486*a67afe4dSAndroid Build Coastguard Worker# Lines may be injected into the C compiler input by preceding them 487*a67afe4dSAndroid Build Coastguard Worker# with an "@" character. The line is copied with just the leading 488*a67afe4dSAndroid Build Coastguard Worker# @ removed. 489*a67afe4dSAndroid Build Coastguard Worker 490*a67afe4dSAndroid Build Coastguard Worker$1 ~ /^@/{ 491*a67afe4dSAndroid Build Coastguard Worker # sub(/^[ ]*@/, "") 492*a67afe4dSAndroid Build Coastguard Worker $1 = substr($1, 2) 493*a67afe4dSAndroid Build Coastguard Worker print >out 494*a67afe4dSAndroid Build Coastguard Worker next 495*a67afe4dSAndroid Build Coastguard Worker} 496*a67afe4dSAndroid Build Coastguard Worker 497*a67afe4dSAndroid Build Coastguard Worker# Check for unrecognized lines, because of the preprocessing chunk 498*a67afe4dSAndroid Build Coastguard Worker# format errors will be detected on the first pass independent of 499*a67afe4dSAndroid Build Coastguard Worker# any other format errors. 500*a67afe4dSAndroid Build Coastguard Worker{ 501*a67afe4dSAndroid Build Coastguard Worker print "options.awk: bad line (" NR "):", $0 502*a67afe4dSAndroid Build Coastguard Worker err = 1 # prevent END{} running 503*a67afe4dSAndroid Build Coastguard Worker exit 1 504*a67afe4dSAndroid Build Coastguard Worker} 505*a67afe4dSAndroid Build Coastguard Worker 506*a67afe4dSAndroid Build Coastguard Worker# For checking purposes names that start with "ok_" or "fail_" are 507*a67afe4dSAndroid Build Coastguard Worker# not output to pnglibconf.h and must be either enabled or disabled 508*a67afe4dSAndroid Build Coastguard Worker# respectively for the build to succeed. This allows interdependencies 509*a67afe4dSAndroid Build Coastguard Worker# between options of the form "at least one of" or "at most one of" 510*a67afe4dSAndroid Build Coastguard Worker# to be checked. For example: 511*a67afe4dSAndroid Build Coastguard Worker# 512*a67afe4dSAndroid Build Coastguard Worker# option FLOATING_POINT enables ok_math 513*a67afe4dSAndroid Build Coastguard Worker# option FIXED_POINT enables ok_math 514*a67afe4dSAndroid Build Coastguard Worker# This ensures that at least one of FLOATING_POINT and FIXED_POINT 515*a67afe4dSAndroid Build Coastguard Worker# must be set for the build to succeed. 516*a67afe4dSAndroid Build Coastguard Worker# 517*a67afe4dSAndroid Build Coastguard Worker# option fail_math requires FLOATING_POINT FIXED_POINT 518*a67afe4dSAndroid Build Coastguard Worker# This means the build will fail if *both* FLOATING_POINT and 519*a67afe4dSAndroid Build Coastguard Worker# FIXED_POINT are set (this is an example; in fact both are allowed.) 520*a67afe4dSAndroid Build Coastguard Worker# 521*a67afe4dSAndroid Build Coastguard Worker# If all these options were given the build would require exactly one 522*a67afe4dSAndroid Build Coastguard Worker# of the names to be enabled. 523*a67afe4dSAndroid Build Coastguard Worker 524*a67afe4dSAndroid Build Coastguard WorkerEND{ 525*a67afe4dSAndroid Build Coastguard Worker # END{} gets run on an exit (a traditional awk feature) 526*a67afe4dSAndroid Build Coastguard Worker if (err) exit 1 527*a67afe4dSAndroid Build Coastguard Worker 528*a67afe4dSAndroid Build Coastguard Worker if (pre) { 529*a67afe4dSAndroid Build Coastguard Worker # Record the final value of the variables 530*a67afe4dSAndroid Build Coastguard Worker print "deb =", deb >out 531*a67afe4dSAndroid Build Coastguard Worker if (everything != "") { 532*a67afe4dSAndroid Build Coastguard Worker print "everything =", everything >out 533*a67afe4dSAndroid Build Coastguard Worker } 534*a67afe4dSAndroid Build Coastguard Worker print "logunsupported =", logunsupported >out 535*a67afe4dSAndroid Build Coastguard Worker exit 0 536*a67afe4dSAndroid Build Coastguard Worker } 537*a67afe4dSAndroid Build Coastguard Worker 538*a67afe4dSAndroid Build Coastguard Worker # Do the options first (allowing options to set settings). The dependency 539*a67afe4dSAndroid Build Coastguard Worker # tree is thus: 540*a67afe4dSAndroid Build Coastguard Worker # 541*a67afe4dSAndroid Build Coastguard Worker # name > name 542*a67afe4dSAndroid Build Coastguard Worker # name requires name 543*a67afe4dSAndroid Build Coastguard Worker # name if name 544*a67afe4dSAndroid Build Coastguard Worker # name enabledby name 545*a67afe4dSAndroid Build Coastguard Worker # 546*a67afe4dSAndroid Build Coastguard Worker # First build a list 'tree' by option of all the things on which 547*a67afe4dSAndroid Build Coastguard Worker # it depends. 548*a67afe4dSAndroid Build Coastguard Worker print "" >out 549*a67afe4dSAndroid Build Coastguard Worker print "/* OPTIONS */" >out 550*a67afe4dSAndroid Build Coastguard Worker print comment, "options", cend >out 551*a67afe4dSAndroid Build Coastguard Worker for (opt in enabledby) tree[opt] = 1 # may not be explicit options 552*a67afe4dSAndroid Build Coastguard Worker for (opt in option) if (opt != "") { 553*a67afe4dSAndroid Build Coastguard Worker o = option[opt] 554*a67afe4dSAndroid Build Coastguard Worker # option should always be one of the following values 555*a67afe4dSAndroid Build Coastguard Worker if (o != "on" && o != "off" && o != "disabled" && o != "enabled") { 556*a67afe4dSAndroid Build Coastguard Worker print "internal option error (" o ")" 557*a67afe4dSAndroid Build Coastguard Worker exit 1 558*a67afe4dSAndroid Build Coastguard Worker } 559*a67afe4dSAndroid Build Coastguard Worker tree[opt] = "" # so unlisted options marked 560*a67afe4dSAndroid Build Coastguard Worker } 561*a67afe4dSAndroid Build Coastguard Worker for (opt in tree) if (opt != "") { 562*a67afe4dSAndroid Build Coastguard Worker if (tree[opt] == 1) { 563*a67afe4dSAndroid Build Coastguard Worker tree[opt] = "" 564*a67afe4dSAndroid Build Coastguard Worker if (option[opt] != "") { 565*a67afe4dSAndroid Build Coastguard Worker print "internal error (1)" 566*a67afe4dSAndroid Build Coastguard Worker exit 1 567*a67afe4dSAndroid Build Coastguard Worker } 568*a67afe4dSAndroid Build Coastguard Worker # Macros only listed in 'enables' remain off unless 569*a67afe4dSAndroid Build Coastguard Worker # one of the enabling macros is on. 570*a67afe4dSAndroid Build Coastguard Worker option[opt] = "disabled" 571*a67afe4dSAndroid Build Coastguard Worker } 572*a67afe4dSAndroid Build Coastguard Worker 573*a67afe4dSAndroid Build Coastguard Worker split("", list) # clear 'list' 574*a67afe4dSAndroid Build Coastguard Worker # Now add every requires, iffs or enabledby entry to 'list' 575*a67afe4dSAndroid Build Coastguard Worker # so that we can add a unique list of requirements to tree[i] 576*a67afe4dSAndroid Build Coastguard Worker split(requires[opt] iffs[opt] enabledby[opt], r) 577*a67afe4dSAndroid Build Coastguard Worker for (i in r) list[r[i]] = 1 578*a67afe4dSAndroid Build Coastguard Worker for (i in list) tree[opt] = tree[opt] " " i 579*a67afe4dSAndroid Build Coastguard Worker } 580*a67afe4dSAndroid Build Coastguard Worker 581*a67afe4dSAndroid Build Coastguard Worker # print the tree for extreme debugging 582*a67afe4dSAndroid Build Coastguard Worker if (deb > 2) for (i in tree) if (i != "") print i, "depends-on" tree[i] 583*a67afe4dSAndroid Build Coastguard Worker 584*a67afe4dSAndroid Build Coastguard Worker # Ok, now check all options marked explicitly 'on' or 'off': 585*a67afe4dSAndroid Build Coastguard Worker # 586*a67afe4dSAndroid Build Coastguard Worker # If an option[opt] is 'on' then turn on all requires[opt] 587*a67afe4dSAndroid Build Coastguard Worker # If an option[opt] is 'off' then turn off all enabledby[opt] 588*a67afe4dSAndroid Build Coastguard Worker # 589*a67afe4dSAndroid Build Coastguard Worker # Error out if we have to turn 'on' to an 'off' option or vice versa. 590*a67afe4dSAndroid Build Coastguard Worker npending = 0 591*a67afe4dSAndroid Build Coastguard Worker for (opt in option) if (opt != "") { 592*a67afe4dSAndroid Build Coastguard Worker if (option[opt] == "on" || option[opt] == "off") { 593*a67afe4dSAndroid Build Coastguard Worker pending[++npending] = opt 594*a67afe4dSAndroid Build Coastguard Worker } 595*a67afe4dSAndroid Build Coastguard Worker } 596*a67afe4dSAndroid Build Coastguard Worker 597*a67afe4dSAndroid Build Coastguard Worker err = 0 # set on error 598*a67afe4dSAndroid Build Coastguard Worker while (npending > 0) { 599*a67afe4dSAndroid Build Coastguard Worker opt = pending[npending--] 600*a67afe4dSAndroid Build Coastguard Worker if (option[opt] == "on") { 601*a67afe4dSAndroid Build Coastguard Worker nreqs = split(requires[opt], r) 602*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 603*a67afe4dSAndroid Build Coastguard Worker if (option[r[j]] == "off") { 604*a67afe4dSAndroid Build Coastguard Worker print "option", opt, "turned on, but requirement", r[j], "is turned off" 605*a67afe4dSAndroid Build Coastguard Worker err = 1 606*a67afe4dSAndroid Build Coastguard Worker } else if (option[r[j]] != "on") { 607*a67afe4dSAndroid Build Coastguard Worker option[r[j]] = "on" 608*a67afe4dSAndroid Build Coastguard Worker pending[++npending] = r[j] 609*a67afe4dSAndroid Build Coastguard Worker } 610*a67afe4dSAndroid Build Coastguard Worker } 611*a67afe4dSAndroid Build Coastguard Worker } else { 612*a67afe4dSAndroid Build Coastguard Worker if (option[opt] != "off") { 613*a67afe4dSAndroid Build Coastguard Worker print "internal error (2)" 614*a67afe4dSAndroid Build Coastguard Worker exit 1 615*a67afe4dSAndroid Build Coastguard Worker } 616*a67afe4dSAndroid Build Coastguard Worker nreqs = split(enabledby[opt], r) 617*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 618*a67afe4dSAndroid Build Coastguard Worker if (option[r[j]] == "on") { 619*a67afe4dSAndroid Build Coastguard Worker print "option", opt, "turned off, but enabled by", r[j], "which is turned on" 620*a67afe4dSAndroid Build Coastguard Worker err = 1 621*a67afe4dSAndroid Build Coastguard Worker } else if (option[r[j]] != "off") { 622*a67afe4dSAndroid Build Coastguard Worker option[r[j]] = "off" 623*a67afe4dSAndroid Build Coastguard Worker pending[++npending] = r[j] 624*a67afe4dSAndroid Build Coastguard Worker } 625*a67afe4dSAndroid Build Coastguard Worker } 626*a67afe4dSAndroid Build Coastguard Worker } 627*a67afe4dSAndroid Build Coastguard Worker } 628*a67afe4dSAndroid Build Coastguard Worker if (err) exit 1 629*a67afe4dSAndroid Build Coastguard Worker 630*a67afe4dSAndroid Build Coastguard Worker # Sort options: 631*a67afe4dSAndroid Build Coastguard Worker print "PNG_DFN_START_SORT 2" >out 632*a67afe4dSAndroid Build Coastguard Worker 633*a67afe4dSAndroid Build Coastguard Worker # option[i] is now the complete list of all the tokens we may 634*a67afe4dSAndroid Build Coastguard Worker # need to output, go through it as above, depth first. 635*a67afe4dSAndroid Build Coastguard Worker finished = 0 636*a67afe4dSAndroid Build Coastguard Worker while (!finished) { 637*a67afe4dSAndroid Build Coastguard Worker finished = 1 638*a67afe4dSAndroid Build Coastguard Worker movement = 0 # done nothing 639*a67afe4dSAndroid Build Coastguard Worker for (i in option) if (!done[i]) { 640*a67afe4dSAndroid Build Coastguard Worker nreqs = split(tree[i], r) 641*a67afe4dSAndroid Build Coastguard Worker if (nreqs > 0) { 642*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) if (!done[r[j]]) { 643*a67afe4dSAndroid Build Coastguard Worker break 644*a67afe4dSAndroid Build Coastguard Worker } 645*a67afe4dSAndroid Build Coastguard Worker if (j<=nreqs) { 646*a67afe4dSAndroid Build Coastguard Worker finished = 0 647*a67afe4dSAndroid Build Coastguard Worker continue # next option 648*a67afe4dSAndroid Build Coastguard Worker } 649*a67afe4dSAndroid Build Coastguard Worker } 650*a67afe4dSAndroid Build Coastguard Worker 651*a67afe4dSAndroid Build Coastguard Worker # All the requirements have been processed, output 652*a67afe4dSAndroid Build Coastguard Worker # this option. An option is _SUPPORTED if: 653*a67afe4dSAndroid Build Coastguard Worker # 654*a67afe4dSAndroid Build Coastguard Worker # all 'requires' are _SUPPORTED AND 655*a67afe4dSAndroid Build Coastguard Worker # at least one of the 'if' options are _SUPPORTED AND 656*a67afe4dSAndroid Build Coastguard Worker # EITHER: 657*a67afe4dSAndroid Build Coastguard Worker # The name is _SUPPORTED (on the command line) 658*a67afe4dSAndroid Build Coastguard Worker # OR: 659*a67afe4dSAndroid Build Coastguard Worker # an 'enabledby' is _SUPPORTED 660*a67afe4dSAndroid Build Coastguard Worker # OR: 661*a67afe4dSAndroid Build Coastguard Worker # NO_name is not defined AND 662*a67afe4dSAndroid Build Coastguard Worker # the option is not disabled; an option is disabled if: 663*a67afe4dSAndroid Build Coastguard Worker # option == off 664*a67afe4dSAndroid Build Coastguard Worker # option == disabled && everything != on 665*a67afe4dSAndroid Build Coastguard Worker # option == "" && everything == off 666*a67afe4dSAndroid Build Coastguard Worker if (deb) print "option", i 667*a67afe4dSAndroid Build Coastguard Worker print "" >out 668*a67afe4dSAndroid Build Coastguard Worker print "/* option:", i, option[i] >out 669*a67afe4dSAndroid Build Coastguard Worker print " * requires: " requires[i] >out 670*a67afe4dSAndroid Build Coastguard Worker print " * if: " iffs[i] >out 671*a67afe4dSAndroid Build Coastguard Worker print " * enabled-by:" enabledby[i] >out 672*a67afe4dSAndroid Build Coastguard Worker print " * sets: " sets[i], "*/" >out 673*a67afe4dSAndroid Build Coastguard Worker print "#undef PNG_on" >out 674*a67afe4dSAndroid Build Coastguard Worker print "#define PNG_on 1" >out 675*a67afe4dSAndroid Build Coastguard Worker 676*a67afe4dSAndroid Build Coastguard Worker # requires 677*a67afe4dSAndroid Build Coastguard Worker nreqs = split(requires[i], r) 678*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 679*a67afe4dSAndroid Build Coastguard Worker print "#ifndef PNG_" r[j] "_SUPPORTED" >out 680*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_on /*!" r[j] "*/" >out 681*a67afe4dSAndroid Build Coastguard Worker # This error appears in the final output if something 682*a67afe4dSAndroid Build Coastguard Worker # was switched 'on' but the processing above to force 683*a67afe4dSAndroid Build Coastguard Worker # the requires did not work 684*a67afe4dSAndroid Build Coastguard Worker if (option[i] == "on") { 685*a67afe4dSAndroid Build Coastguard Worker print error, i, "requires", r[j] end >out 686*a67afe4dSAndroid Build Coastguard Worker } 687*a67afe4dSAndroid Build Coastguard Worker print "#endif" >out 688*a67afe4dSAndroid Build Coastguard Worker } 689*a67afe4dSAndroid Build Coastguard Worker 690*a67afe4dSAndroid Build Coastguard Worker # if 691*a67afe4dSAndroid Build Coastguard Worker have_ifs = 0 692*a67afe4dSAndroid Build Coastguard Worker nreqs = split(iffs[i], r) 693*a67afe4dSAndroid Build Coastguard Worker print "#undef PNG_no_if" >out 694*a67afe4dSAndroid Build Coastguard Worker if (nreqs > 0) { 695*a67afe4dSAndroid Build Coastguard Worker have_ifs = 1 696*a67afe4dSAndroid Build Coastguard Worker print "/* if" iffs[i], "*/" >out 697*a67afe4dSAndroid Build Coastguard Worker print "#define PNG_no_if 1" >out 698*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 699*a67afe4dSAndroid Build Coastguard Worker print "#ifdef PNG_" r[j] "_SUPPORTED" >out 700*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_no_if /*" r[j] "*/" >out 701*a67afe4dSAndroid Build Coastguard Worker print "#endif" >out 702*a67afe4dSAndroid Build Coastguard Worker } 703*a67afe4dSAndroid Build Coastguard Worker print "#ifdef PNG_no_if /*missing if*/" >out 704*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_on" >out 705*a67afe4dSAndroid Build Coastguard Worker # There is no checking above for this, because we 706*a67afe4dSAndroid Build Coastguard Worker # don't know which 'if' to choose, so whine about 707*a67afe4dSAndroid Build Coastguard Worker # it here: 708*a67afe4dSAndroid Build Coastguard Worker if (option[i] == "on") { 709*a67afe4dSAndroid Build Coastguard Worker print error, i, "needs one of:", iffs[i] end >out 710*a67afe4dSAndroid Build Coastguard Worker } 711*a67afe4dSAndroid Build Coastguard Worker print "#endif" >out 712*a67afe4dSAndroid Build Coastguard Worker } 713*a67afe4dSAndroid Build Coastguard Worker 714*a67afe4dSAndroid Build Coastguard Worker print "#ifdef PNG_on /*requires, if*/" >out 715*a67afe4dSAndroid Build Coastguard Worker # enables 716*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_not_enabled" >out 717*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_not_enabled 1" >out 718*a67afe4dSAndroid Build Coastguard Worker print " /* enabled by" enabledby[i], "*/" >out 719*a67afe4dSAndroid Build Coastguard Worker nreqs = split(enabledby[i], r) 720*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 721*a67afe4dSAndroid Build Coastguard Worker print "#ifdef PNG_" r[j] "_SUPPORTED" >out 722*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_not_enabled /*" r[j] "*/" >out 723*a67afe4dSAndroid Build Coastguard Worker # Oops, probably not intended (should be factored 724*a67afe4dSAndroid Build Coastguard Worker # out by the checks above). 725*a67afe4dSAndroid Build Coastguard Worker if (option[i] == "off") { 726*a67afe4dSAndroid Build Coastguard Worker print error, i, "enabled by:", r[j] end >out 727*a67afe4dSAndroid Build Coastguard Worker } 728*a67afe4dSAndroid Build Coastguard Worker print "#endif" >out 729*a67afe4dSAndroid Build Coastguard Worker } 730*a67afe4dSAndroid Build Coastguard Worker 731*a67afe4dSAndroid Build Coastguard Worker print "# ifndef PNG_" i "_SUPPORTED /*!command line*/" >out 732*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_not_enabled /*!enabled*/" >out 733*a67afe4dSAndroid Build Coastguard Worker # 'have_ifs' here means that everything = "off" still allows an 'if' on 734*a67afe4dSAndroid Build Coastguard Worker # an otherwise enabled option to turn it on; otherwise the 'if' 735*a67afe4dSAndroid Build Coastguard Worker # handling is effectively disabled by 'everything = off' 736*a67afe4dSAndroid Build Coastguard Worker if ((option[i] == "off") || 737*a67afe4dSAndroid Build Coastguard Worker (option[i] == "disabled" && everything != "on") || 738*a67afe4dSAndroid Build Coastguard Worker (option[i] == "enabled" && everything == "off" && !have_ifs)) { 739*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_on /*default off*/" >out 740*a67afe4dSAndroid Build Coastguard Worker } else { 741*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_NO_" i >out 742*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_on /*turned off*/" >out 743*a67afe4dSAndroid Build Coastguard Worker print "# endif" >out 744*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_NO_" i "_SUPPORTED" >out 745*a67afe4dSAndroid Build Coastguard Worker print "# undef PNG_on /*turned off*/" >out 746*a67afe4dSAndroid Build Coastguard Worker print "# endif" >out 747*a67afe4dSAndroid Build Coastguard Worker } 748*a67afe4dSAndroid Build Coastguard Worker print "# endif /*!enabled*/" >out 749*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_on" >out 750*a67afe4dSAndroid Build Coastguard Worker # The _SUPPORTED macro must be defined so that dependent 751*a67afe4dSAndroid Build Coastguard Worker # options output later work. 752*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_" i "_SUPPORTED" >out 753*a67afe4dSAndroid Build Coastguard Worker print "# endif" >out 754*a67afe4dSAndroid Build Coastguard Worker print "# endif /*!command line*/" >out 755*a67afe4dSAndroid Build Coastguard Worker # If PNG_on is still set the option should be defined in 756*a67afe4dSAndroid Build Coastguard Worker # pnglibconf.h 757*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_on" >out 758*a67afe4dSAndroid Build Coastguard Worker if (i ~ /^fail_/) { 759*a67afe4dSAndroid Build Coastguard Worker print error, i, "is on:", 760*a67afe4dSAndroid Build Coastguard Worker "enabled by:" iffs[i] enabledby[i] ", requires" requires[i] end >out 761*a67afe4dSAndroid Build Coastguard Worker } else if (i !~ /^ok_/) { 762*a67afe4dSAndroid Build Coastguard Worker print def i sup >out 763*a67afe4dSAndroid Build Coastguard Worker # Supported option, set required settings 764*a67afe4dSAndroid Build Coastguard Worker nreqs = split(sets[i], r) 765*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 766*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_set_" r[j] >out 767*a67afe4dSAndroid Build Coastguard Worker # Some other option has already set a value: 768*a67afe4dSAndroid Build Coastguard Worker print error, i, "sets", r[j] ": duplicate setting" end >out 769*a67afe4dSAndroid Build Coastguard Worker print error, " previous value: " end "PNG_set_" r[j] >out 770*a67afe4dSAndroid Build Coastguard Worker print "# else" >out 771*a67afe4dSAndroid Build Coastguard Worker # Else set the default: note that this won't accept arbitrary 772*a67afe4dSAndroid Build Coastguard Worker # values, the setval string must be acceptable to all the C 773*a67afe4dSAndroid Build Coastguard Worker # compilers we use. That means it must be VERY simple; a number, 774*a67afe4dSAndroid Build Coastguard Worker # a name or a string. 775*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_set_" r[j], setval[i " " r[j]] >out 776*a67afe4dSAndroid Build Coastguard Worker print "# endif" >out 777*a67afe4dSAndroid Build Coastguard Worker } 778*a67afe4dSAndroid Build Coastguard Worker } 779*a67afe4dSAndroid Build Coastguard Worker print "# endif /* definition */" >out 780*a67afe4dSAndroid Build Coastguard Worker print "#endif /*requires, if*/" >out 781*a67afe4dSAndroid Build Coastguard Worker if (logunsupported || i ~ /^ok_/) { 782*a67afe4dSAndroid Build Coastguard Worker print "#ifndef PNG_on" >out 783*a67afe4dSAndroid Build Coastguard Worker if (logunsupported) { 784*a67afe4dSAndroid Build Coastguard Worker print und i une >out 785*a67afe4dSAndroid Build Coastguard Worker } 786*a67afe4dSAndroid Build Coastguard Worker if (i ~ /^ok_/) { 787*a67afe4dSAndroid Build Coastguard Worker print error, i, "not enabled: ", 788*a67afe4dSAndroid Build Coastguard Worker "requires:" requires[i] ", enabled by:" iffs[i] enabledby[i] end >out 789*a67afe4dSAndroid Build Coastguard Worker } 790*a67afe4dSAndroid Build Coastguard Worker print "#endif" >out 791*a67afe4dSAndroid Build Coastguard Worker } 792*a67afe4dSAndroid Build Coastguard Worker 793*a67afe4dSAndroid Build Coastguard Worker done[i] = 1 794*a67afe4dSAndroid Build Coastguard Worker ++movement 795*a67afe4dSAndroid Build Coastguard Worker } 796*a67afe4dSAndroid Build Coastguard Worker 797*a67afe4dSAndroid Build Coastguard Worker if (!finished && !movement) { 798*a67afe4dSAndroid Build Coastguard Worker print "option: loop or missing option in dependency tree, cannot process:" 799*a67afe4dSAndroid Build Coastguard Worker for (i in option) if (!done[i]) { 800*a67afe4dSAndroid Build Coastguard Worker print " option", i, "depends on" tree[i], "needs:" 801*a67afe4dSAndroid Build Coastguard Worker nreqs = split(tree[i], r) 802*a67afe4dSAndroid Build Coastguard Worker if (nreqs > 0) for (j=1; j<=nreqs; ++j) if (!done[r[j]]) { 803*a67afe4dSAndroid Build Coastguard Worker print " " r[j] 804*a67afe4dSAndroid Build Coastguard Worker } 805*a67afe4dSAndroid Build Coastguard Worker } 806*a67afe4dSAndroid Build Coastguard Worker exit 1 807*a67afe4dSAndroid Build Coastguard Worker } 808*a67afe4dSAndroid Build Coastguard Worker } 809*a67afe4dSAndroid Build Coastguard Worker print "PNG_DFN_END_SORT" >out 810*a67afe4dSAndroid Build Coastguard Worker print comment, "end of options", cend >out 811*a67afe4dSAndroid Build Coastguard Worker 812*a67afe4dSAndroid Build Coastguard Worker # Do the 'setting' values second, the algorithm the standard 813*a67afe4dSAndroid Build Coastguard Worker # tree walk (O(1)) done in an O(2) while/for loop; iterations 814*a67afe4dSAndroid Build Coastguard Worker # settings x depth, outputting the deepest required macros 815*a67afe4dSAndroid Build Coastguard Worker # first. 816*a67afe4dSAndroid Build Coastguard Worker print "" >out 817*a67afe4dSAndroid Build Coastguard Worker print "/* SETTINGS */" >out 818*a67afe4dSAndroid Build Coastguard Worker print comment, "settings", cend >out 819*a67afe4dSAndroid Build Coastguard Worker # Sort (in dfn.awk) on field 2, the setting name 820*a67afe4dSAndroid Build Coastguard Worker print "PNG_DFN_START_SORT 2" >out 821*a67afe4dSAndroid Build Coastguard Worker finished = 0 822*a67afe4dSAndroid Build Coastguard Worker while (!finished) { 823*a67afe4dSAndroid Build Coastguard Worker finished = 1 824*a67afe4dSAndroid Build Coastguard Worker movement = 0 # done nothing 825*a67afe4dSAndroid Build Coastguard Worker for (i in setting) if (!doneset[i]) { 826*a67afe4dSAndroid Build Coastguard Worker nreqs = split(setting[i], r) 827*a67afe4dSAndroid Build Coastguard Worker if (nreqs > 0) { 828*a67afe4dSAndroid Build Coastguard Worker # By default assume the requires values are options, but if there 829*a67afe4dSAndroid Build Coastguard Worker # is no option with that name check for a setting 830*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) if (option[r[j]] == "" && !doneset[r[j]]) { 831*a67afe4dSAndroid Build Coastguard Worker break 832*a67afe4dSAndroid Build Coastguard Worker } 833*a67afe4dSAndroid Build Coastguard Worker if (j<=nreqs) { 834*a67afe4dSAndroid Build Coastguard Worker finished = 0 835*a67afe4dSAndroid Build Coastguard Worker continue # try a different setting 836*a67afe4dSAndroid Build Coastguard Worker } 837*a67afe4dSAndroid Build Coastguard Worker } 838*a67afe4dSAndroid Build Coastguard Worker 839*a67afe4dSAndroid Build Coastguard Worker # All the requirements have been processed, output 840*a67afe4dSAndroid Build Coastguard Worker # this setting. 841*a67afe4dSAndroid Build Coastguard Worker if (deb) print "setting", i 842*a67afe4dSAndroid Build Coastguard Worker deflt = defaults[i] 843*a67afe4dSAndroid Build Coastguard Worker # Remove any spurious trailing spaces 844*a67afe4dSAndroid Build Coastguard Worker sub(/ *$/,"",deflt) 845*a67afe4dSAndroid Build Coastguard Worker # A leading @ means leave it unquoted so the preprocessor 846*a67afe4dSAndroid Build Coastguard Worker # can substitute the build time value 847*a67afe4dSAndroid Build Coastguard Worker if (deflt ~ /^ @/) 848*a67afe4dSAndroid Build Coastguard Worker deflt = " " subs substr(deflt, 3) sube 849*a67afe4dSAndroid Build Coastguard Worker print "" >out 850*a67afe4dSAndroid Build Coastguard Worker print "/* setting: ", i >out 851*a67afe4dSAndroid Build Coastguard Worker print " * requires:" setting[i] >out 852*a67afe4dSAndroid Build Coastguard Worker print " * default: ", defaults[i] deflt, "*/" >out 853*a67afe4dSAndroid Build Coastguard Worker for (j=1; j<=nreqs; ++j) { 854*a67afe4dSAndroid Build Coastguard Worker if (option[r[j]] != "") 855*a67afe4dSAndroid Build Coastguard Worker print "#ifndef PNG_" r[j] "_SUPPORTED" >out 856*a67afe4dSAndroid Build Coastguard Worker else 857*a67afe4dSAndroid Build Coastguard Worker print "#ifndef PNG_" r[j] >out 858*a67afe4dSAndroid Build Coastguard Worker print error, i, "requires", r[j] end >out 859*a67afe4dSAndroid Build Coastguard Worker print "# endif" >out 860*a67afe4dSAndroid Build Coastguard Worker } 861*a67afe4dSAndroid Build Coastguard Worker # The precedence is: 862*a67afe4dSAndroid Build Coastguard Worker # 863*a67afe4dSAndroid Build Coastguard Worker # 1) External definition; trumps: 864*a67afe4dSAndroid Build Coastguard Worker # 2) Option 'sets' value; trumps: 865*a67afe4dSAndroid Build Coastguard Worker # 3) Setting 'default' 866*a67afe4dSAndroid Build Coastguard Worker # 867*a67afe4dSAndroid Build Coastguard Worker print "#ifdef PNG_" i >out 868*a67afe4dSAndroid Build Coastguard Worker # PNG_<i> is defined, so substitute the value: 869*a67afe4dSAndroid Build Coastguard Worker print def i, subs "PNG_" i sube end >out 870*a67afe4dSAndroid Build Coastguard Worker print "#else /* use default */" >out 871*a67afe4dSAndroid Build Coastguard Worker print "# ifdef PNG_set_" i >out 872*a67afe4dSAndroid Build Coastguard Worker # Value from an option 'sets' argument 873*a67afe4dSAndroid Build Coastguard Worker print def i, subs "PNG_set_" i sube end >out 874*a67afe4dSAndroid Build Coastguard Worker # This is so that subsequent tests on the setting work: 875*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_" i, "1" >out 876*a67afe4dSAndroid Build Coastguard Worker if (defaults[i] != "") { 877*a67afe4dSAndroid Build Coastguard Worker print "# else /*default*/" >out 878*a67afe4dSAndroid Build Coastguard Worker print def i deflt end >out 879*a67afe4dSAndroid Build Coastguard Worker print "# define PNG_" i, "1" >out 880*a67afe4dSAndroid Build Coastguard Worker } 881*a67afe4dSAndroid Build Coastguard Worker print "# endif /* defaults */" >out 882*a67afe4dSAndroid Build Coastguard Worker print "#endif /* setting", i, "*/" >out 883*a67afe4dSAndroid Build Coastguard Worker 884*a67afe4dSAndroid Build Coastguard Worker doneset[i] = 1 885*a67afe4dSAndroid Build Coastguard Worker ++movement 886*a67afe4dSAndroid Build Coastguard Worker } 887*a67afe4dSAndroid Build Coastguard Worker 888*a67afe4dSAndroid Build Coastguard Worker if (!finished && !movement) { 889*a67afe4dSAndroid Build Coastguard Worker print "setting: loop or missing setting in 'requires', cannot process:" 890*a67afe4dSAndroid Build Coastguard Worker for (i in setting) if (!doneset[i]) { 891*a67afe4dSAndroid Build Coastguard Worker print " setting", i, "requires" setting[i] 892*a67afe4dSAndroid Build Coastguard Worker } 893*a67afe4dSAndroid Build Coastguard Worker exit 1 894*a67afe4dSAndroid Build Coastguard Worker } 895*a67afe4dSAndroid Build Coastguard Worker } 896*a67afe4dSAndroid Build Coastguard Worker print "PNG_DFN_END_SORT" >out 897*a67afe4dSAndroid Build Coastguard Worker print comment, "end of settings", cend >out 898*a67afe4dSAndroid Build Coastguard Worker 899*a67afe4dSAndroid Build Coastguard Worker # Regular end - everything looks ok 900*a67afe4dSAndroid Build Coastguard Worker if (protect != "") { 901*a67afe4dSAndroid Build Coastguard Worker print start "#endif", "/*", protect, "*/" end >out 902*a67afe4dSAndroid Build Coastguard Worker } 903*a67afe4dSAndroid Build Coastguard Worker} 904