Skip to content

Commit a4a7174

Browse files
committed
Start documenting Configure internals
This is a living document, everyone is encouraged to add to it. Implementation details as well as broader implementation philosophy has a place here. I'm starting with documentation of the how conditions in build.info files are treated. Reviewed-by: Rich Salz <[email protected]>
1 parent 2b6b606 commit a4a7174

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

Configurations/INTERNALS.Configure

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
Configure Internals
2+
===================
3+
4+
[ note: this file uses markdown for formatting ]
5+
6+
Intro
7+
-----
8+
9+
This is a collection of notes that are hopefully of interest to those
10+
who decide to dive into Configure and what it does. This is a living
11+
document and anyone is encouraged to add to it and submit changes.
12+
There's no claim for this document to be complete at any time, but it
13+
will hopefully reach such a point in time.
14+
15+
16+
----------------------------------------------------------------------
17+
18+
Parsing build.info files, processing conditions
19+
-----------------------------------------------
20+
21+
Processing conditions in build.info files is done with the help of a
22+
condition stack that tell if a build.info should be processed or if it
23+
should just be skipped over. The possible states of the stack top are
24+
expressed in the following comment from Configure:
25+
26+
# The top item of this stack has the following values
27+
# -2 positive already run and we found ELSE (following ELSIF should fail)
28+
# -1 positive already run (skip until ENDIF)
29+
# 0 negatives so far (if we're at a condition, check it)
30+
# 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
31+
# 2 positive ELSE (following ELSIF should fail)
32+
33+
Ground rule is that non-condition lines are skipped over if the
34+
stack top is > 0. Condition lines (IF, ELSIF, ELSE and ENDIF
35+
statements) need to be processed either way to keep track of the skip
36+
stack states, so they are a little more intricate.
37+
38+
Instead of trying to describe in words, here are some example of what
39+
the skip stack should look like after each line is processed:
40+
41+
Example 1:
42+
43+
| IF[1] | 1 | |
44+
| ... whatever ... | | this line is processed |
45+
| IF[1] | 1 1 | |
46+
| ... whatever ... | | this line is processed |
47+
| ELSIF[1] | 1 -1 | |
48+
| ... whatever ... | | this line is skipped over |
49+
| ELSE | 1 -2 | |
50+
| ... whatever ... | | this line is skipped over |
51+
| ENDIF | 1 | |
52+
| ... whatever ... | | this line is processed |
53+
| ELSIF[1] | -1 | |
54+
| ... whatever ... | | this line is skipped over |
55+
| IF[1] | -1 -1 | |
56+
| ... whatever ... | | this line is skipped over |
57+
| ELSIF[1] | -1 -1 | |
58+
| ... whatever ... | | this line is skipped over |
59+
| ELSE | -1 -2 | |
60+
| ... whatever ... | | this line is skipped over |
61+
| ENDIF | -1 | |
62+
| ... whatever ... | | this line is skipped over |
63+
| ENDIF | | |
64+
65+
Example 2:
66+
67+
| IF[0] | 0 | |
68+
| ... whatever ... | | this line is skipped over |
69+
| IF[1] | 0 -1 | |
70+
| ... whatever ... | | this line is skipped over |
71+
| ELSIF[1] | 0 -1 | |
72+
| ... whatever ... | | this line is skipped over |
73+
| ELSE | 0 -2 | |
74+
| ... whatever ... | | this line is skipped over |
75+
| ENDIF | 0 | |
76+
| ... whatever ... | | this line is skipped over |
77+
| ELSIF[1] | 1 | |
78+
| ... whatever ... | | this line is processed |
79+
| IF[1] | 1 1 | |
80+
| ... whatever ... | | this line is processed |
81+
| ELSIF[1] | 1 -1 | |
82+
| ... whatever ... | | this line is skipped over |
83+
| ELSE | 1 -2 | |
84+
| ... whatever ... | | this line is skipped over |
85+
| ENDIF | 1 | |
86+
| ... whatever ... | | this line is processed |
87+
| ENDIF | | |
88+
89+
Example 3:
90+
91+
| IF[0] | 0 | |
92+
| ... whatever ... | | this line is skipped over |
93+
| IF[0] | 0 -1 | |
94+
| ... whatever ... | | this line is skipped over |
95+
| ELSIF[1] | 0 -1 | |
96+
| ... whatever ... | | this line is skipped over |
97+
| ELSE | 0 -2 | |
98+
| ... whatever ... | | this line is skipped over |
99+
| ENDIF | 0 | |
100+
| ... whatever ... | | this line is skipped over |
101+
| ELSIF[1] | 1 | |
102+
| ... whatever ... | | this line is processed |
103+
| IF[0] | 1 0 | |
104+
| ... whatever ... | | this line is skipped over |
105+
| ELSIF[1] | 1 1 | |
106+
| ... whatever ... | | this line is processed |
107+
| ELSE | 1 -2 | |
108+
| ... whatever ... | | this line is skipped over |
109+
| ENDIF | 1 | |
110+
| ... whatever ... | | this line is processed |
111+
| ENDIF | | |
112+
113+
Example 4:
114+
115+
| IF[0] | 0 | |
116+
| ... whatever ... | | this line is skipped over |
117+
| IF[0] | 0 -1 | |
118+
| ... whatever ... | | this line is skipped over |
119+
| ELSIF[0] | 0 -1 | |
120+
| ... whatever ... | | this line is skipped over |
121+
| ELSE | 0 -2 | |
122+
| ... whatever ... | | this line is skipped over |
123+
| ENDIF | 0 | |
124+
| ... whatever ... | | this line is skipped over |
125+
| ELSIF[1] | 1 | |
126+
| ... whatever ... | | this line is processed |
127+
| IF[0] | 1 0 | |
128+
| ... whatever ... | | this line is skipped over |
129+
| ELSIF[0] | 1 0 | |
130+
| ... whatever ... | | this line is skipped over |
131+
| ELSE | 1 2 | |
132+
| ... whatever ... | | this line is processed |
133+
| ENDIF | 1 | |
134+
| ... whatever ... | | this line is processed |
135+
| ENDIF | | |
136+

0 commit comments

Comments
 (0)