build(build): 拆分子目录 CMakeLists 并规范目标命名

master
Lane0218 3 months ago
parent 35da726b00
commit 6de56f107b

72
.gitignore vendored

@ -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/

@ -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)

@ -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 <build_dir> --target compiler
add_executable(compiler EXCLUDE_FROM_ALL
main.cpp
)
target_link_libraries(compiler PRIVATE
frontend
sem
irgen
mir
utils
)

@ -0,0 +1,8 @@
add_library(ast STATIC
AstNodes.cpp
AstPrinter.cpp
)
target_link_libraries(ast PUBLIC
build_options
)

@ -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()

@ -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
)

@ -0,0 +1,9 @@
add_library(ir_analysis STATIC
DominatorTree.cpp
LoopInfo.cpp
)
target_link_libraries(ir_analysis PUBLIC
build_options
ir_core
)

@ -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/
# - 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
)

@ -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
)

@ -0,0 +1,9 @@
add_library(mir_passes STATIC
PassManager.cpp
Peephole.cpp
)
target_link_libraries(mir_passes PUBLIC
build_options
mir_core
)

@ -0,0 +1,10 @@
add_library(sem STATIC
Sema.cpp
SymbolTable.cpp
ConstEval.cpp
)
target_link_libraries(sem PUBLIC
build_options
ast
)

@ -0,0 +1,8 @@
add_library(utils STATIC
Log.cpp
CLI.cpp
)
target_link_libraries(utils PUBLIC
build_options
)
Loading…
Cancel
Save