build(build): 拆分子目录 CMakeLists 并规范目标命名
This commit is contained in:
72
.gitignore
vendored
72
.gitignore
vendored
@@ -1,5 +1,69 @@
|
|||||||
# 忽略构建产物与中间文件:
|
# =========================
|
||||||
# - build/ 等构建目录
|
# Build / CMake
|
||||||
# - ANTLR 自动生成文件(若产生在源码树中应忽略)
|
# =========================
|
||||||
# - test/test_result/ 等测试输出目录
|
build/
|
||||||
|
cmake-build-*/
|
||||||
|
out/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
CMakeFiles/
|
||||||
|
CMakeCache.txt
|
||||||
|
cmake_install.cmake
|
||||||
|
install_manifest.txt
|
||||||
|
Makefile
|
||||||
|
compile_commands.json
|
||||||
|
.ninja_deps
|
||||||
|
.ninja_log
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Generated / intermediate
|
||||||
|
# =========================
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.pdb
|
||||||
|
*.ilk
|
||||||
|
*.dSYM/
|
||||||
|
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
# ANTLR 生成物(通常在 build/,这里额外兜底)
|
||||||
|
**/generated/antlr4/
|
||||||
|
**/antlr4-generated/
|
||||||
|
*.tokens
|
||||||
|
*.interp
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# IDE / Editor
|
||||||
|
# =========================
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
.fleet/
|
||||||
|
.vs/
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# CLion
|
||||||
|
cmake-build-debug/
|
||||||
|
cmake-build-release/
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# OS / misc
|
||||||
|
# =========================
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Project outputs
|
||||||
|
# =========================
|
||||||
|
test/test_result/
|
||||||
|
|||||||
@@ -1,5 +1,49 @@
|
|||||||
# 工程构建入口:
|
cmake_minimum_required(VERSION 3.20)
|
||||||
# - 配置 C/C++ 编译器与标准、编译选项、输出目录等
|
|
||||||
# - 添加 src/ 子目录并链接生成最终可执行文件
|
|
||||||
# - 集成 ANTLR4 C++ runtime(通过系统依赖或第三方源码),并将构建目录下的 ANTLR 生成代码纳入编译
|
|
||||||
|
|
||||||
|
project(compiler LANGUAGES C CXX)
|
||||||
|
|
||||||
|
# 统一 C++ 标准(按实验环境可调整)
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
|
# ANTLR 生成代码目录约定(不进仓库,生成在构建目录)
|
||||||
|
set(ANTLR4_GENERATED_DIR "${CMAKE_BINARY_DIR}/generated/antlr4")
|
||||||
|
|
||||||
|
# 统一的编译/包含目录选项(子模块复用)
|
||||||
|
add_library(build_options INTERFACE)
|
||||||
|
target_compile_features(build_options INTERFACE cxx_std_17)
|
||||||
|
target_include_directories(build_options INTERFACE
|
||||||
|
"${PROJECT_SOURCE_DIR}/include"
|
||||||
|
"${PROJECT_SOURCE_DIR}/src"
|
||||||
|
"${ANTLR4_GENERATED_DIR}"
|
||||||
|
)
|
||||||
|
|
||||||
|
option(COMPILER_ENABLE_WARNINGS "Enable common compiler warnings" ON)
|
||||||
|
if(COMPILER_ENABLE_WARNINGS)
|
||||||
|
if(MSVC)
|
||||||
|
target_compile_options(build_options INTERFACE /W4)
|
||||||
|
else()
|
||||||
|
target_compile_options(build_options INTERFACE -Wall -Wextra -Wpedantic)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# 尝试查找系统 ANTLR4 runtime;找不到则提供占位 target,便于先配置工程
|
||||||
|
find_package(antlr4-runtime CONFIG QUIET)
|
||||||
|
|
||||||
|
set(ANTLR4_RUNTIME_TARGET "")
|
||||||
|
if(TARGET antlr4_shared)
|
||||||
|
set(ANTLR4_RUNTIME_TARGET antlr4_shared)
|
||||||
|
elseif(TARGET antlr4_static)
|
||||||
|
set(ANTLR4_RUNTIME_TARGET antlr4_static)
|
||||||
|
elseif(TARGET antlr4-runtime)
|
||||||
|
set(ANTLR4_RUNTIME_TARGET antlr4-runtime)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ANTLR4_RUNTIME_TARGET STREQUAL "")
|
||||||
|
add_library(antlr4_runtime_fallback INTERFACE)
|
||||||
|
set(ANTLR4_RUNTIME_TARGET antlr4_runtime_fallback)
|
||||||
|
message(STATUS "antlr4-runtime 未找到:将以占位 target 配置工程;需要 ANTLR 功能时请安装/引入 antlr4-runtime。")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
||||||
|
|||||||
@@ -1,4 +1,23 @@
|
|||||||
# src/ 子目录构建脚本:
|
# src/ 子目录构建脚本:各子目录独立维护 CMakeLists.txt,并在此聚合链接
|
||||||
# - 收集并编译各子模块源文件(frontend/ast/sem/irgen/ir/mir/utils)
|
|
||||||
# - 生成库或目标对象并链接到最终可执行文件
|
|
||||||
|
|
||||||
|
add_subdirectory(utils)
|
||||||
|
add_subdirectory(ast)
|
||||||
|
add_subdirectory(sem)
|
||||||
|
add_subdirectory(ir)
|
||||||
|
add_subdirectory(frontend)
|
||||||
|
add_subdirectory(irgen)
|
||||||
|
add_subdirectory(mir)
|
||||||
|
|
||||||
|
# 当前仓库仍是“骨架阶段”,`src/main.cpp` 暂无可链接的 main。
|
||||||
|
# 为了让默认 `cmake --build` 能成功(先把各模块库编译通过),将可执行文件从 ALL 中排除;
|
||||||
|
# 需要构建可执行文件时可显式执行:cmake --build <build_dir> --target compiler
|
||||||
|
add_executable(compiler EXCLUDE_FROM_ALL
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
target_link_libraries(compiler PRIVATE
|
||||||
|
frontend
|
||||||
|
sem
|
||||||
|
irgen
|
||||||
|
mir
|
||||||
|
utils
|
||||||
|
)
|
||||||
|
|||||||
8
src/ast/CMakeLists.txt
Normal file
8
src/ast/CMakeLists.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
add_library(ast STATIC
|
||||||
|
AstNodes.cpp
|
||||||
|
AstPrinter.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ast PUBLIC
|
||||||
|
build_options
|
||||||
|
)
|
||||||
18
src/frontend/CMakeLists.txt
Normal file
18
src/frontend/CMakeLists.txt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
add_library(frontend STATIC
|
||||||
|
AntlrDriver.cpp
|
||||||
|
AstBuilder.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(frontend PUBLIC
|
||||||
|
build_options
|
||||||
|
ast
|
||||||
|
"${ANTLR4_RUNTIME_TARGET}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 自动纳入构建目录中的 ANTLR 生成源码(若存在)
|
||||||
|
file(GLOB ANTLR4_GENERATED_SOURCES CONFIGURE_DEPENDS
|
||||||
|
"${ANTLR4_GENERATED_DIR}/*.cpp"
|
||||||
|
)
|
||||||
|
if(ANTLR4_GENERATED_SOURCES)
|
||||||
|
target_sources(frontend PRIVATE ${ANTLR4_GENERATED_SOURCES})
|
||||||
|
endif()
|
||||||
26
src/ir/CMakeLists.txt
Normal file
26
src/ir/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
add_library(ir_core STATIC
|
||||||
|
Context.cpp
|
||||||
|
Module.cpp
|
||||||
|
Function.cpp
|
||||||
|
BasicBlock.cpp
|
||||||
|
Type.cpp
|
||||||
|
Value.cpp
|
||||||
|
Instruction.cpp
|
||||||
|
IRBuilder.cpp
|
||||||
|
IRPrinter.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ir_core PUBLIC
|
||||||
|
build_options
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(analysis)
|
||||||
|
add_subdirectory(passes)
|
||||||
|
|
||||||
|
# 统一对外的 IR 依赖入口
|
||||||
|
add_library(ir INTERFACE)
|
||||||
|
target_link_libraries(ir INTERFACE
|
||||||
|
ir_core
|
||||||
|
ir_analysis
|
||||||
|
ir_passes
|
||||||
|
)
|
||||||
9
src/ir/analysis/CMakeLists.txt
Normal file
9
src/ir/analysis/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
add_library(ir_analysis STATIC
|
||||||
|
DominatorTree.cpp
|
||||||
|
LoopInfo.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ir_analysis PUBLIC
|
||||||
|
build_options
|
||||||
|
ir_core
|
||||||
|
)
|
||||||
13
src/ir/passes/CMakeLists.txt
Normal file
13
src/ir/passes/CMakeLists.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
add_library(ir_passes STATIC
|
||||||
|
PassManager.cpp
|
||||||
|
Mem2Reg.cpp
|
||||||
|
ConstFold.cpp
|
||||||
|
DCE.cpp
|
||||||
|
CFGSimplify.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ir_passes PUBLIC
|
||||||
|
build_options
|
||||||
|
ir_core
|
||||||
|
ir_analysis
|
||||||
|
)
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
# src/irgen/ 子模块构建脚本:
|
add_library(irgen STATIC
|
||||||
# - 编译 IR 生成相关源文件(Driver/Func/Stmt/Exp/Decl)
|
IRGenDriver.cpp
|
||||||
# - 作为 src/ 的子目标被链接到最终可执行文件(具体组织方式按工程实现选择)
|
IRGenFunc.cpp
|
||||||
|
IRGenStmt.cpp
|
||||||
|
IRGenExp.cpp
|
||||||
|
IRGenDecl.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(irgen PUBLIC
|
||||||
|
build_options
|
||||||
|
ast
|
||||||
|
sem
|
||||||
|
ir
|
||||||
|
)
|
||||||
|
|||||||
24
src/mir/CMakeLists.txt
Normal file
24
src/mir/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
add_library(mir_core STATIC
|
||||||
|
MIRContext.cpp
|
||||||
|
MIRFunction.cpp
|
||||||
|
MIRBasicBlock.cpp
|
||||||
|
MIRInstr.cpp
|
||||||
|
Register.cpp
|
||||||
|
Lowering.cpp
|
||||||
|
RegAlloc.cpp
|
||||||
|
FrameLowering.cpp
|
||||||
|
AsmPrinter.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(mir_core PUBLIC
|
||||||
|
build_options
|
||||||
|
ir
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(passes)
|
||||||
|
|
||||||
|
add_library(mir INTERFACE)
|
||||||
|
target_link_libraries(mir INTERFACE
|
||||||
|
mir_core
|
||||||
|
mir_passes
|
||||||
|
)
|
||||||
9
src/mir/passes/CMakeLists.txt
Normal file
9
src/mir/passes/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
add_library(mir_passes STATIC
|
||||||
|
PassManager.cpp
|
||||||
|
Peephole.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(mir_passes PUBLIC
|
||||||
|
build_options
|
||||||
|
mir_core
|
||||||
|
)
|
||||||
10
src/sem/CMakeLists.txt
Normal file
10
src/sem/CMakeLists.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
add_library(sem STATIC
|
||||||
|
Sema.cpp
|
||||||
|
SymbolTable.cpp
|
||||||
|
ConstEval.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(sem PUBLIC
|
||||||
|
build_options
|
||||||
|
ast
|
||||||
|
)
|
||||||
8
src/utils/CMakeLists.txt
Normal file
8
src/utils/CMakeLists.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
add_library(utils STATIC
|
||||||
|
Log.cpp
|
||||||
|
CLI.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(utils PUBLIC
|
||||||
|
build_options
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user