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