Index: llvm/utils/gn/build/write_cmake_config.py =================================================================== --- llvm/utils/gn/build/write_cmake_config.py +++ llvm/utils/gn/build/write_cmake_config.py @@ -1,10 +1,17 @@ #!/usr/bin/env python -"""Processes a foo.h.cmake file and writes foo.h. +"""Emulates the bits of CMake's configure_file() function needed in LLVM. + +The CMake build uses configure_file() for several things. This emulates that +function for the GN build. In the GN build, this runs at build time, instead +of at generator time. Takes a list of KEY=VALUE pairs (where VALUE can be empty). -Handles these types of lines (note that FOO= sets the value of FOO to the empty -string, which is falsy, but FOO=0 sets it to '0' which is truthy): +On each line, replaces ${KEY} with VALUE. + +After that, also handles these special cases (note that FOO= sets the value of +FOO to the empty string, which is falsy, but FOO=0 sets it to '0' which is +truthy): 1.) #cmakedefine01 FOO Checks if key FOO is set to a truthy value, and depending on that prints @@ -13,29 +20,15 @@ #define FOO 1 #define FOO 0 -2.) #cmakedefine FOO +2.) #cmakedefine FOO [...] Checks if key FOO is set to a truthy in value, and depending on that prints one of the following two lines: - #define FOO + #define FOO [...] /* #undef FOO */ -3.) #cmakedefine FOO asdf${BAR}jkl - Checks if key FOO is set to a truthy values, and if so replaces all - variable references in `asdf${BAR}jkl` with their value and prints that - (else it prints the same undef line as the previous form): - - #define FOO asdfBAR_VALjkl - /* #undef FOO */ - -4.) #define FOO asdf{BAR}jkl - Always gets its variable values filled in, independent of FOO's value being - set: - - #define FOO asdfBAR_VALjkl - Fails if any of the KEY=VALUE arguments aren't needed for processing the -.h.cmake file, or if the .h.cmake file has unreplaces ${VAR} references after +.h.cmake file, or if the .h.cmake file has unreplaced ${VAR} references after processing all values. """ @@ -70,9 +63,10 @@ def repl(m): unused_values.discard(m.group(1)) return values[m.group(1)] + in_line = var_re.sub(repl, in_line) if in_line.startswith('#cmakedefine01 '): _, var = in_line.split() - out_lines.append('#define %s %d\n' % (var, 1 if values[var] else 0)) + in_line = '#define %s %d\n' % (var, 1 if values[var] else 0) unused_values.discard(var) elif in_line.startswith('#cmakedefine '): _, var = in_line.split(None, 1) @@ -81,14 +75,11 @@ except: var, val = var.rstrip(), '\n' if values[var]: - out_lines.append('#define %s %s' % (var, - var_re.sub(repl, val))) + in_line = '#define %s %s' % (var, val) else: - out_lines.append('/* #undef %s */\n' % var) + in_line = '/* #undef %s */\n' % var unused_values.discard(var) - else: - # In particular, handles `#define FOO ${FOO}` lines. - out_lines.append(var_re.sub(repl, in_line)) + out_lines.append(in_line) if unused_values: print >>sys.stderr, 'Unused --values args:'