Commit | Line | Data |
---|---|---|
684432ad | 1 | cmake_minimum_required(VERSION 3.5) |
878e6cda | 2 | project(lightrec LANGUAGES C VERSION 0.9) |
98fa08a5 | 3 | |
d16005f8 PC |
4 | list(APPEND LIGHTREC_SOURCES |
5 | blockcache.c | |
9259d748 | 6 | constprop.c |
d16005f8 PC |
7 | emitter.c |
8 | interpreter.c | |
9 | lightrec.c | |
10 | memmanager.c | |
11 | optimizer.c | |
12 | regcache.c | |
13 | ) | |
14 | list(APPEND LIGHTREC_HEADERS | |
15 | blockcache.h | |
9259d748 | 16 | constprop.h |
d16005f8 PC |
17 | debug.h |
18 | disassembler.h | |
19 | emitter.h | |
20 | interpreter.h | |
21 | lightrec-private.h | |
22 | lightrec.h | |
23 | memmanager.h | |
24 | optimizer.h | |
25 | recompiler.h | |
26 | regcache.h | |
27 | ) | |
28 | ||
878e6cda PC |
29 | add_library(lightrec ${LIGHTREC_SOURCES} ${LIGHTREC_HEADERS}) |
30 | set_target_properties(lightrec PROPERTIES | |
31 | VERSION ${PROJECT_VERSION} | |
32 | SOVERSION ${PROJECT_VERSION_MAJOR} | |
33 | PUBLIC_HEADER lightrec.h | |
34 | C_STANDARD 11 | |
35 | C_STANDARD_REQUIRED ON | |
36 | C_EXTENSIONS OFF | |
37 | ) | |
38 | ||
39 | set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries") | |
40 | if (NOT BUILD_SHARED_LIBS) | |
41 | target_compile_definitions(lightrec PRIVATE LIGHTREC_STATIC) | |
42 | endif (NOT BUILD_SHARED_LIBS) | |
43 | ||
44 | if (NOT LOG_LEVEL) | |
45 | set(LOG_LEVEL Info CACHE STRING "Log level" FORCE) | |
46 | set_property(CACHE LOG_LEVEL PROPERTY STRINGS NoLog Error Warning Info Debug) | |
47 | endif() | |
48 | ||
49 | if (NOT CMAKE_BUILD_TYPE) | |
50 | set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING | |
51 | "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." | |
52 | FORCE) | |
53 | set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS None Debug Release RelWithDebInfo MinSizeRel) | |
54 | endif() | |
55 | ||
56 | string(TOUPPER ${LOG_LEVEL} LIGHTREC_LOG_LEVEL) | |
57 | target_compile_definitions(lightrec PRIVATE LOG_LEVEL=${LIGHTREC_LOG_LEVEL}_L) | |
58 | ||
59 | if (CMAKE_COMPILER_IS_GNUCC) | |
60 | target_compile_options(lightrec PRIVATE -fvisibility=hidden) | |
61 | endif() | |
62 | ||
63 | set(HAS_DEFAULT_ELM ${CMAKE_COMPILER_IS_GNUCC}) | |
64 | ||
d16005f8 PC |
65 | option(ENABLE_FIRST_PASS "Run the interpreter as first-pass optimization" ON) |
66 | ||
a5a6f7b8 | 67 | option(ENABLE_THREADED_COMPILER "Enable threaded compiler" ON) |
d16005f8 | 68 | if (ENABLE_THREADED_COMPILER) |
878e6cda | 69 | target_sources(lightrec PRIVATE recompiler.c reaper.c) |
d16005f8 PC |
70 | |
71 | if (NOT ENABLE_FIRST_PASS) | |
72 | message(SEND_ERROR "Threaded compiler requires first-pass optimization") | |
73 | endif (NOT ENABLE_FIRST_PASS) | |
74 | endif (ENABLE_THREADED_COMPILER) | |
75 | ||
98fa08a5 PC |
76 | option(OPT_REMOVE_DIV_BY_ZERO_SEQ "(optimization) Remove div-by-zero check sequence" ON) |
77 | option(OPT_REPLACE_MEMSET "(optimization) Detect and replace memset with host variant" ON) | |
78 | option(OPT_DETECT_IMPOSSIBLE_BRANCHES "(optimization) Detect impossible branches" ON) | |
cb72ea13 | 79 | option(OPT_HANDLE_LOAD_DELAYS "(optimization) Detect load delays" ON) |
98fa08a5 PC |
80 | option(OPT_TRANSFORM_OPS "(optimization) Transform opcodes" ON) |
81 | option(OPT_LOCAL_BRANCHES "(optimization) Detect local branches" ON) | |
82 | option(OPT_SWITCH_DELAY_SLOTS "(optimization) Switch delay slots" ON) | |
cb72ea13 | 83 | option(OPT_FLAG_IO "(optimization) Flag I/O opcodes when the target can be detected" ON) |
98fa08a5 PC |
84 | option(OPT_FLAG_MULT_DIV "(optimization) Flag MULT/DIV that only use one of HI/LO" ON) |
85 | option(OPT_EARLY_UNLOAD "(optimization) Unload registers early" ON) | |
684432ad | 86 | option(OPT_PRELOAD_PC "(optimization) Preload PC value into register" ON) |
98fa08a5 | 87 | |
878e6cda | 88 | target_include_directories(lightrec PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) |
d16005f8 | 89 | |
98fa08a5 | 90 | if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") |
878e6cda | 91 | target_compile_options(lightrec PRIVATE -Wall) |
98fa08a5 PC |
92 | endif() |
93 | if (CMAKE_C_COMPILER_ID STREQUAL "Clang") | |
878e6cda | 94 | target_compile_options(lightrec PRIVATE -Wno-initializer-overrides) |
98fa08a5 PC |
95 | endif() |
96 | ||
d16005f8 | 97 | if (ENABLE_THREADED_COMPILER) |
878e6cda PC |
98 | include(FindThreads) |
99 | ||
100 | if (NOT CMAKE_USE_PTHREADS_INIT) | |
101 | message(SEND_ERROR "Could not find compatible threads library") | |
102 | endif() | |
d16005f8 | 103 | |
878e6cda | 104 | target_link_libraries(lightrec PUBLIC Threads::Threads) |
d16005f8 PC |
105 | endif (ENABLE_THREADED_COMPILER) |
106 | ||
9259d748 | 107 | option(ENABLE_CODE_BUFFER "Enable external code buffer" ON) |
02487de7 | 108 | if (ENABLE_CODE_BUFFER) |
878e6cda PC |
109 | target_sources(lightrec PRIVATE tlsf/tlsf.c) |
110 | target_include_directories(lightrec PRIVATE tlsf) | |
02487de7 PC |
111 | endif (ENABLE_CODE_BUFFER) |
112 | ||
d16005f8 PC |
113 | find_library(LIBLIGHTNING lightning REQUIRED) |
114 | find_path(LIBLIGHTNING_INCLUDE_DIR lightning.h REQUIRED) | |
115 | ||
878e6cda PC |
116 | target_include_directories(lightrec PUBLIC ${LIBLIGHTNING_INCLUDE_DIR}) |
117 | target_link_libraries(lightrec PUBLIC ${LIBLIGHTNING}) | |
d16005f8 PC |
118 | |
119 | if (LOG_LEVEL STREQUAL Debug) | |
d16005f8 | 120 | set(ENABLE_DISASSEMBLER ON) |
878e6cda | 121 | target_sources(lightrec PRIVATE disassembler.c) |
d16005f8 PC |
122 | endif() |
123 | ||
98fa08a5 | 124 | configure_file(lightrec-config.h.cmakein lightrec-config.h @ONLY) |
d16005f8 PC |
125 | |
126 | include(GNUInstallDirs) | |
878e6cda | 127 | install(TARGETS lightrec |
d16005f8 PC |
128 | ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
129 | LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |
130 | RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | |
131 | PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} | |
132 | ) |