cmake_minimum_required(VERSION 3.16) project(fz-lang LANGUAGES C) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) add_compile_options(-Wall -Wextra -Werror=implicit-function-declaration) if (CMAKE_BUILD_TYPE STREQUAL "Debug") add_compile_options(-fsanitize=address,undefined -g) add_link_options(-fsanitize=address,undefined) endif() include_directories(include) include(FetchContent) # --- libffi --- set(PREV_SUPPRESS_DEV ${CMAKE_SUPPRESS_DEVELOPER_WARNINGS}) set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS TRUE CACHE INTERNAL "") FetchContent_Declare(ffi GIT_REPOSITORY "https://git.samsonium.dev/samsonium/libffi.git" GIT_TAG "main" ) FetchContent_MakeAvailable(ffi) set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ${PREV_SUPPRESS_DEV} CACHE INTERNAL "") # -------------- # Compiler add_executable(fzc src/compiler/utils/fzl_const_pool.c src/compiler/utils/fzl_symtable.c src/compiler/utils/fzl_linked.c src/compiler/utils/fzl_options.c src/compiler/utils/fzl_ctable.c src/compiler/analyzer/utility.c src/compiler/analyzer/context.c src/compiler/analyzer/an_assign.c src/compiler/analyzer/an_binmath.c src/compiler/analyzer/an_block.c src/compiler/analyzer/an_break.c src/compiler/analyzer/an_call.c src/compiler/analyzer/an_class.c src/compiler/analyzer/an_common.c src/compiler/analyzer/an_condition.c src/compiler/analyzer/an_conditional.c src/compiler/analyzer/an_construct.c src/compiler/analyzer/an_declaration.c src/compiler/analyzer/an_field.c src/compiler/analyzer/an_function.c src/compiler/analyzer/an_identifier.c src/compiler/analyzer/an_loop.c src/compiler/analyzer/an_return.c src/compiler/analyzer/an_strfmt.c src/compiler/analyzer/an_unarycond.c src/compiler/analyzer/an_unarymath.c src/compiler/parser/pa_and.c src/compiler/parser/pa_assignment.c src/compiler/parser/pa_block.c src/compiler/parser/pa_break.c src/compiler/parser/pa_class.c src/compiler/parser/pa_cond.c src/compiler/parser/pa_expression.c src/compiler/parser/pa_factor.c src/compiler/parser/pa_for.c src/compiler/parser/pa_function.c src/compiler/parser/pa_if.c src/compiler/parser/pa_loop.c src/compiler/parser/pa_new.c src/compiler/parser/pa_or.c src/compiler/parser/pa_postfix.c src/compiler/parser/pa_power.c src/compiler/parser/pa_primary.c src/compiler/parser/pa_program.c src/compiler/parser/pa_return.c src/compiler/parser/pa_statement.c src/compiler/parser/pa_term.c src/compiler/parser/pa_unary.c src/compiler/parser/pa_while.c src/compiler/parser/utility.c src/compiler/reader/rd_fmtstr.c src/compiler/reader/rd_name.c src/compiler/reader/rd_number.c src/compiler/reader/rd_string_literal.c src/compiler/reader/utility.c src/compiler/fzl_analyzer.c src/compiler/fzl_debug.c src/compiler/fzl_parser.c src/compiler/fzl_reader.c src/compiler/fzl_token.c src/compiler/fzl_walker.c src/compiler/fzl_writer.c src/compiler/main.c) # Virtual machine add_executable(fz src/vm/fzl_vm.c src/vm/fzl_vm_env.c src/vm/fzl_vm_debug.c src/vm/main.c) target_link_libraries(fz PRIVATE ffi_static dl) # # ========== Tests ========== # enable_testing() file(GLOB TEST_PROGS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "tests/programs/*.fzs") foreach (TEST_FILE IN LISTS TEST_PROGS) get_filename_component(TEST_NAME "${TEST_FILE}" NAME_WE) add_test( NAME "progs_compile_${TEST_NAME}" COMMAND fzc -o "${CMAKE_CURRENT_BINARY_DIR}/p_${TEST_NAME}.fzb" "${CMAKE_CURRENT_SOURCE_DIR}/${TEST_FILE}" ) add_test( NAME "progs_runtime_${TEST_NAME}" COMMAND fz "${CMAKE_CURRENT_BINARY_DIR}/p_${TEST_NAME}.fzb" ) if (TEST_NAME MATCHES "neg_") set_tests_properties("progs_compile_${TEST_NAME}" PROPERTIES WILL_FAIL TRUE) set_tests_properties("progs_runtime_${TEST_NAME}" PROPERTIES WILL_FAIL TRUE) endif() if (TEST_NAME MATCHES "negr_") set_tests_properties("progs_runtime_${TEST_NAME}" PROPERTIES WILL_FAIL TRUE) endif() endforeach()