this repo has no description
1# -------------------------------------------------------------------------------------------------------------------
2## Parser Generation Targets
3
4# When updating the cached files, update MD5 sums defined in this file
5include(${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake)
6
7macro(MD5 filename md5sum)
8 file(READ "${filename}" RAW_MD5_FILE)
9 string(REGEX REPLACE "\r" "" STRIPPED_MD5_FILE "${RAW_MD5_FILE}")
10 string(MD5 ${md5sum} "${STRIPPED_MD5_FILE}")
11endmacro(MD5)
12
13find_package(BISON 3.4)
14find_package(FLEX 2.5)
15
16if(BISON_FOUND AND FLEX_FOUND)
17 BISON_TARGET(MZNParser
18 ${PROJECT_SOURCE_DIR}/lib/parser.yxx
19 ${PROJECT_BINARY_DIR}/parser.tab.cpp
20 DEFINES_FILE ${PROJECT_BINARY_DIR}/include/minizinc/parser.tab.hh
21 COMPILE_FLAGS "-p mzn_yy -l"
22 )
23
24 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/include/minizinc/support/)
25 BISON_TARGET(MZAParser
26 ${PROJECT_SOURCE_DIR}/lib/support/assembly/parser.yxx
27 ${PROJECT_BINARY_DIR}/mza_parser.tab.cpp
28 DEFINES_FILE ${PROJECT_BINARY_DIR}/include/minizinc/support/mza_parser.tab.hh
29 COMPILE_FLAGS "-p mza_yy -l"
30 )
31
32 BISON_TARGET(RegExParser
33 ${PROJECT_SOURCE_DIR}/lib/support/regex/parser.yxx
34 ${PROJECT_BINARY_DIR}/regex_parser.tab.cpp
35 DEFINES_FILE ${PROJECT_BINARY_DIR}/include/minizinc/support/regex_parser.tab.hh
36 COMPILE_FLAGS "-p regex_yy -l"
37 )
38else()
39 MD5(${PROJECT_SOURCE_DIR}/lib/parser.yxx parser_yxx_md5)
40 if(NOT "${parser_yxx_md5}" STREQUAL "${parser_yxx_md5_cached}")
41 message(FATAL_ERROR
42 "The file parser.yxx has been modified but bison cannot be run.\n"
43 "If you are sure parser.tab.cpp and minizinc/parser.tab.hh in ${PROJECT_SOURCE_DIR}/lib/cached/ are correct "
44 "then copy parser.yxx's md5 ${parser_yxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
45 )
46 endif()
47
48 MD5(${PROJECT_SOURCE_DIR}/lib/support/regex/parser.yxx regex_parser_yxx_md5)
49 if(NOT "${regex_parser_yxx_md5}" STREQUAL "${regex_parser_yxx_md5_cached}")
50 message(FATAL_ERROR
51 "The file regex/parser.yxx has been modified but bison cannot be run.\n"
52 "If you are sure regex_parser.tab.cpp and minizinc/support/regex_parser.tab.hh in "
53 "${PROJECT_SOURCE_DIR}/lib/cached/ are correct then copy regex_parser.yxx's md5 ${regex_parser_yxx_md5} into "
54 "${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
55 )
56 endif()
57
58 MD5(${PROJECT_SOURCE_DIR}/lib/support/assembly/parser.yxx mza_parser_yxx_md5)
59 if(NOT "${mza_parser_yxx_md5}" STREQUAL "${mza_parser_yxx_md5_cached}")
60 message(FATAL_ERROR
61 "The file assembly/parser.yxx has been modified but bison cannot be run.\n"
62 "If you are sure mza_parser.tab.cpp and minizinc/support/mza_parser.tab.hh in "
63 "${PROJECT_SOURCE_DIR}/lib/cached/ are correct then copy mza_parser.yxx's md5 ${mza_parser_yxx_md5} into "
64 "${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
65 )
66 endif()
67
68 include_directories(${PROJECT_SOURCE_DIR}/lib/cached)
69 set(BISON_MZNParser_OUTPUTS
70 ${PROJECT_SOURCE_DIR}/lib/cached/parser.tab.cpp
71 ${PROJECT_SOURCE_DIR}/lib/cached/minizinc/parser.tab.hh
72 )
73 set(BISON_RegExParser_OUTPUTS
74 ${PROJECT_SOURCE_DIR}/lib/cached/regex_parser.tab.cpp
75 ${PROJECT_SOURCE_DIR}/lib/cached/minizinc/support/regex_parser.tab.hh
76 )
77 set(BISON_MZAParser_OUTPUTS
78 ${PROJECT_SOURCE_DIR}/lib/cached/mza_parser.tab.cpp
79 ${PROJECT_SOURCE_DIR}/lib/cached/minizinc/support/mza_parser.tab.hh
80 )
81endif()
82
83find_package(FLEX)
84if(FLEX_FOUND)
85 FLEX_TARGET(MZNLexer
86 ${PROJECT_SOURCE_DIR}/lib/lexer.lxx
87 ${PROJECT_BINARY_DIR}/lexer.yy.cpp
88 COMPILE_FLAGS "-P mzn_yy -L"
89 )
90 ADD_FLEX_BISON_DEPENDENCY(MZNLexer MZNParser)
91
92 FLEX_TARGET(MZALexer
93 ${PROJECT_SOURCE_DIR}/lib/support/assembly/lexer.lxx
94 ${PROJECT_BINARY_DIR}/mza_lexer.yy.cpp
95 COMPILE_FLAGS "-P mza_yy -L"
96 )
97 ADD_FLEX_BISON_DEPENDENCY(MZALexer MZAParser)
98
99 FLEX_TARGET(RegExLexer
100 ${PROJECT_SOURCE_DIR}/lib/support/regex/lexer.lxx
101 ${PROJECT_BINARY_DIR}/regex_lexer.yy.cpp
102 COMPILE_FLAGS "-P regex_yy -L"
103 )
104 ADD_FLEX_BISON_DEPENDENCY(RegExLexer RegExParser)
105else()
106 MD5(${PROJECT_SOURCE_DIR}/lib/lexer.lxx lexer_lxx_md5)
107 if(NOT "${lexer_lxx_md5}" STREQUAL "${lexer_lxx_md5_cached}")
108 message(FATAL_ERROR
109 "The file lexer.lxx has been modified but flex cannot be run.\n"
110 "If you are sure ${PROJECT_SOURCE_DIR}/lib/cached/lexer.yy.cpp is correct then "
111 "copy lexer.lxx's md5 ${lexer_lxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
112 )
113 endif()
114
115 MD5(${PROJECT_SOURCE_DIR}/lib/support/regex/lexer.lxx regex_lexer_lxx_md5)
116 if(NOT "${regex_lexer_lxx_md5}" STREQUAL "${regex_lexer_lxx_md5_cached}")
117 message(FATAL_ERROR
118 "The file regex/lexer.lxx has been modified but flex cannot be run.\n"
119 "If you are sure ${PROJECT_SOURCE_DIR}/lib/cached/regex_lexer.yy.cpp is correct then "
120 "copy regex/lexer.lxx's md5 ${regex_lexer_lxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
121 )
122 endif()
123
124 MD5(${PROJECT_SOURCE_DIR}/lib/support/assembly/lexer.lxx mza_lexer_lxx_md5)
125 if(NOT "${mza_lexer_lxx_md5}" STREQUAL "${mza_lexer_lxx_md5_cached}")
126 message(FATAL_ERROR
127 "The file assembly/lexer.lxx has been modified but flex cannot be run.\n"
128 "If you are sure ${PROJECT_SOURCE_DIR}/lib/cached/mza_lexer.yy.cpp is correct then "
129 "copy mza/lexer.lxx's md5 ${mza_lexer_lxx_md5} into ${PROJECT_SOURCE_DIR}/lib/cached/md5_cached.cmake"
130 )
131 endif()
132
133 set(FLEX_MZNLexer_OUTPUTS ${PROJECT_SOURCE_DIR}/lib/cached/lexer.yy.cpp)
134 set(FLEX_RegExLexer_OUTPUTS ${PROJECT_SOURCE_DIR}/lib/cached/regex_lexer.yy.cpp)
135 set(FLEX_MZALexer_OUTPUTS ${PROJECT_SOURCE_DIR}/lib/cached/mza_lexer.yy.cpp)
136endif()
137
138if(NOT (GECODE_FOUND AND USE_GECODE))
139 set(FLEX_RegExLexer_OUTPUTS "")
140 set(BISON_RegExParser_OUTPUTS "")
141endif()
142
143add_library(minizinc_parser OBJECT
144 ${BISON_MZNParser_OUTPUTS}
145 ${FLEX_MZNLexer_OUTPUTS}
146 ${BISON_MZAParser_OUTPUTS}
147 ${FLEX_MZALexer_OUTPUTS}
148 ${BISON_RegExParser_OUTPUTS}
149 ${FLEX_RegExLexer_OUTPUTS}
150)
151
152if(GECODE_FOUND AND USE_GECODE)
153 target_include_directories(minizinc_parser PRIVATE "${GECODE_INCLUDE_DIRS}")
154 target_compile_definitions(minizinc_parser PRIVATE HAS_GECODE)
155endif()