@@ -225,6 +225,7 @@ MARK_AS_ADVANCED(SCL_BUILD_EXPRESS_ONLY)
225225# scl_cf.h.in - scripts may need to append to the template, so
226226# it is read into memory initially.
227227SET (CONFIG_H_FILE ${SCL_BINARY_DIR} /include/scl_cf.h.in)
228+ set_source_files_properties (${CONFIG_H_FILE} PROPERTIES GENERATED TRUE )
228229set (CMAKE_CURRENT_PROJECT SCL)
229230define_property (GLOBAL PROPERTY SCL_CONFIG_H_CONTENTS BRIEF_DOCS "config.h.in contents" FULL_DOCS "config.h.in contents for SCL project" )
230231if (NOT COMMAND CONFIG_H_APPEND)
@@ -239,14 +240,71 @@ endif(NOT COMMAND CONFIG_H_APPEND)
239240file (READ ${SCL_SOURCE_DIR} /include/scl_cf_cmake.h.in CONFIG_H_FILE_CONTENTS )
240241CONFIG_H_APPEND (SCL "${CONFIG_H_FILE_CONTENTS} " )
241242
243+ # The Express parser uses the tools Perplex, RE2C and Lemon to generate code
244+ # from higher level inputs. Depending on available tools and options, the
245+ # SCL build can either re-generate code as part of the build, or use cached
246+ # files that are ready for compilation.
247+ #
248+ # SCL_GENERATE_LEXER_PARSER is the "high level" control a user sets to determine
249+ # how the SCL build will interact (or not) with these tools. AUTO (the
250+ # default) means it will search for the necessary tools, and use them only if
251+ # everything is found. If not, it will fall back to the cached versions. If
252+ # this option is set to ON and the necessary tools are not found, the
253+ # configure step will fail. If it is set to OFF, SCL will not even try to use
254+ # the generators and will instead use the cached sources.
255+ if (NOT SCL_GENERATE_LEXER_PARSER)
256+ set (SCL_GENERATE_LEXER_PARSER "AUTO" CACHE STRING "Use Perplex, RE2C and Lemon to generate C source code." )
257+ else (NOT SCL_GENERATE_LEXER_PARSER )
258+ string (TOUPPER "${SCL_GENERATE_LEXER_PARSER} " SCL_GENERATE_LEXER_PARSER)
259+ endif (NOT SCL_GENERATE_LEXER_PARSER )
260+ set_property (CACHE SCL_GENERATE_LEXER_PARSER PROPERTY STRINGS AUTO ON OFF )
261+ if (NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "AUTO" AND NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "ON" AND NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "OFF" )
262+ message (WARNING "Unknown value ${SCL_GENERATE_LEXER_PARSER} supplied for BRLCAD_WORD_SIZE - defaulting to AUTO" )
263+ message (WARNING "Valid options are AUTO, ON and OFF" )
264+ set (SCL_GENERATE_LEXER_PARSER "AUTO" CACHE STRING "Use Perplex, RE2C and Lemon to generate C source code." )
265+ endif (NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "AUTO" AND NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "ON" AND NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "OFF" )
266+
267+ # If the generators have not been turned off, we need to check for them
268+ if (NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "OFF" )
269+ find_package (LEMON )
270+ find_package (RE2C )
271+ find_package (PERPLEX )
272+ if (LEMON_EXECUTABLE AND LEMON_TEMPLATE AND PERPLEX_EXECUTABLE AND PERPLEX_TEMPLATE AND RE2C_EXECUTABLE)
273+ # Templates may be anywhere - make sure we have a stable path if a relative
274+ # path was specified at CMake time
275+ get_filename_component (lemon_template_fpath "${LEMON_TEMPLATE} " ABSOLUTE )
276+ if (NOT "${lemon_template_fpath} " STREQUAL "${LEMON_TEMPLATE} " )
277+ get_filename_component (LEMON_TEMPLATE "${CMAKE_BINARY_DIR} /${LEMON_TEMPLATE} " ABSOLUTE )
278+ endif (NOT "${lemon_template_fpath} " STREQUAL "${LEMON_TEMPLATE} " )
279+ get_filename_component (perplex_template_fpath "${PERPLEX_TEMPLATE} " ABSOLUTE )
280+ if (NOT "${perplex_template_fpath} " STREQUAL "${PERPLEX_TEMPLATE} " )
281+ get_filename_component (PERPLEX_TEMPLATE "${CMAKE_BINARY_DIR} /${PERPLEX_TEMPLATE} " ABSOLUTE )
282+ endif (NOT "${perplex_template_fpath} " STREQUAL "${PERPLEX_TEMPLATE} " )
283+
284+ if (NOT COMMAND LEMON_TARGET)
285+ include (${SCL_CMAKE_DIR} /LEMON_Util.cmake )
286+ endif (NOT COMMAND LEMON_TARGET )
287+ if (NOT COMMAND PERPLEX_TARGET)
288+ include (${SCL_CMAKE_DIR} /PERPLEX_Util.cmake )
289+ endif (NOT COMMAND PERPLEX_TARGET )
290+ set (SCL_GENERATE_LP_SOURCES 1)
291+ else (LEMON_EXECUTABLE AND LEMON_TEMPLATE AND PERPLEX_EXECUTABLE AND PERPLEX_TEMPLATE AND RE2C_EXECUTABLE )
292+ if ("${SCL_GENERATE_LEXER_PARSER} " STREQUAL "ON" )
293+ message (FATAL_ERROR "\n SCL_GENERATE_LEXER_PARSER set to ON, but one or more components of the Perplex/RE2C/Lemon toolchain were not found.\n " )
294+ else ("${SCL_GENERATE_LEXER_PARSER} " STREQUAL "ON" )
295+ set (SCL_GENERATE_LP_SOURCES 0)
296+ endif ("${SCL_GENERATE_LEXER_PARSER} " STREQUAL "ON" )
297+ endif (LEMON_EXECUTABLE AND LEMON_TEMPLATE AND PERPLEX_EXECUTABLE AND PERPLEX_TEMPLATE AND RE2C_EXECUTABLE )
298+ else (NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "OFF" )
299+ set (SCL_GENERATE_LP_SOURCES 0)
300+ endif (NOT "${SCL_GENERATE_LEXER_PARSER} " STREQUAL "OFF" )
301+
242302INCLUDE (CheckLibraryExists )
243303INCLUDE (CheckIncludeFile )
244304INCLUDE (CheckFunctionExists )
245305INCLUDE (CheckTypeSize )
246306INCLUDE (CMakePushCheckState )
247307INCLUDE (CheckCXXSourceRuns )
248- INCLUDE (${SCL_CMAKE_DIR} /FindLEX.cmake )
249- INCLUDE (${SCL_CMAKE_DIR} /FindYACC.cmake )
250308
251309CHECK_INCLUDE_FILE (ndir.h HAVE_NDIR_H )
252310CHECK_INCLUDE_FILE (stdarg.h HAVE_STDARG_H )
0 commit comments