1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.

115 lines
4.4 KiB
CMake

# -------------------------------------------------------------------------------------------------------------------
## Parser Generation Targets
# When updating the cached files, update MD5 sums defined in this file
include(${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake)
macro(MD5 filename md5sum)
file(READ "${filename}" RAW_MD5_FILE)
string(REGEX REPLACE "\r" "" STRIPPED_MD5_FILE "${RAW_MD5_FILE}")
string(MD5 ${md5sum} "${STRIPPED_MD5_FILE}")
endmacro(MD5)
find_package(BISON 3.4)
find_package(FLEX 2.5)
if(BISON_FOUND AND FLEX_FOUND)
BISON_TARGET(MZNParser
${PROJECT_SOURCE_DIR}/lib/parser.yxx
${PROJECT_BINARY_DIR}/parser.tab.cpp
DEFINES_FILE ${PROJECT_BINARY_DIR}/include/minizinc/parser.tab.hh
COMPILE_FLAGS "-p mzn_yy -l"
)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/include/minizinc/support/)
BISON_TARGET(RegExParser
${PROJECT_SOURCE_DIR}/lib/support/regex/parser.yxx
${PROJECT_BINARY_DIR}/regex_parser.tab.cpp
DEFINES_FILE ${PROJECT_BINARY_DIR}/include/minizinc/support/regex_parser.tab.hh
COMPILE_FLAGS "-p regex_yy -l"
)
FLEX_TARGET(MZNLexer
${PROJECT_SOURCE_DIR}/lib/lexer.lxx
${PROJECT_BINARY_DIR}/lexer.yy.cpp
COMPILE_FLAGS "-P mzn_yy -L"
)
ADD_FLEX_BISON_DEPENDENCY(MZNLexer MZNParser)
FLEX_TARGET(RegExLexer
${PROJECT_SOURCE_DIR}/lib/support/regex/lexer.lxx
${PROJECT_BINARY_DIR}/regex_lexer.yy.cpp
COMPILE_FLAGS "-P regex_yy -L"
)
ADD_FLEX_BISON_DEPENDENCY(RegExLexer RegExParser)
else()
MD5(${PROJECT_SOURCE_DIR}/lib/parser.yxx parser_yxx_md5)
if(NOT "${parser_yxx_md5}" STREQUAL "${parser_yxx_md5_cached}")
message(FATAL_ERROR
"The file parser.yxx has been modified but bison cannot be run.\n"
"If you are sure parser.tab.cpp and minizinc/parser.tab.hh in ${PROJECT_SOURCE_DIR}/lib/cached/ are correct "
"then copy parser.yxx's md5 ${parser_yxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
)
endif()
MD5(${PROJECT_SOURCE_DIR}/lib/support/regex/parser.yxx regex_parser_yxx_md5)
if(NOT "${regex_parser_yxx_md5}" STREQUAL "${regex_parser_yxx_md5_cached}")
message(FATAL_ERROR
"The file regex/parser.yxx has been modified but bison cannot be run.\n"
"If you are sure regex_parser.tab.cpp and minizinc/support/regex_parser.tab.hh in "
"${PROJECT_SOURCE_DIR}/lib/cached/ are correct then copy regex_parser.yxx's md5 ${regex_parser_yxx_md5} into "
"${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
)
endif()
MD5(${PROJECT_SOURCE_DIR}/lib/lexer.lxx lexer_lxx_md5)
if(NOT "${lexer_lxx_md5}" STREQUAL "${lexer_lxx_md5_cached}")
message(FATAL_ERROR
"The file lexer.lxx has been modified but flex cannot be run.\n"
"If you are sure ${PROJECT_SOURCE_DIR}/lib/cached/lexer.yy.cpp is correct then "
"copy lexer.lxx's md5 ${lexer_lxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
)
endif()
MD5(${PROJECT_SOURCE_DIR}/lib/support/regex/lexer.lxx regex_lexer_lxx_md5)
if(NOT "${regex_lexer_lxx_md5}" STREQUAL "${regex_lexer_lxx_md5_cached}")
message(FATAL_ERROR
"The file regex/lexer.lxx has been modified but flex cannot be run.\n"
"If you are sure ${PROJECT_SOURCE_DIR}/lib/cached/regex_lexer.yy.cpp is correct then "
"copy regex/lexer.lxx's md5 ${regex_lexer_lxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
)
endif()
include_directories(${PROJECT_SOURCE_DIR}/lib/cached)
set(BISON_MZNParser_OUTPUTS
${PROJECT_SOURCE_DIR}/lib/cached/parser.tab.cpp
${PROJECT_SOURCE_DIR}/lib/cached/minizinc/parser.tab.hh
)
set(BISON_RegExParser_OUTPUTS
${PROJECT_SOURCE_DIR}/lib/cached/regex_parser.tab.cpp
${PROJECT_SOURCE_DIR}/lib/cached/minizinc/support/regex_parser.tab.hh
)
set(FLEX_MZNLexer_OUTPUTS ${PROJECT_SOURCE_DIR}/lib/cached/lexer.yy.cpp)
set(FLEX_RegExLexer_OUTPUTS ${PROJECT_SOURCE_DIR}/lib/cached/regex_lexer.yy.cpp)
endif()
if(NOT GECODE_FOUND)
set(FLEX_RegExLexer_OUTPUTS "")
set(BISON_RegExParser_OUTPUTS "")
endif()
add_library(minizinc_parser OBJECT
${BISON_MZNParser_OUTPUTS}
${FLEX_MZNLexer_OUTPUTS}
${BISON_RegExParser_OUTPUTS}
${FLEX_RegExLexer_OUTPUTS}
)
set_target_properties(minizinc_parser PROPERTIES
CXX_CLANG_TIDY ""
)
if(GECODE_FOUND)
target_include_directories(minizinc_parser PRIVATE "${GECODE_INCLUDE_DIRS}")
target_compile_definitions(minizinc_parser PRIVATE HAS_GECODE)
endif()