Skip to content

希望 [targets.<name>] 支持 cxxflags 按目标覆盖 #131

Description

@skyler-zbt

[build].cxxflags 对所有 target 一视同仁。实际项目中不同 target 经常需要不同编译参数。

场景 1:contracts 求值语义

# 所有 target 默认 enforce,test_contracts 需要 observe
[targets.test_contracts]
kind = "bin"
main = "tests/test_contracts.cpp"
cxxflags = ["-fcontract-evaluation-semantic=observe"]

场景 2:不同 feature 宏

[targets.server]
kind = "bin"
main = "src/server.cpp"
cxxflags = ["-DBUILD_SERVER=1", "-DPORT=8080"]

[targets.client]
kind = "bin"
main = "src/client.cpp"
cxxflags = ["-DBUILD_CLIENT=1"]

现状: 只能把标志放全局 [build].cxxflags,所有 target 共用。
** 同级构建系统都有此功能——xmake target:add("cxflags")、CMake target_compile_options、Cargo [profile.*.package.*]、Meson executable(..., cpp_args:)。

Activity

  1. self-assigned this
    on Jun 18, 2026
  2. Sunrisepeak commented on Jun 18, 2026

    @Sunrisepeak
    Member

    场景1

    这个后面会添加相关的优化

    场景2

    期望cxxflags 只影响到具体的main文件, 还是期望穿透到共享部分?

    下面给一个基于workspace的工程方法看是否满足你的需求 (cargo 好像也是不支持同包下不同target指定flag的)


    同一个包里,共享代码只编一次、被所有 target 共享,所以它根本无法携带 (多)target 不同的 flag. 如果可以的话 又会导致共用部分多次编译, 可以尝试使用 workspace 拆包 来解决 (达到一样效果)

    myproj/
    ├── mcpp.toml                 # [workspace] members = ["libs/core","apps/server","apps/client"]
    ├── libs/core/                # 共享代码,编一次
    │   └── mcpp.toml             #   [targets.core] kind="lib"
    ├── apps/server/
    │   ├── mcpp.toml             #   见下
    │   └── src/main.cpp
    └── apps/client/
        └── mcpp.toml
    
    # apps/server/mcpp.toml
    [package]
    name = "server"
    [build]
    cxxflags = ["-DBUILD_SERVER=1", "-DPORT=8080"]   # ← 只作用于 server 这个包的编译
    [dependencies]
    core = { path = "../../libs/core" }
    
    
    # apps/client/mcpp.toml
    [package]
    name = "client"
    [build]
    cxxflags = ["-DBUILD_CLIENT=1"]
    [dependencies]
    core = { path = "../../libs/core" }
    
    # tests/mcpp.toml
    

    如果这个宏的控制是在共用部分(core), mcpp提供了 包的feature机制来实现类似需求

    [dependencies]
    imgui = { version = "0.0.3", features = ["docking"] }   # Request a feature of this dependency
    
  3. skyler-zbt commented on Jun 18, 2026

    @skyler-zbt
    Author

    只影响 main 文件本身,不需要穿透到共享库。场景是测试 contracts 违规行为,测试代码需要在 observe 模式下观察违规后是否继续执行。谢谢解释。

  4. Sunrisepeak commented on Jun 18, 2026

    @Sunrisepeak
    Member

    只影响 main 文件本身,不需要穿透到共享库。场景是测试 contracts 违规行为,测试代码需要在 observe 模式下观察违规后是否继续执行。谢谢解释。

    如果只是影响 main 本身这个比较容易支持 不影响依赖图, 后面会支持一下

  5. added 2 commits that reference this issue on Jun 18, 2026
  6. Sunrisepeak commented on Jun 18, 2026

    @Sunrisepeak
    Member
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions