1add_custom_target(gen) 2set(gen_count 1) 3 4function(bison_target_or_gen grammar) 5 get_filename_component(directory "${grammar}" DIRECTORY) 6 get_filename_component(filename "${grammar}" NAME_WE) 7 get_filename_component(extension "${grammar}" EXT) 8 set(gen_path "${CMAKE_CURRENT_SOURCE_DIR}/gen/${directory}/${filename}") 9 set(bin_path "${CMAKE_CURRENT_BINARY_DIR}/${directory}/${filename}") 10 file(MAKE_DIRECTORY "${bin_path}") 11 if(BISON_FOUND) 12 bison_target("${filename}" "${CMAKE_CURRENT_SOURCE_DIR}/${grammar}" "${bin_path}/grammar.cc") 13 if(MSVC) 14 set_source_files_properties("${BISON_${filename}_OUTPUT_SOURCE}" 15 PROPERTIES COMPILE_FLAGS "/wd4267 /wd4065") 16 endif() 17 set("BISON_${filename}_OUTPUT_SOURCE" "${BISON_${filename}_OUTPUT_SOURCE}" PARENT_SCOPE) 18 set("BISON_${filename}_OUTPUTS" ${BISON_${filename}_OUTPUTS} PARENT_SCOPE) 19 # add to gen target 20 add_custom_target("gen${gen_count}" DEPENDS "${bin_path}/grammar.cc") 21 add_dependencies(gen "gen${gen_count}") 22 math(EXPR gen_count "${gen_count}+1") 23 set(gen_count "${gen_count}" PARENT_SCOPE) 24 elseif (EXISTS "${gen_path}") 25 file(COPY "${gen_path}/" DESTINATION "${bin_path}" FILES_MATCHING PATTERN "*.*") 26 set("BISON_${filename}_OUTPUT_SOURCE" "${bin_path}/grammar.cc" PARENT_SCOPE) 27 set("BISON_${filename}_OUTPUTS" "${bin_path}/grammar.cc" "${bin_path}/grammar.hh" PARENT_SCOPE) 28 else() 29 message(FATAL_ERROR "bison parser generator required but not found") 30 endif() 31endfunction() 32 33function(re2c_target_or_gen grammar) 34 get_filename_component(directory "${grammar}" DIRECTORY) 35 get_filename_component(filename "${grammar}" NAME_WE) 36 get_filename_component(extension "${grammar}" EXT) 37 set(bin_path "${CMAKE_CURRENT_BINARY_DIR}/${directory}") 38 set(gen_path "${CMAKE_CURRENT_SOURCE_DIR}/gen/${directory}") 39 file(MAKE_DIRECTORY "${bin_path}") 40 if(RE2C_FOUND) 41 if (extension STREQUAL ".xch") 42 re2c_target(NAME ${filename} INPUT "${CMAKE_CURRENT_SOURCE_DIR}/${grammar}" OUTPUT "${bin_path}/${filename}.hh" OPTIONS -c) 43 else() 44 re2c_target(NAME ${filename} INPUT "${CMAKE_CURRENT_SOURCE_DIR}/${grammar}" OUTPUT "${bin_path}/${filename}.hh") 45 endif() 46 set("RE2C_${filename}_OUTPUT" ${RE2C_${filename}_OUTPUT} PARENT_SCOPE) 47 # add to gen target 48 add_custom_target("gen${gen_count}" DEPENDS "${bin_path}/${filename}.hh") 49 add_dependencies(gen "gen${gen_count}") 50 math(EXPR gen_count "${gen_count}+1") 51 set(gen_count "${gen_count}" PARENT_SCOPE) 52 elseif (EXISTS "${gen_path}/${filename}.hh") 53 file(COPY "${gen_path}/${filename}.hh" DESTINATION "${bin_path}") 54 set("RE2C_${filename}_OUTPUT" "${bin_path}/${filename}.hh" PARENT_SCOPE) 55 else() 56 message(FATAL_ERROR "re2c lexer generator required but not found") 57 endif() 58endfunction() 59