Skip to content

Commit 41d5f96

Browse files
authored
fix(build): route Objective-C sources through C rule (#97)
1 parent fbcf203 commit 41d5f96

5 files changed

Lines changed: 59 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
> 本文件追踪 `mcpp-community/mcpp` 公开仓的版本演进。
44
> 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)
55
6+
## [0.0.41] — 2026-06-01
7+
8+
### 修复
9+
10+
- 修复 Objective-C `.m` 源文件在 Ninja 后端被路由到 C++ 编译规则的问题。
11+
`.m` 现在与 `.c` 一样使用 C/Objective-C 编译器与 `cflags`,避免 macOS
12+
GLFW 等上游 Objective-C 源被错误附加 `-std=c++23`
13+
614
## [0.0.40] — 2026-06-01
715

816
### 修复

mcpp.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mcpp"
3-
version = "0.0.40"
3+
version = "0.0.41"
44
description = "Modern C++ build & package management tool"
55
license = "Apache-2.0"
66
authors = ["mcpp-community"]

src/build/ninja_backend.cppm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ std::string emit_ninja_string(const BuildPlan& plan) {
445445
auto ext = src.extension();
446446
if (ext == ".cppm")
447447
return "cxx_module";
448-
if (ext == ".c")
448+
if (ext == ".c" || ext == ".m")
449449
return "c_object";
450450
return "cxx_object";
451451
};

src/toolchain/fingerprint.cppm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import mcpp.toolchain.detect;
1818

1919
export namespace mcpp::toolchain {
2020

21-
inline constexpr std::string_view MCPP_VERSION = "0.0.40";
21+
inline constexpr std::string_view MCPP_VERSION = "0.0.41";
2222

2323
struct FingerprintInputs {
2424
Toolchain toolchain;

tests/unit/test_ninja_backend.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <gtest/gtest.h>
2+
3+
import std;
4+
import mcpp.build.ninja;
5+
import mcpp.build.plan;
6+
import mcpp.manifest;
7+
import mcpp.toolchain.model;
8+
9+
using namespace mcpp::build;
10+
11+
namespace {
12+
13+
BuildPlan minimal_plan() {
14+
BuildPlan plan;
15+
plan.projectRoot = "/tmp/mcpp-ninja-test";
16+
plan.outputDir = plan.projectRoot / "target" / "test";
17+
plan.manifest.package.name = "objc_rule_test";
18+
plan.manifest.buildConfig.cStandard = "c11";
19+
plan.toolchain.compiler = mcpp::toolchain::CompilerId::GCC;
20+
plan.toolchain.version = "test";
21+
plan.toolchain.binaryPath = "/usr/bin/g++";
22+
plan.toolchain.targetTriple = "x86_64-linux-gnu";
23+
return plan;
24+
}
25+
26+
} // namespace
27+
28+
TEST(NinjaBackend, ObjectiveCSourceUsesCObjectRuleAndCFlags) {
29+
auto plan = minimal_plan();
30+
plan.compileUnits.push_back({
31+
.source = "src/cocoa.m",
32+
.object = "obj/cocoa.o",
33+
.packageName = "objc_rule_test",
34+
.packageCflags = {"-DOBJ_C_BUILD=1"},
35+
.packageCxxflags = {"-DWRONG_CXX_FLAG=1"},
36+
});
37+
38+
auto ninja = emit_ninja_string(plan);
39+
40+
EXPECT_NE(ninja.find("build obj/cocoa.o : c_object src/cocoa.m"), std::string::npos)
41+
<< ninja;
42+
EXPECT_EQ(ninja.find("build obj/cocoa.o : cxx_object src/cocoa.m"), std::string::npos)
43+
<< ninja;
44+
EXPECT_NE(ninja.find("unit_cflags = -DOBJ_C_BUILD=1"), std::string::npos)
45+
<< ninja;
46+
EXPECT_EQ(ninja.find("unit_cxxflags = -DWRONG_CXX_FLAG=1"), std::string::npos)
47+
<< ninja;
48+
}

0 commit comments

Comments
 (0)