cmake_minimum_required(VERSION 3.25) project(aplwc VERSION 0.0.1 LANGUAGES C ) set(CMAKE_C_STANDARD 90) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) add_library(common INTERFACE) target_include_directories(common INTERFACE "src/include" ) target_compile_options(common INTERFACE $<$: -O0 -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -DAPLWC_BUILD_TYPE_DEBUG > $<$: -O0 --coverage -fcondition-coverage -DAPLWC_BUILD_TYPE_COVERAGE -DNDEBUG > $<$: -DAPLWC_BUILD_TYPE_RELEASE > ) target_link_options(common INTERFACE $<$: -fsanitize=address,undefined > $<$: --coverage -fcondition-coverage > ) add_library(aplwc ${CMAKE_CURRENT_BINARY_DIR}/generated_headers/boot.h src/lib/eval.c src/lib/main.c src/lib/memory.c src/lib/module.c src/lib/string.c src/lib/syntax.c ) target_link_libraries(aplwc PRIVATE common) target_include_directories(aplwc PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/generated_headers/" ) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated_headers/boot.h" COMMAND xxd -i -n boot_src "${CMAKE_CURRENT_SOURCE_DIR}/src/lib/boot.aplwc" "${CMAKE_CURRENT_BINARY_DIR}/generated_headers/boot.h" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/lib/boot.aplwc" COMMENT "Generate boot.h from boot.aplwc" ) add_executable(aplwc-repl src/bin/main.c src/bin/util.c src/bin/wrappers.c ) target_link_libraries(aplwc-repl PRIVATE common aplwc) enable_testing() file(GLOB TEST_SOURCES CONFIGURE_DEPENDS "tests/*.c") foreach(source ${TEST_SOURCES}) get_filename_component(name "${source}" NAME_WE) set(test_bin "testbin-${name}") add_executable("${test_bin}" "${source}") target_link_libraries("${test_bin}" PRIVATE common aplwc) if("${name}" STREQUAL "aplwc_read" OR "${name}" STREQUAL "aplwc_eval") file(GLOB GOOD_INPUTS CONFIGURE_DEPENDS "tests/${name}/good/*.txt") file(GLOB BAD_INPUTS CONFIGURE_DEPENDS "tests/${name}/bad/*.txt") foreach(input ${GOOD_INPUTS}) add_test(NAME "${name} ${input}" COMMAND "${test_bin}" "${input}") endforeach() foreach(input ${BAD_INPUTS}) add_test(NAME "${name} ${input}" COMMAND "${test_bin}" "${input}") set_tests_properties("${name} ${input}" PROPERTIES WILL_FAIL TRUE ) endforeach() else() add_test(NAME "${name}" COMMAND "${test_bin}") endif() endforeach() file(GLOB TEST_SCRIPTS_GOOD CONFIGURE_DEPENDS "tests/scripts/good/*.aplwc") foreach(script ${TEST_SCRIPTS_GOOD}) add_test(NAME "${script}" COMMAND "${script}") set_tests_properties("${script}" PROPERTIES ENVIRONMENT "PATH=$" ) add_test(NAME "aplwc-repl ${script}" COMMAND "aplwc-repl" "${script}") set_tests_properties("aplwc-repl ${script}" PROPERTIES ENVIRONMENT "PATH=$" ) endforeach() file(GLOB TEST_SCRIPTS_BAD CONFIGURE_DEPENDS "tests/scripts/bad/*.aplwc") foreach(script ${TEST_SCRIPTS_BAD}) add_test(NAME "aplwc-repl ${script}" COMMAND "aplwc-repl" "${script}") set_tests_properties("aplwc-repl ${script}" PROPERTIES ENVIRONMENT "PATH=$" WILL_FAIL TRUE ) endforeach() add_test(NAME "aplwc-repl" COMMAND "aplwc-repl" "-x") set(REQUIRED_MALLOCS 3) foreach(i RANGE 0 ${REQUIRED_MALLOCS}) set(name "aplwc-repl-${i}-${REQUIRED_MALLOCS}") add_test(NAME "${name}" COMMAND "aplwc-repl" "-x") set_tests_properties("${name}" PROPERTIES ENVIRONMENT "APLWC_MALLOC_FAIL_AFTER=${i}" ) if(NOT i EQUAL ${REQUIRED_MALLOCS} AND NOT CMAKE_BUILD_TYPE STREQUAL "Release") set_tests_properties("${name}" PROPERTIES WILL_FAIL TRUE ) endif() endforeach()