From 6de56f107bb4028fab319e4176408a960a545196 Mon Sep 17 00:00:00 2001 From: Lane0218 Date: Sat, 27 Dec 2025 15:10:35 +0800 Subject: [PATCH] =?UTF-8?q?build(build):=20=E6=8B=86=E5=88=86=E5=AD=90?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=20CMakeLists=20=E5=B9=B6=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 72 ++++++++++++++++++++++++++++++++-- CMakeLists.txt | 52 ++++++++++++++++++++++-- src/CMakeLists.txt | 25 ++++++++++-- src/ast/CMakeLists.txt | 8 ++++ src/frontend/CMakeLists.txt | 18 +++++++++ src/ir/CMakeLists.txt | 26 ++++++++++++ src/ir/analysis/CMakeLists.txt | 9 +++++ src/ir/passes/CMakeLists.txt | 13 ++++++ src/irgen/CMakeLists.txt | 16 ++++++-- src/mir/CMakeLists.txt | 24 ++++++++++++ src/mir/passes/CMakeLists.txt | 9 +++++ src/sem/CMakeLists.txt | 10 +++++ src/utils/CMakeLists.txt | 8 ++++ 13 files changed, 276 insertions(+), 14 deletions(-) create mode 100644 src/ast/CMakeLists.txt create mode 100644 src/frontend/CMakeLists.txt create mode 100644 src/ir/CMakeLists.txt create mode 100644 src/ir/analysis/CMakeLists.txt create mode 100644 src/ir/passes/CMakeLists.txt create mode 100644 src/mir/CMakeLists.txt create mode 100644 src/mir/passes/CMakeLists.txt create mode 100644 src/sem/CMakeLists.txt create mode 100644 src/utils/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 0ff3fc6..5802a8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,69 @@ -# 忽略构建产物与中间文件: -# - build/ 等构建目录 -# - ANTLR 自动生成文件(若产生在源码树中应忽略) -# - test/test_result/ 等测试输出目录 +# ========================= +# Build / CMake +# ========================= +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/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fdd1c8..5b17b72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,49 @@ -# 工程构建入口: -# - 配置 C/C++ 编译器与标准、编译选项、输出目录等 -# - 添加 src/ 子目录并链接生成最终可执行文件 -# - 集成 ANTLR4 C++ runtime(通过系统依赖或第三方源码),并将构建目录下的 ANTLR 生成代码纳入编译 +cmake_minimum_required(VERSION 3.20) +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) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 22066d4..3e1d73b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,23 @@ -# src/ 子目录构建脚本: -# - 收集并编译各子模块源文件(frontend/ast/sem/irgen/ir/mir/utils) -# - 生成库或目标对象并链接到最终可执行文件 +# src/ 子目录构建脚本:各子目录独立维护 CMakeLists.txt,并在此聚合链接 +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 --target compiler +add_executable(compiler EXCLUDE_FROM_ALL + main.cpp +) +target_link_libraries(compiler PRIVATE + frontend + sem + irgen + mir + utils +) diff --git a/src/ast/CMakeLists.txt b/src/ast/CMakeLists.txt new file mode 100644 index 0000000..b084694 --- /dev/null +++ b/src/ast/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(ast STATIC + AstNodes.cpp + AstPrinter.cpp +) + +target_link_libraries(ast PUBLIC + build_options +) diff --git a/src/frontend/CMakeLists.txt b/src/frontend/CMakeLists.txt new file mode 100644 index 0000000..330a5a3 --- /dev/null +++ b/src/frontend/CMakeLists.txt @@ -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() diff --git a/src/ir/CMakeLists.txt b/src/ir/CMakeLists.txt new file mode 100644 index 0000000..c3b6e7b --- /dev/null +++ b/src/ir/CMakeLists.txt @@ -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 +) diff --git a/src/ir/analysis/CMakeLists.txt b/src/ir/analysis/CMakeLists.txt new file mode 100644 index 0000000..3109273 --- /dev/null +++ b/src/ir/analysis/CMakeLists.txt @@ -0,0 +1,9 @@ +add_library(ir_analysis STATIC + DominatorTree.cpp + LoopInfo.cpp +) + +target_link_libraries(ir_analysis PUBLIC + build_options + ir_core +) diff --git a/src/ir/passes/CMakeLists.txt b/src/ir/passes/CMakeLists.txt new file mode 100644 index 0000000..cfb5093 --- /dev/null +++ b/src/ir/passes/CMakeLists.txt @@ -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 +) diff --git a/src/irgen/CMakeLists.txt b/src/irgen/CMakeLists.txt index 7404f1f..e711474 100644 --- a/src/irgen/CMakeLists.txt +++ b/src/irgen/CMakeLists.txt @@ -1,4 +1,14 @@ -# src/irgen/ 子模块构建脚本: -# - 编译 IR 生成相关源文件(Driver/Func/Stmt/Exp/Decl) -# - 作为 src/ 的子目标被链接到最终可执行文件(具体组织方式按工程实现选择) +add_library(irgen STATIC + IRGenDriver.cpp + IRGenFunc.cpp + IRGenStmt.cpp + IRGenExp.cpp + IRGenDecl.cpp +) +target_link_libraries(irgen PUBLIC + build_options + ast + sem + ir +) diff --git a/src/mir/CMakeLists.txt b/src/mir/CMakeLists.txt new file mode 100644 index 0000000..0b0996b --- /dev/null +++ b/src/mir/CMakeLists.txt @@ -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 +) diff --git a/src/mir/passes/CMakeLists.txt b/src/mir/passes/CMakeLists.txt new file mode 100644 index 0000000..3b97b4f --- /dev/null +++ b/src/mir/passes/CMakeLists.txt @@ -0,0 +1,9 @@ +add_library(mir_passes STATIC + PassManager.cpp + Peephole.cpp +) + +target_link_libraries(mir_passes PUBLIC + build_options + mir_core +) diff --git a/src/sem/CMakeLists.txt b/src/sem/CMakeLists.txt new file mode 100644 index 0000000..485e830 --- /dev/null +++ b/src/sem/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(sem STATIC + Sema.cpp + SymbolTable.cpp + ConstEval.cpp +) + +target_link_libraries(sem PUBLIC + build_options + ast +) diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt new file mode 100644 index 0000000..d478272 --- /dev/null +++ b/src/utils/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(utils STATIC + Log.cpp + CLI.cpp +) + +target_link_libraries(utils PUBLIC + build_options +)