ACPI AML decompiler w/ CFG recovery and structured pseudocode
1cmake_minimum_required(VERSION 3.16)
2project(tobi VERSION 0.1.0 LANGUAGES C)
3
4option(TOBI_WERROR "Build with warnings as errors" ON)
5option(TOBI_SAN "Build with AddressSanitizer and UndefinedBehaviorSanitizer" OFF)
6option(TOBI_FZ "Build fuzz smoke target" ON)
7option(TOBI_LIBFUZZER "Build LLVM libFuzzer target" OFF)
8
9set(CMAKE_C_STANDARD 11)
10set(CMAKE_C_STANDARD_REQUIRED ON)
11set(CMAKE_C_EXTENSIONS OFF)
12
13set(TOBI_COMMON
14 src/rd.c src/p.c src/op.c src/nm.c src/ir.c src/cf.c src/dc.c
15 src/da.c src/dg.c src/js.c src/mem.c src/str.c)
16
17find_program(CLANG_FORMAT_EXE NAMES clang-format)
18if(CLANG_FORMAT_EXE)
19 file(GLOB TOBI_FORMAT_FILES CONFIGURE_DEPENDS
20 src/*.c src/*.h test/*.c test/*.h fuzz/*.c)
21 add_custom_target(format
22 COMMAND ${CLANG_FORMAT_EXE} -i ${TOBI_FORMAT_FILES}
23 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
24 COMMENT "Format tobi C sources")
25endif()
26
27add_library(tobilib ${TOBI_COMMON})
28target_include_directories(tobilib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
29target_compile_definitions(tobilib PUBLIC _POSIX_C_SOURCE=200809L)
30
31add_executable(tobi src/main.c)
32target_link_libraries(tobi PRIVATE tobilib)
33target_compile_definitions(tobi PRIVATE TOBI_VERSION="${PROJECT_VERSION}")
34
35set(TOBI_WARN -Wall -Wextra -Wpedantic)
36if(TOBI_WERROR)
37 list(APPEND TOBI_WARN -Werror)
38endif()
39target_compile_options(tobilib PRIVATE ${TOBI_WARN})
40target_compile_options(tobi PRIVATE ${TOBI_WARN})
41
42if(TOBI_SAN)
43 set(SAN_FLAGS -fsanitize=address,undefined -fno-omit-frame-pointer)
44 target_compile_definitions(tobilib PUBLIC TOBI_SAN_BUILD=1)
45 target_compile_options(tobilib PRIVATE ${SAN_FLAGS})
46 target_compile_options(tobi PRIVATE ${SAN_FLAGS})
47 target_link_options(tobi PRIVATE ${SAN_FLAGS})
48 target_link_options(tobilib INTERFACE ${SAN_FLAGS})
49endif()
50
51enable_testing()
52
53add_executable(tobi_test
54 test/main.c test/t_rd.c test/t_nm.c test/t_p.c test/t_ir.c
55 test/t_cf.c test/t_da.c test/t_dc.c test/t_js.c test/t_bad.c test/t_cli.c
56 test/t_prod.c test/t_corpus.c test/t_snap.c)
57target_link_libraries(tobi_test PRIVATE tobilib)
58target_compile_options(tobi_test PRIVATE ${TOBI_WARN})
59target_compile_definitions(tobi_test PRIVATE
60 TOBI_BIN="$<TARGET_FILE:tobi>"
61 TOBI_SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
62if(TOBI_SAN)
63 target_compile_options(tobi_test PRIVATE ${SAN_FLAGS})
64 target_link_options(tobi_test PRIVATE ${SAN_FLAGS})
65endif()
66
67foreach(t rd nm p ir cf da dc js bad cli prod corpus snap)
68 add_test(NAME ${t} COMMAND tobi_test ${t})
69endforeach()
70
71if(TOBI_FZ)
72 add_executable(fz fuzz/fz.c)
73 target_link_libraries(fz PRIVATE tobilib)
74 target_compile_options(fz PRIVATE ${TOBI_WARN})
75 target_compile_definitions(fz PRIVATE TOBI_SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
76 if(TOBI_SAN)
77 target_compile_options(fz PRIVATE ${SAN_FLAGS})
78 target_link_options(fz PRIVATE ${SAN_FLAGS})
79 endif()
80endif()
81
82if(TOBI_LIBFUZZER)
83 set(LIBFUZZER_COMPILE_FLAGS -fsanitize=fuzzer-no-link,address,undefined -fno-omit-frame-pointer)
84 target_compile_definitions(tobilib PUBLIC TOBI_SAN_BUILD=1)
85 target_compile_options(tobilib PRIVATE ${LIBFUZZER_COMPILE_FLAGS})
86 add_executable(fz_llvm fuzz/lf.c)
87 target_link_libraries(fz_llvm PRIVATE tobilib)
88 target_compile_options(fz_llvm PRIVATE ${TOBI_WARN} -fsanitize=fuzzer,address,undefined -fno-omit-frame-pointer)
89 target_link_options(fz_llvm PRIVATE -fsanitize=fuzzer,address,undefined -fno-omit-frame-pointer)
90endif()