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) set(FZL_TESTS TRUE) 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 if (NOT FZL_SKIP_C) 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_extern.c src/compiler/analyzer/an_externfn.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_ref.c src/compiler/analyzer/an_return.c src/compiler/analyzer/an_strfmt.c src/compiler/analyzer/an_struct.c src/compiler/analyzer/an_typedef.c src/compiler/analyzer/an_unarycond.c src/compiler/analyzer/an_unarymath.c src/compiler/generator/context.c src/compiler/generator/op.c src/compiler/generator/utility.c src/compiler/generator/gen_alias.c src/compiler/generator/gen_assign.c src/compiler/generator/gen_block.c src/compiler/generator/gen_break.c src/compiler/generator/gen_call.c src/compiler/generator/gen_class.c src/compiler/generator/gen_common.c src/compiler/generator/gen_compare.c src/compiler/generator/gen_condition.c src/compiler/generator/gen_construct.c src/compiler/generator/gen_declaration.c src/compiler/generator/gen_extern.c src/compiler/generator/gen_externfn.c src/compiler/generator/gen_field.c src/compiler/generator/gen_fmtstr.c src/compiler/generator/gen_fn.c src/compiler/generator/gen_handle.c src/compiler/generator/gen_identifier.c src/compiler/generator/gen_literal.c src/compiler/generator/gen_logical.c src/compiler/generator/gen_loop.c src/compiler/generator/gen_math.c src/compiler/generator/gen_reference.c src/compiler/generator/gen_return.c src/compiler/generator/gen_struct.c src/compiler/generator/gen_typedef.c src/compiler/generator/gen_unary_logical.c src/compiler/generator/gen_unary_math.c src/compiler/parser/utility.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_extern.c src/compiler/parser/pa_externfn.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_ref.c src/compiler/parser/pa_return.c src/compiler/parser/pa_statement.c src/compiler/parser/pa_struct.c src/compiler/parser/pa_term.c src/compiler/parser/pa_typedef.c src/compiler/parser/pa_unary.c src/compiler/parser/pa_while.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/writer/wr_consts.c src/compiler/writer/wr_extern_fns.c src/compiler/writer/wr_extern_libs.c src/compiler/writer/wr_extern_types.c src/compiler/writer/wr_ops.c src/compiler/fzl_analyzer.c src/compiler/fzl_debug.c src/compiler/fzl_gen.c src/compiler/fzl_parser.c src/compiler/fzl_reader.c src/compiler/fzl_token.c src/compiler/fzl_writer.c src/compiler/main.c) endif () # Virtual machine if (NOT FZL_SKIP_VM) add_executable(fz src/vm/handlers/group_and_or.c src/vm/handlers/group_cmp.c src/vm/handlers/group_ctx.c src/vm/handlers/group_flow.c src/vm/handlers/group_fn.c src/vm/handlers/group_math.c src/vm/handlers/group_not.c src/vm/handlers/group_obj.c src/vm/handlers/group_objcmp.c src/vm/handlers/group_stack.c src/vm/handlers/group_str.c src/vm/handlers/group_strcmp.c src/vm/handlers/master.c src/vm/reader/utility.c src/vm/reader/vm_rd_consts.c src/vm/reader/vm_rd_extern_fns.c src/vm/reader/vm_rd_extern_libs.c src/vm/reader/vm_rd_extern_types.c src/vm/reader/vm_rd_header.c src/vm/reader/vm_rd_ops.c src/vm/reader/vm_rd_sections_sz.c src/vm/fzl_vm.c src/vm/fzl_vm_env.c src/vm/fzl_vm_reader.c src/vm/fzl_vm_debug.c src/vm/main.c) target_link_libraries(fz PRIVATE ffi_static dl) endif () # # ========== Installtion =========== # if (NOT FZL_SKIP_C) install (TARGETS fzc RUNTIME DESTINATION bin) endif () if (NOT FZL_SKIP_VM) install (TARGETS fz RUNTIME DESTINATION bin) endif () # # ========== Tests ========== # if (FZL_TESTS) enable_testing() file(GLOB TEST_LIBS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "tests/libs/*.c") foreach (TEST_LIB IN LISTS TEST_LIBS) get_filename_component(LIB_NAME "${TEST_LIB}" NAME_WE) add_library("${LIB_NAME}" ${TEST_LIB}) endforeach () 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 () endif ()