cmake_minimum_required(VERSION 3.22) project(BFBCompiler C) add_custom_command( OUTPUT ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h # COMMAND bison -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c) COMMAND bison -Wcounterexamples -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c) # COMMAND bison -t -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c) if (CMAKE_C_COMPILER_ID STREQUAL "GNU") message(NOTICE "El compilador de C es GCC.") add_compile_options(-static-libgcc) add_compile_options(-std=gnu99) add_compile_options(-O3) add_custom_command( OUTPUT ../src/frontend/lexical-analysis/flex-scanner.c COMMAND flex -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h) # COMMAND flex --debug -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC") message(NOTICE "El compilador de C es Microsoft Visual Studio.") add_custom_command( OUTPUT ../src/frontend/lexical-analysis/flex-scanner.c COMMAND flex --wincompat -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h) else () message(NOTICE "El compilador de C es desconocido.") message(NOTICE "No se generarĂ¡ el scanner con Flex.") endif () add_executable(BFBCompiler src/main.c src/backend/code-generation/generator.c src/backend/domain-specific/calculator.c src/backend/support/logger.c src/frontend/lexical-analysis/flex-actions.c src/frontend/lexical-analysis/flex-scanner.c src/frontend/syntactic-analysis/bison-actions.c src/frontend/syntactic-analysis/bison-parser.c) include(CheckFunctionExists) check_function_exists(pow POW_FUNCTION_EXISTS) # check_symbol_exists(pow "math.h" POW_FUNCTION_EXISTS) if (NOT POW_FUNCTION_EXISTS) target_link_libraries(BFBCompiler m) else () target_link_libraries(BFBCompiler) endif () file(GLOB_RECURSE correct_use_cases "doc/examples/correct/use-case-*.b" ) file(GLOB_RECURSE incorrect_use_cases "doc/examples/incorrect/use-case-*.b" ) enable_testing() foreach(test ${correct_use_cases}) add_test(NAME ${test} COMMAND ${CMAKE_SOURCE_DIR}/run.sh ${test} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) endforeach() foreach(test ${incorrect_use_cases}) add_test(NAME ${test} COMMAND ${CMAKE_SOURCE_DIR}/run.sh ${test} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) set_tests_properties(${test} PROPERTIES WILL_FAIL TRUE) endforeach()