diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..5351aaa08 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,387 @@ +cmake_minimum_required(VERSION 3.0) +project(re2c VERSION 1.3 HOMEPAGE_URL "https://re2c.org/") + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(Re2cAutotoolsHelpers) +include(Re2cBootstrapLexer) +include(Re2cBootstrapParser) +include(Re2cBootstrapCompiledHelp) +include(Re2cBootstrapManual) +include(Re2cTryCXXFlag) + +ac_subst(PACKAGE_VERSION "${PROJECT_VERSION}") + +option(RE2C_REBUILD_DOCS "Regenerate manpage" OFF) +if (RE2C_REBUILD_DOCS) + find_program(RST2MAN NAMES rst2man rst2man.py) + if (NOT RST2MAN) + message(FATAL_ERROR "need rst2man or rst2man.py for RE2C_REBUILD_DOCS=YES") + endif() +endif() + +option(RE2C_BUILD_LIBS "Build libraries" OFF) + +# checks for programs + +find_package(BISON) + +# checks for C++ compiler flags + +set(CMAKE_CXX_STANDARD 98) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) # make sure object libraries work with shared libraries +if(NOT CMAKE_BUILD_TYPE) + try_cxxflag("-O2") +endif() +try_cxxflag("-W") +try_cxxflag("-Wall") +try_cxxflag("-Wextra") +try_cxxflag("-Weffc++") +try_cxxflag("-pedantic") +try_cxxflag("-Wformat=2") +try_cxxflag("-Wredundant-decls") +try_cxxflag("-Wsuggest-attribute=format") +try_cxxflag("-Wconversion") +try_cxxflag("-Wsign-conversion") +try_cxxflag("-Werror=return-type") +try_cxxflag("-Weverything" + "-Wno-unknown-warning-option" # CLANG eats some GCC options only to warn they are unknown + "-Wno-reserved-id-macro" # to allow header guards of the form '_RE2C_PATH_TO_HEADER_BASENAME_' + "-Wno-padded" + "-Wno-old-style-cast" # RE2C-generated lexer has lots of C-syle casts because of 're2c:yych:conversion = 1;' + "-Wno-nested-anon-types" + "-Wno-global-constructors" # initialization of global constants with std::numeric_limits<...> (mostly for size_t) + "-Wno-shadow-field-in-constructor" # using same names in ctor seems more like a feature + "-Wno-undefined-func-template" # explicit specialization to reduce build dependencies +) + +# needed by src/c99_stdint.h +ac_check_headers("stdint.h") +# needed for POSIX file API +ac_check_headers("sys/types.h") +ac_check_headers("sys/stat.h") +ac_check_headers("fcntl.h") +ac_check_headers("unistd.h") +ac_check_headers("io.h") # windows POSIX-like API + +# list of possible types to use in typedefs +ac_check_sizeof("char") +ac_check_sizeof("short") +ac_check_sizeof("int") +ac_check_sizeof("long") +ac_check_sizeof("long long") +ac_check_sizeof("__int64") +# size of pointers +ac_check_sizeof("void *") +# 64-bit integer constant suffix +ac_check_sizeof("0l") +ac_check_sizeof("0ll") +ac_check_sizeof("0i8") + +set(top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}") +configure_file(doc/manpage.rst.in doc/manpage.rst @ONLY) +configure_file(doc/help.rst.in doc/help.rst @ONLY) + +configure_file(run_tests.sh.in run_tests.sh @ONLY) +if(CMAKE_HOST_UNIX) + execute_process(COMMAND chmod +x "${CMAKE_CURRENT_BINARY_DIR}/run_tests.sh") +endif() + +ac_config_headers("config.h") + +# Makefile.am +set(RE2C_STDLIB_DIR "${CMAKE_INSTALL_PREFIX}/share/re2c/stdlib") +add_compile_definitions("RE2C_STDLIB_DIR=\"${RE2C_STDLIB_DIR}\"") +add_compile_definitions($<$:RE2C_DEBUG>) +include_directories(. "${CMAKE_CURRENT_BINARY_DIR}") + +# sources +add_library(re2c_generated_ver_to_vernum OBJECT + "${CMAKE_CURRENT_BINARY_DIR}/src/msg/ver_to_vernum.cc" +) + +add_executable(re2c + src/codegen/bitmap.cc + src/codegen/emit_action.cc + src/codegen/emit_dfa.cc + src/codegen/label.cc + src/codegen/go_construct.cc + src/codegen/go_destruct.cc + src/codegen/go_emit.cc + src/codegen/go_used_labels.cc + src/codegen/input_api.cc + src/codegen/output.cc + src/codegen/print.cc + src/options/opt.cc + src/nfa/estimate_size.cc + src/nfa/re_to_nfa.cc + src/adfa/adfa.cc + src/adfa/prepare.cc + src/debug/dump_adfa.cc + src/debug/dump_cfg.cc + src/debug/dump_dfa.cc + src/debug/dump_dfa_tree.cc + src/debug/dump_interf.cc + src/debug/dump_nfa.cc + src/cfg/cfg.cc + src/cfg/compact.cc + src/cfg/dce.cc + src/cfg/freeze.cc + src/cfg/interfere.cc + src/cfg/liveanal.cc + src/cfg/normalize.cc + src/cfg/optimize.cc + src/cfg/rename.cc + src/cfg/varalloc.cc + src/dfa/closure.cc + src/dfa/dead_rules.cc + src/dfa/determinization.cc + src/dfa/fallback_tags.cc + src/dfa/fillpoints.cc + src/dfa/find_state.cc + src/dfa/minimization.cc + src/dfa/stacmd.cc + src/dfa/tagver_table.cc + src/dfa/tcmd.cc + src/encoding/ebcdic/ebcdic_regexp.cc + src/encoding/enc.cc + src/encoding/range_suffix.cc + src/encoding/utf8/utf8_regexp.cc + src/encoding/utf8/utf8.cc + src/encoding/utf16/utf16_regexp.cc + src/encoding/utf16/utf16.cc + src/msg/msg.cc + src/msg/warn.cc + src/regexp/ast_to_re.cc + src/regexp/default_tags.cc + src/regexp/fixed_tags.cc + src/regexp/nullable.cc + src/regexp/rule.cc + src/regexp/split_charset.cc + src/regexp/tag.cc + src/compile.cc + src/skeleton/control_flow.cc + src/skeleton/generate_code.cc + src/skeleton/generate_data.cc + src/skeleton/maxpath.cc + src/skeleton/skeleton.cc + src/parse/ast.cc + src/parse/input.cc + src/parse/normalize.cc + src/parse/scanner.cc + src/parse/unescape.cc + src/parse/validate.cc + src/util/get_dir.cc + src/util/s_to_n32_unsafe.cc + src/util/temp_file.cc + src/util/range.cc + src/main.cc + $ + "${CMAKE_CURRENT_BINARY_DIR}/src/parse/parser.cc" + "${CMAKE_CURRENT_BINARY_DIR}/src/parse/parser.h" + "${CMAKE_CURRENT_BINARY_DIR}/src/msg/help.cc" + "${CMAKE_CURRENT_BINARY_DIR}/src/parse/lex.cc" + "${CMAKE_CURRENT_BINARY_DIR}/src/parse/lex.h" + "${CMAKE_CURRENT_BINARY_DIR}/src/parse/lex_conf.cc" + "${CMAKE_CURRENT_BINARY_DIR}/src/options/parse_opts.cc" + "${CMAKE_CURRENT_BINARY_DIR}/doc/re2c.1" # include this so CMake generates it +) + +# target_include_directories(re2c PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/generated") + +re2c_bootstrap_lexer("src/parse/lex.re" "src/parse/lex.cc" "src/parse/lex.h") +re2c_bootstrap_lexer("src/parse/lex_conf.re" "src/parse/lex_conf.cc") +re2c_bootstrap_lexer("src/options/parse_opts.re" "src/options/parse_opts.cc") +re2c_bootstrap_lexer("src/msg/ver_to_vernum.re" "src/msg/ver_to_vernum.cc") +re2c_bootstrap_parser("src/parse/parser.ypp" "src/parse/parser.cc" "src/parse/parser.h") +re2c_bootstrap_compiled_help("${CMAKE_CURRENT_BINARY_DIR}/doc/help.rst" "src/msg/help.cc") +re2c_bootstrap_manual("${CMAKE_CURRENT_BINARY_DIR}/doc/manpage.rst" "doc/re2c.1") + +if (CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + if(UNIX) + install(TARGETS re2c) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/doc/re2c.1" DESTINATION "share/man/man1") + install(FILES include/unicode_categories.re DESTINATION "${RE2C_STDLIB_DIR}") + endif() + + if(RE2C_REBUILD_DOCS) + add_custom_target(docs DEPENDS + "${CMAKE_CURRENT_BINARY_DIR}/doc/re2c.1" + "${CMAKE_CURRENT_BINARY_DIR}/src/msg/help.cc" + ) + else() + add_custom_target(docs + COMMAND cmake -E echo "Reconfigure to rebuild docs: cmake -DRE2C_REBUILD_DOCS=YES" + COMMAND cmake -E false + ) + endif() + + # rebuild all re2c sources using newly built re2c + add_custom_target(bootstrap + COMMAND cmake -E remove_directory "src" + COMMAND cmake -E remove_directory "doc/re2c.1" + COMMAND cmake --build "${CMAKE_CURRENT_BINARY_DIR}" + ) + + # tests + add_custom_target(tests + DEPENDS run_tests.sh + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + COMMAND "${CMAKE_CURRENT_BINARY_DIR}/run_tests.sh" + ) + add_dependencies(tests re2c) + add_custom_target(vtests + DEPENDS run_tests.sh + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + COMMAND "${CMAKE_CURRENT_BINARY_DIR}/run_tests.sh" --valgrind + ) + add_dependencies(vtests re2c) + add_custom_target(wtests + DEPENDS run_tests.sh + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + COMMAND "${CMAKE_CURRENT_BINARY_DIR}/run_tests.sh" --wine -j1 + ) + add_dependencies(wtests re2c) + + add_executable(re2c_test_range + src/test/range/test-impl.h + src/test/range/test.cc + src/test/range/test.h + src/util/range.cc + src/util/range.h + src/util/static_assert.h + ) + add_executable(re2c_test_s_to_n32_unsafe + src/test/s_to_n32_unsafe/test.cc + src/util/s_to_n32_unsafe.cc + ) + add_executable(re2c_test_ver_to_vernum + src/test/ver_to_vernum/test.cc + $ + ) + + add_custom_target(check + COMMAND ./re2c_test_range + COMMAND ./re2c_test_s_to_n32_unsafe + COMMAND ./re2c_test_ver_to_vernum + ) + add_dependencies(check tests re2c_test_range re2c_test_s_to_n32_unsafe re2c_test_ver_to_vernum) +endif() + +if (RE2C_BUILD_LIBS) + add_library(libre2c_objects OBJECT + lib/regcomp.cc + lib/regexec.cc + lib/regexec_dfa.cc + lib/regexec_nfa_leftmost.cc + lib/regexec_nfa_leftmost_trie.cc + lib/regexec_nfa_posix.cc + lib/regexec_nfa_posix_trie.cc + lib/regexec_nfa_posix_backward.cc + lib/regexec_nfa_posix_kuklewicz.cc + lib/regfree.cc + lib/stubs.cc + src/parse/ast.cc + src/parse/unescape.cc + src/options/opt.cc + src/cfg/cfg.cc + src/cfg/compact.cc + src/cfg/dce.cc + src/cfg/freeze.cc + src/cfg/interfere.cc + src/cfg/liveanal.cc + src/cfg/normalize.cc + src/cfg/optimize.cc + src/cfg/rename.cc + src/cfg/varalloc.cc + src/dfa/closure.cc + src/debug/dump_adfa.cc + src/debug/dump_cfg.cc + src/debug/dump_dfa.cc + src/debug/dump_dfa_tree.cc + src/debug/dump_interf.cc + src/debug/dump_nfa.cc + src/dfa/dead_rules.cc + src/dfa/determinization.cc + src/dfa/fallback_tags.cc + src/dfa/fillpoints.cc + src/dfa/find_state.cc + src/dfa/minimization.cc + src/dfa/stacmd.cc + src/dfa/tagver_table.cc + src/dfa/tcmd.cc + src/nfa/estimate_size.cc + src/nfa/re_to_nfa.cc + src/encoding/enc.cc + src/encoding/range_suffix.cc + src/encoding/ebcdic/ebcdic_regexp.cc + src/encoding/utf16/utf16.cc + src/encoding/utf16/utf16_regexp.cc + src/encoding/utf8/utf8.cc + src/encoding/utf8/utf8_regexp.cc + src/msg/msg.cc + src/msg/warn.cc + src/regexp/ast_to_re.cc + src/regexp/default_tags.cc + src/regexp/fixed_tags.cc + src/regexp/nullable.cc + src/regexp/rule.cc + src/regexp/split_charset.cc + src/regexp/tag.cc + src/skeleton/control_flow.cc + src/skeleton/maxpath.cc + src/skeleton/skeleton.cc + src/util/range.cc + src/util/s_to_n32_unsafe.cc + "${CMAKE_CURRENT_BINARY_DIR}/lib/lex.cc" + "${CMAKE_CURRENT_BINARY_DIR}/lib/parse.cc" + ) + set(libre2c_sources $ $) + + # build shared libraries + if ((NOT DEFINED BUILD_SHARED_LIBS) OR BUILD_SHARED_LIBS) + add_library(libre2c_shared SHARED ${libre2c_sources}) + set_target_properties(libre2c_shared PROPERTIES OUTPUT_NAME "re2c") + if (UNIX) + install(TARGETS libre2c_shared) + endif() + endif() + + # build static libraries + if ((NOT DEFINED BUILD_SHARED_LIBS) OR (NOT BUILD_SHARED_LIBS)) + add_library(libre2c_static STATIC ${libre2c_sources}) + if (UNIX) + set_target_properties(libre2c_static PROPERTIES OUTPUT_NAME "re2c") + install(TARGETS libre2c_static) + else() + set_target_properties(libre2c_static PROPERTIES OUTPUT_NAME "re2c_static") + endif() + endif() + + # define top-level aliases to either static or shared libraries (default is static) + if (BUILD_SHARED_LIBS) + add_library(libre2c ALIAS libre2c_shared) + else() + add_library(libre2c ALIAS libre2c_static) + endif() + + re2c_bootstrap_lexer("lib/lex.re" "lib/lex.cc") + re2c_bootstrap_parser("lib/parse.ypp" "lib/parse.cc" "lib/parse.h") + + add_executable(test_libre2c lib/test.cc) + target_link_libraries(test_libre2c libre2c) + + # check_PROGRAMS += test_libre2c // TODO + + add_executable(bench_libre2c lib/bench.cc) + set_property(TARGET bench_libre2c PROPERTY CXX_STANDARD 11) + target_link_libraries(bench_libre2c libre2c) + + find_path(RE2_INCLUDE_DIRECTORY "re2/re2.h") + find_library(RE2_LIBRARY "re2") + if (RE2_INCLUDE_DIRECTORY AND RE2_LIBRARY) + target_compile_definitions(bench_libre2c PRIVATE "HAVE_RE2_RE_H=1") + target_include_directories(bench_libre2c PRIVATE "${RE2_INCLUDE_DIRECTORY}") + target_link_libraries(bench_libre2c "${RE2_LIBRARY}") + endif() +endif() diff --git a/cmake/Re2cAutotoolsHelpers.cmake b/cmake/Re2cAutotoolsHelpers.cmake new file mode 100644 index 000000000..2aa215fff --- /dev/null +++ b/cmake/Re2cAutotoolsHelpers.cmake @@ -0,0 +1,47 @@ +set(__ac_config_content "") + +function(ac_subst name) + if(ARGN) + set(__ac_config_content "#define ${name} \"${ARGN}\"\n\n" PARENT_SCOPE) + else() + set(__ac_config_content "#define ${name} \"${${name}}\"\n\n" PARENT_SCOPE) + endif() +endfunction() + +include(CheckIncludeFile) +function(ac_check_headers header) + set(varname "HAVE_${header}") + string(REGEX REPLACE "[^A-Za-z0-9]" "_" varname "${varname}") + string(TOUPPER "${varname}" varname) + check_include_file("${header}" "${varname}") + if(${varname}) + set(__ac_config_content "${__ac_config_content}#define ${varname} 1\n\n" PARENT_SCOPE) + endif() +endfunction() + +include(CheckTypeSize) +function(ac_check_sizeof type) + set(varname "SIZEOF_${type}") + string(REPLACE "*" "P" varname "${varname}") + string(REPLACE "[^A-Za-z0-9]" "_" varname "${varname}") + string(REPLACE " " "_" varname "${varname}") + string(TOUPPER "${varname}" varname) + check_type_size("${type}" "${varname}") + if(${varname}) + set(__ac_config_content "${__ac_config_content}#define ${varname} ${${varname}}\n\n" PARENT_SCOPE) + endif() +endfunction() + +function(ac_config_headers name) + if (__ac_config_content STREQUAL "") + message(FATAL_ERROR "ac_config_headers called, but __ac_config_content is empty") + endif() + + if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${name}") + file(READ "${CMAKE_CURRENT_BINARY_DIR}/${name}" config_h_content) + endif() + if (NOT "${config_h_content}" STREQUAL "${__ac_config_content}") + message(STATUS "Writing ${name}") + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${name}" "${__ac_config_content}") + endif() +endfunction() diff --git a/cmake/Re2cBootstrapCompiledHelp.cmake b/cmake/Re2cBootstrapCompiledHelp.cmake new file mode 100644 index 000000000..d618c5a2c --- /dev/null +++ b/cmake/Re2cBootstrapCompiledHelp.cmake @@ -0,0 +1,25 @@ +function(re2c_bootstrap_compiled_help rst_file cc_file) + if (NOT IS_ABSOLUTE "${rst_file}") + set(rst_file "${CMAKE_CURRENT_SOURCE_DIR}/${rst_file}") + endif() + + get_filename_component(parent_dir "${cc_file}" DIRECTORY) + if(RE2C_REBUILD_DOCS) + add_custom_command( + OUTPUT "${cc_file}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${parent_dir}" + COMMAND "${RST2MAN}" "${rst_file}" > "${cc_file}.1" + COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/genhelp.sh" "${cc_file}.1" "${cc_file}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${cc_file}" "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${cc_file}" + MAIN_DEPENDENCY "${rst_file}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/genhelp.sh" + ) + else() + add_custom_command( + OUTPUT "${cc_file}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${parent_dir}" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${cc_file}" "${cc_file}" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${cc_file}" + ) + endif() +endfunction() diff --git a/cmake/Re2cBootstrapLexer.cmake b/cmake/Re2cBootstrapLexer.cmake new file mode 100644 index 000000000..e95315408 --- /dev/null +++ b/cmake/Re2cBootstrapLexer.cmake @@ -0,0 +1,55 @@ +if (CMAKE_CURRENT_LIST_FILE STREQUAL CMAKE_SCRIPT_MODE_FILE) + get_filename_component(parent_dir "${cc_file}" DIRECTORY) + file(RELATIVE_PATH relative_re_file "${CMAKE_CURRENT_BINARY_DIR}" "${source_dir}/${re_file}") + + file(MAKE_DIRECTORY "${parent_dir}") + if (EXISTS "${re2c}") + execute_process( + COMMAND "${re2c}" -br -W "${relative_re_file}" -o "${cc_file}" + RESULT_VARIABLE ret + ) + if (NOT ret EQUAL 0) + message(FATAL_ERROR "Failure running re2c: got exit status ${ret}") + endif() + file(COPY "${cc_file}" DESTINATION "${source_dir}/bootstrap/${parent_dir}") + if (NOT "${h_file}" STREQUAL "") + file(COPY "${h_file}" DESTINATION "${source_dir}/bootstrap/${parent_dir}") + endif() + else() + file(COPY "${source_dir}/bootstrap/${cc_file}" DESTINATION "${parent_dir}") + if (NOT "${h_file}" STREQUAL "") + file(COPY "${source_dir}/bootstrap/${h_file}" DESTINATION "${parent_dir}") + endif() + endif() + + return() +endif() + +set(__re2c_bootstrap_lexer_cmake "${CMAKE_CURRENT_LIST_FILE}") + +function(re2c_bootstrap_lexer re_file cc_file) + set(h_file "${ARGN}") + set(outputs) + list(APPEND outputs "${cc_file}") + if(h_file) + list(APPEND outputs "${h_file}") + endif() + if(NOT TARGET re2c) + message(FATAL_ERROR "'re2c' is not a valid target") + endif() + add_custom_command( + OUTPUT ${outputs} + COMMAND + "${CMAKE_COMMAND}" + -Dsource_dir="${CMAKE_CURRENT_SOURCE_DIR}" + -Dre_file="${re_file}" -Dcc_file="${cc_file}" -Dh_file="${h_file}" + # Avoid $, because that adds a dependency on re2c, + # which causes CMake to error if we put this into an object library, + # which we need to have libre2c built from bootstrap too + -Dre2c="${CMAKE_CURRENT_BINARY_DIR}/re2c${CMAKE_EXECUTABLE_SUFFIX}" + -P "${__re2c_bootstrap_lexer_cmake}" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/${re_file}" + DEPENDS "${__re2c_bootstrap_lexer_cmake}" + ) +endfunction() diff --git a/cmake/Re2cBootstrapManual.cmake b/cmake/Re2cBootstrapManual.cmake new file mode 100644 index 000000000..c2167bb02 --- /dev/null +++ b/cmake/Re2cBootstrapManual.cmake @@ -0,0 +1,23 @@ +function(re2c_bootstrap_manual rst_file man_file) + if (NOT IS_ABSOLUTE "${rst_file}") + set(rst_file "${CMAKE_CURRENT_SOURCE_DIR}/${rst_file}") + endif() + + get_filename_component(parent_dir "${man_file}" DIRECTORY) + if(RE2C_REBUILD_DOCS) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${man_file}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${parent_dir}" + COMMAND "${RST2MAN}" "${rst_file}" > "${man_file}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${man_file}" "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${man_file}" + MAIN_DEPENDENCY "${rst_file}" + ) + else() + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${man_file}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${parent_dir}" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${man_file}" "${man_file}" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${man_file}" + ) + endif() +endfunction() diff --git a/cmake/Re2cBootstrapParser.cmake b/cmake/Re2cBootstrapParser.cmake new file mode 100644 index 000000000..30f470091 --- /dev/null +++ b/cmake/Re2cBootstrapParser.cmake @@ -0,0 +1,25 @@ +function(re2c_bootstrap_parser ypp_file cc_file h_file) + get_filename_component(parent_dir "${cc_file}" DIRECTORY) + file(RELATIVE_PATH relative_ypp_file "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/${ypp_file}") + + if (BISON_EXECUTABLE) + add_custom_command( + OUTPUT ${cc_file} ${h_file} + COMMAND "${CMAKE_COMMAND}" -E make_directory "${parent_dir}" + COMMAND "${BISON_EXECUTABLE}" --defines="${h_file}" -o "${cc_file}" "${relative_ypp_file}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${cc_file}" "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${cc_file}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${h_file}" "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${h_file}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${ypp_file}" + ) + else() + add_custom_command( + OUTPUT ${cc_file} ${h_file} + COMMAND "${CMAKE_COMMAND}" -E make_directory "${parent_dir}" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${cc_file}" "${parent_dir}" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${h_file}" "${parent_dir}" + DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${cc_file}" + "${CMAKE_CURRENT_SOURCE_DIR}/bootstrap/${h_file}" + ) + endif() +endfunction() diff --git a/cmake/Re2cTryCXXFlag.cmake b/cmake/Re2cTryCXXFlag.cmake new file mode 100644 index 000000000..6df5d90d7 --- /dev/null +++ b/cmake/Re2cTryCXXFlag.cmake @@ -0,0 +1,17 @@ +include(CheckCXXCompilerFlag) +# Iff C++ compiler recognizes 'flag', append 'flag' and 'implied-flags' to CXXFLAGSDEFAULT +# (Second param 'implied-flags' is needed for warning suppressions '-Wno-': +# GCC warns about unrecognized suppressions options only in presence of other warnings, +# which makes it hard to test for them with autoconf.) +function(try_cxxflag flag) + set(varname "cxxflag_${flag}") + string(REPLACE "=" "_" varname "${varname}") + check_cxx_compiler_flag("${flag}" ${varname}) + if(${varname}) + set(CMAKE_CXX_FLAGS "${flag} ${CMAKE_CXX_FLAGS}") + foreach(implied_flag IN LISTS ARGN) + set(CMAKE_CXX_FLAGS "${implied_flag} ${CMAKE_CXX_FLAGS}") + endforeach() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE) + endif() +endfunction()