-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
148 lines (124 loc) · 4.14 KB
/
CMakeLists.txt
File metadata and controls
148 lines (124 loc) · 4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
cmake_minimum_required(VERSION 3.20)
project(my_compiler CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
# -- 定义核心编译器/VM 的源文件 (不包含 ffi_api.cpp 和 main.cpp) --
set(CORE_SOURCES
front/alphaBet.cpp
front/lexer.cpp
front/token.cpp
front/productionRule.cpp
front/grammarSymbol.cpp
front/grammar.cpp
front/lrItem.cpp
front/lrParserGenerator.cpp
front/lrState.cpp
front/predefineSymbol.cpp
front/parser.cpp
ir/irInstruction.cpp
ir/irProgram.cpp
ir/vmCodeGenerator.cpp
regluarExpression/regEx.cpp
regluarExpression/regExParser.cpp
regluarExpression/regExNode.cpp
regluarExpression/regExCharNode.cpp
regluarExpression/regExCharSetNode.cpp
regluarExpression/regExAlternationNode.cpp
regluarExpression/regExConcatenationNode.cpp
regluarExpression/regExKleeneStarNode.cpp
regluarExpression/regExPlusNode.cpp
regluarExpression/regExOptionalNode.cpp
ast/astNode.cpp
ast/expressionNode.cpp
ast/binaryOpNode.cpp
ast/identifierNode.cpp
ast/intergerLiteralNode.cpp
state/dfaState.cpp
state/dfaStateMachine.cpp
state/nfaState.cpp
state/nfaStateFragment.cpp
vm/virtualMachine.cpp
vm/instruction.cpp
workShop.cpp
)
# -- 1. 创建核心静态库 --
# 这个库包含所有编译器和VM的内部实现
add_library(cpl_core STATIC ${CORE_SOURCES})
target_include_directories(cpl_core PUBLIC
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/regluarExpression
${PROJECT_SOURCE_DIR}/ast
${PROJECT_SOURCE_DIR}/state
${PROJECT_SOURCE_DIR}/vm
${PROJECT_SOURCE_DIR}/front
${PROJECT_SOURCE_DIR}/ir
)
# -- 2. 为 Flutter FFI 创建共享库 --
# 这个库只包含 ffi_api.cpp,并链接 cpl_core 静态库
add_library(cpl_ffi_lib SHARED ffi_api.cpp)
# 设置共享库的输出目录
if(WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/dll") # 将 DLL 输出到项目根目录下的 'dll' 文件夹
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib") # 将 SO/DYLIB 输出到项目根目录下的 'lib' 文件夹
endif()
target_link_libraries(cpl_ffi_lib PRIVATE cpl_core) # 链接到核心静态库
# 如果你的 ffi_api.cpp 或其内部调用的核心代码需要这些系统库,请在这里添加
# target_link_libraries(cpl_ffi_lib PRIVATE ws2_32 Iphlpapi)
target_include_directories(cpl_ffi_lib PUBLIC
${PROJECT_SOURCE_DIR} # 包含所有模块的头文件路径,确保 ffi_api.cpp 可以找到它们
${PROJECT_SOURCE_DIR}/regluarExpression
${PROJECT_SOURCE_DIR}/ast
${PROJECT_SOURCE_DIR}/state
${PROJECT_SOURCE_DIR}/vm
${PROJECT_SOURCE_DIR}/front
${PROJECT_SOURCE_DIR}/ir
${ASIO_ROOT_DIR}/include
${JSON_ROOT_DIR}/include
)
# -- 3. 构建独立的 C++ 可执行文件 --
# cpl 可执行文件直接链接 cpl_core 静态库
add_executable(cpl main.cpp)
target_link_libraries(cpl PRIVATE cpl_core)
# 如果 main.cpp 需要这些系统库,也要加
# target_link_libraries(cpl PRIVATE ws2_32 Iphlpapi)
target_include_directories(cpl PRIVATE
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/regluarExpression
${PROJECT_SOURCE_DIR}/ast
${PROJECT_SOURCE_DIR}/state
${PROJECT_SOURCE_DIR}/vm
${PROJECT_SOURCE_DIR}/front
${PROJECT_SOURCE_DIR}/ir
${ASIO_ROOT_DIR}/include
${JSON_ROOT_DIR}/include
)
# -------------------------------------------------------------------
# -- GTest 测试部分 --
add_subdirectory(${PROJECT_SOURCE_DIR}/third/googletest)
add_executable(cpl_tests
test/test.cpp
# test/testVM.cpp
# test/testRegEx.cpp
# test/testRegExParser.cpp
# test/testFirstSet.cpp
# test/testFollowSet.cpp
# test/testLRParserGenerator.cpp
# test/testParser.cpp
# test/testSimpleParser.cpp
)
target_include_directories(cpl_tests PRIVATE
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/regluarExpression
${PROJECT_SOURCE_DIR}/state
${PROJECT_SOURCE_DIR}/test
)
target_link_libraries(cpl_tests
GTest::gtest_main
cpl_core # 测试也链接核心静态库
ws2_32
Iphlpapi
)
include(CTest)
enable_testing()
add_test(NAME cpl_tests COMMAND cpl_tests)