| Configure Internals | |
| =================== | |
| [ note: this file uses markdown for formatting ] | |
| Intro | |
| ----- | |
| This is a collection of notes that are hopefully of interest to those | |
| who decide to dive into Configure and what it does. This is a living | |
| document and anyone is encouraged to add to it and submit changes. | |
| There's no claim for this document to be complete at any time, but it | |
| will hopefully reach such a point in time. | |
| ---------------------------------------------------------------------- | |
| Parsing build.info files, processing conditions | |
| ----------------------------------------------- | |
| Processing conditions in build.info files is done with the help of a | |
| condition stack that tell if a build.info should be processed or if it | |
| should just be skipped over. The possible states of the stack top are | |
| expressed in the following comment from Configure: | |
| # The top item of this stack has the following values | |
| # -2 positive already run and we found ELSE (following ELSIF should fail) | |
| # -1 positive already run (skip until ENDIF) | |
| # 0 negatives so far (if we're at a condition, check it) | |
| # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF) | |
| # 2 positive ELSE (following ELSIF should fail) | |
| Ground rule is that non-condition lines are skipped over if the | |
| stack top is > 0. Condition lines (IF, ELSIF, ELSE and ENDIF | |
| statements) need to be processed either way to keep track of the skip | |
| stack states, so they are a little more intricate. | |
| Instead of trying to describe in words, here are some example of what | |
| the skip stack should look like after each line is processed: | |
| Example 1: | |
| | IF[1] | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | IF[1] | 1 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ELSIF[1] | 1 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | 1 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ELSIF[1] | -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | IF[1] | -1 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | -1 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | -1 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | | | | |
| Example 2: | |
| | IF[0] | 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | IF[1] | 0 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | 0 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | 0 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | IF[1] | 1 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ELSIF[1] | 1 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | 1 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ENDIF | | | | |
| Example 3: | |
| | IF[0] | 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | IF[0] | 0 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | 0 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | 0 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | IF[0] | 1 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | 1 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ELSE | 1 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ENDIF | | | | |
| Example 4: | |
| | IF[0] | 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | IF[0] | 0 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[0] | 0 -1 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | 0 -2 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ENDIF | 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[1] | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | IF[0] | 1 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSIF[0] | 1 0 | | | |
| | ... whatever ... | | this line is skipped over | | |
| | ELSE | 1 2 | | | |
| | ... whatever ... | | this line is processed | | |
| | ENDIF | 1 | | | |
| | ... whatever ... | | this line is processed | | |
| | ENDIF | | | | |