Skip to content

Commit 7da67ab

Browse files
committed
feat(manifest)!: support test profile
1 parent f6fbb45 commit 7da67ab

File tree

3 files changed

+100
-61
lines changed

3 files changed

+100
-61
lines changed

src/Builder/BuildProfile.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class BuildProfile {
1515
enum Type : uint8_t {
1616
Dev,
1717
Release,
18+
Test,
1819
};
1920

2021
private:
@@ -56,6 +57,8 @@ struct fmt::formatter<cabin::BuildProfile> {
5657
return fmt::format_to(ctx.out(), "dev");
5758
case cabin::BuildProfile::Release:
5859
return fmt::format_to(ctx.out(), "release");
60+
case cabin::BuildProfile::Test:
61+
return fmt::format_to(ctx.out(), "test");
5962
}
6063
__builtin_unreachable();
6164
} else {

src/Cmd/Test.cc

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,13 @@
2525
namespace cabin {
2626

2727
class Test {
28-
struct TestArgs {
29-
BuildProfile buildProfile = BuildProfile::Dev;
30-
};
31-
32-
TestArgs args;
3328
Manifest manifest;
3429
std::string unittestTargetPrefix;
3530
std::vector<std::string> unittestTargets;
3631

37-
Test(TestArgs args, Manifest manifest)
38-
: args(std::move(args)), manifest(std::move(manifest)) {}
32+
Test(Manifest manifest) : manifest(std::move(manifest)) {}
3933

40-
static Result<TestArgs> parseArgs(CliArgsView cliArgs);
34+
static Result<void> parseArgs(CliArgsView cliArgs);
4135
Result<void> compileTestTargets();
4236
Result<void> runTestTargets();
4337

@@ -53,21 +47,16 @@ const Subcmd TEST_CMD = //
5347
.addOpt(OPT_JOBS)
5448
.setMainFn(Test::exec);
5549

56-
Result<Test::TestArgs>
50+
Result<void>
5751
Test::parseArgs(const CliArgsView cliArgs) {
58-
TestArgs args;
59-
6052
for (auto itr = cliArgs.begin(); itr != cliArgs.end(); ++itr) {
6153
const std::string_view arg = *itr;
6254

6355
const auto control = Try(Cli::handleGlobalOpts(itr, cliArgs.end(), "test"));
6456
if (control == Cli::Return) {
65-
return Ok(args);
57+
return Ok();
6658
} else if (control == Cli::Continue) {
6759
continue;
68-
} else if (arg == "-r" || arg == "--release") {
69-
Diag::warn("Tests in release mode possibly disables assert macros.");
70-
args.buildProfile = BuildProfile::Release;
7160
} else if (arg == "-j" || arg == "--jobs") {
7261
if (itr + 1 == cliArgs.end()) {
7362
return Subcmd::missingOptArgumentFor(arg);
@@ -85,15 +74,16 @@ Test::parseArgs(const CliArgsView cliArgs) {
8574
}
8675
}
8776

88-
return Ok(args);
77+
return Ok();
8978
}
9079

9180
Result<void>
9281
Test::compileTestTargets() {
9382
const auto start = std::chrono::steady_clock::now();
9483

84+
const BuildProfile buildProfile = BuildProfile::Test;
9585
const BuildConfig config =
96-
Try(emitMakefile(manifest, args.buildProfile, /*includeDevDeps=*/true));
86+
Try(emitMakefile(manifest, buildProfile, /*includeDevDeps=*/true));
9787

9888
// Collect test targets from the generated Makefile.
9989
unittestTargetPrefix = (config.outBasePath / "unittests").string() + '/';
@@ -150,9 +140,9 @@ Test::compileTestTargets() {
150140
const auto end = std::chrono::steady_clock::now();
151141
const std::chrono::duration<double> elapsed = end - start;
152142

153-
const Profile& profile = manifest.profiles.at(args.buildProfile);
143+
const Profile& profile = manifest.profiles.at(buildProfile);
154144
Diag::info(
155-
"Finished", "`{}` profile [{}] target(s) in {:.2f}s", args.buildProfile,
145+
"Finished", "`{}` profile [{}] target(s) in {:.2f}s", buildProfile,
156146
profile, elapsed.count()
157147
);
158148

@@ -206,9 +196,9 @@ Test::runTestTargets() {
206196

207197
Result<void>
208198
Test::exec(const CliArgsView cliArgs) {
209-
const TestArgs args = Try(parseArgs(cliArgs));
199+
Try(parseArgs(cliArgs));
210200
Manifest manifest = Try(Manifest::tryParse());
211-
Test cmd(args, std::move(manifest));
201+
Test cmd(std::move(manifest));
212202

213203
Try(cmd.compileTestTargets());
214204
if (cmd.unittestTargets.empty()) {

src/Manifest.cc

Lines changed: 86 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -154,76 +154,109 @@ static Result<Profile>
154154
parseDevProfile(
155155
const toml::value& val, const BaseProfile& baseProfile
156156
) noexcept {
157-
auto devCxxflags = Try(validateFlags(
157+
static constexpr const char* key = "dev";
158+
159+
auto cxxflags = Try(validateFlags(
158160
"cxxflags", toml::find_or<std::vector<std::string>>(
159-
val, "profile", "dev", "cxxflags", baseProfile.cxxflags
161+
val, "profile", key, "cxxflags", baseProfile.cxxflags
160162
)
161163
));
162-
auto devLdflags = Try(validateFlags(
164+
auto ldflags = Try(validateFlags(
163165
"ldflags", toml::find_or<std::vector<std::string>>(
164-
val, "profile", "dev", "ldflags", baseProfile.ldflags
166+
val, "profile", key, "ldflags", baseProfile.ldflags
165167
)
166168
));
167-
const auto devLto =
168-
toml::find_or<bool>(val, "profile", "dev", "lto", baseProfile.lto);
169-
const auto devDebug = toml::find_or<bool>(
170-
val, "profile", "dev", "debug", baseProfile.debug.unwrap_or(true)
171-
);
172-
const auto devCompDb =
173-
toml::find_or<bool>(val, "profile", "dev", "compdb", baseProfile.compDb);
174-
const auto devOptLevel = Try(validateOptLevel(
169+
const auto lto =
170+
toml::find_or<bool>(val, "profile", key, "lto", baseProfile.lto);
171+
const auto debug = toml::find_or<bool>(
172+
val, "profile", key, "debug", baseProfile.debug.unwrap_or(true)
173+
);
174+
const auto compDb =
175+
toml::find_or<bool>(val, "profile", key, "compdb", baseProfile.compDb);
176+
const auto optLevel = Try(validateOptLevel(
175177
toml::find_or<std::uint8_t>(
176-
val, "profile", "dev", "opt-level", baseProfile.optLevel.unwrap_or(0)
178+
val, "profile", key, "opt-level", baseProfile.optLevel.unwrap_or(0)
177179
)
178180
));
179181

180182
return Ok(Profile(
181-
std::move(devCxxflags), std::move(devLdflags), devLto, devDebug,
182-
devCompDb, devOptLevel
183+
std::move(cxxflags), std::move(ldflags), lto, debug, compDb, optLevel
183184
));
184185
}
185186

186187
static Result<Profile>
187188
parseReleaseProfile(
188189
const toml::value& val, const BaseProfile& baseProfile
189190
) noexcept {
190-
auto relCxxflags = Try(validateFlags(
191-
"cxxflags",
192-
toml::find_or<std::vector<std::string>>(
193-
val, "profile", "release", "cxxflags", baseProfile.cxxflags
191+
static constexpr const char* key = "release";
192+
193+
auto cxxflags = Try(validateFlags(
194+
"cxxflags", toml::find_or<std::vector<std::string>>(
195+
val, "profile", key, "cxxflags", baseProfile.cxxflags
196+
)
197+
));
198+
auto ldflags = Try(validateFlags(
199+
"ldflags", toml::find_or<std::vector<std::string>>(
200+
val, "profile", key, "ldflags", baseProfile.ldflags
201+
)
202+
));
203+
const auto lto =
204+
toml::find_or<bool>(val, "profile", key, "lto", baseProfile.lto);
205+
const auto debug = toml::find_or<bool>(
206+
val, "profile", key, "debug", baseProfile.debug.unwrap_or(false)
207+
);
208+
const auto compDb =
209+
toml::find_or<bool>(val, "profile", key, "compdb", baseProfile.compDb);
210+
const auto optLevel = Try(validateOptLevel(
211+
toml::find_or<std::uint8_t>(
212+
val, "profile", key, "opt-level", baseProfile.optLevel.unwrap_or(3)
194213
)
195214
));
196-
auto relLdflags = Try(validateFlags(
215+
216+
return Ok(Profile(
217+
std::move(cxxflags), std::move(ldflags), lto, debug, compDb, optLevel
218+
));
219+
}
220+
221+
// Inherits from `dev`.
222+
static Result<Profile>
223+
parseTestProfile(const toml::value& val, const Profile& devProfile) noexcept {
224+
static constexpr const char* key = "test";
225+
226+
auto cxxflags = Try(validateFlags(
227+
"cxxflags", toml::find_or<std::vector<std::string>>(
228+
val, "profile", key, "cxxflags", devProfile.cxxflags
229+
)
230+
));
231+
auto ldflags = Try(validateFlags(
197232
"ldflags", toml::find_or<std::vector<std::string>>(
198-
val, "profile", "release", "ldflags", baseProfile.ldflags
233+
val, "profile", key, "ldflags", devProfile.ldflags
199234
)
200235
));
201-
const auto relLto =
202-
toml::find_or<bool>(val, "profile", "release", "lto", baseProfile.lto);
203-
const auto relDebug = toml::find_or<bool>(
204-
val, "profile", "release", "debug", baseProfile.debug.unwrap_or(false)
205-
);
206-
const auto relCompDb = toml::find_or<bool>(
207-
val, "profile", "release", "compdb", baseProfile.compDb
208-
);
209-
const auto relOptLevel = Try(validateOptLevel(
236+
const auto lto =
237+
toml::find_or<bool>(val, "profile", key, "lto", devProfile.lto);
238+
const auto debug =
239+
toml::find_or<bool>(val, "profile", key, "debug", devProfile.debug);
240+
const auto compDb =
241+
toml::find_or<bool>(val, "profile", key, "compdb", devProfile.compDb);
242+
const auto optLevel = Try(validateOptLevel(
210243
toml::find_or<std::uint8_t>(
211-
val, "profile", "release", "opt-level",
212-
baseProfile.optLevel.unwrap_or(3)
244+
val, "profile", key, "opt-level", devProfile.optLevel
213245
)
214246
));
215247

216248
return Ok(Profile(
217-
std::move(relCxxflags), std::move(relLdflags), relLto, relDebug,
218-
relCompDb, relOptLevel
249+
std::move(cxxflags), std::move(ldflags), lto, debug, compDb, optLevel
219250
));
220251
}
221252

222253
static Result<std::unordered_map<BuildProfile, Profile>>
223254
parseProfiles(const toml::value& val) noexcept {
224255
std::unordered_map<BuildProfile, Profile> profiles;
225256
const BaseProfile baseProfile = Try(parseBaseProfile(val));
226-
profiles.emplace(BuildProfile::Dev, Try(parseDevProfile(val, baseProfile)));
257+
Profile devProfile = Try(parseDevProfile(val, baseProfile));
258+
profiles.emplace(BuildProfile::Test, Try(parseTestProfile(val, devProfile)));
259+
profiles.emplace(BuildProfile::Dev, std::move(devProfile));
227260
profiles.emplace(
228261
BuildProfile::Release, Try(parseReleaseProfile(val, baseProfile))
229262
);
@@ -821,17 +854,19 @@ testParseProfiles() {
821854
const toml::value empty = ""_toml;
822855

823856
const auto profiles = parseProfiles(empty).unwrap();
824-
assertEq(profiles.size(), 2UL);
857+
assertEq(profiles.size(), 3UL);
825858
assertEq(profiles.at(BuildProfile::Dev), devProfileDefault);
826859
assertEq(profiles.at(BuildProfile::Release), relProfileDefault);
860+
assertEq(profiles.at(BuildProfile::Test), devProfileDefault);
827861
}
828862
{
829863
const toml::value profOnly = "[profile]"_toml;
830864

831865
const auto profiles = parseProfiles(profOnly).unwrap();
832-
assertEq(profiles.size(), 2UL);
866+
assertEq(profiles.size(), 3UL);
833867
assertEq(profiles.at(BuildProfile::Dev), devProfileDefault);
834868
assertEq(profiles.at(BuildProfile::Release), relProfileDefault);
869+
assertEq(profiles.at(BuildProfile::Test), devProfileDefault);
835870
}
836871
{
837872
const toml::value baseOnly = R"(
@@ -851,9 +886,10 @@ testParseProfiles() {
851886
);
852887

853888
const auto profiles = parseProfiles(baseOnly).unwrap();
854-
assertEq(profiles.size(), 2UL);
889+
assertEq(profiles.size(), 3UL);
855890
assertEq(profiles.at(BuildProfile::Dev), expected);
856891
assertEq(profiles.at(BuildProfile::Release), expected);
892+
assertEq(profiles.at(BuildProfile::Test), expected);
857893
}
858894
{
859895
const toml::value overwrite = R"(
@@ -868,9 +904,10 @@ testParseProfiles() {
868904
)"_toml;
869905

870906
const auto profiles = parseProfiles(overwrite).unwrap();
871-
assertEq(profiles.size(), 2UL);
907+
assertEq(profiles.size(), 3UL);
872908
assertEq(profiles.at(BuildProfile::Dev), devProfileDefault);
873909
assertEq(profiles.at(BuildProfile::Release), relProfileDefault);
910+
assertEq(profiles.at(BuildProfile::Test), devProfileDefault);
874911
}
875912
{
876913
const toml::value overwrite = R"(
@@ -879,6 +916,9 @@ testParseProfiles() {
879916
880917
[profile.dev]
881918
opt-level = 1
919+
920+
[profile.test]
921+
cxxflags = ["-fno-rtti"]
882922
)"_toml;
883923

884924
const Profile devExpected(
@@ -891,11 +931,17 @@ testParseProfiles() {
891931
/*debug=*/false,
892932
/*compDb=*/false, /*optLevel=*/2 // here, the default is 3
893933
);
934+
const Profile testExpected(
935+
/*cxxflags=*/{ "-fno-rtti" }, /*ldflags=*/{}, /*lto=*/false,
936+
/*debug=*/true,
937+
/*compDb=*/false, /*optLevel=*/1
938+
);
894939

895940
const auto profiles = parseProfiles(overwrite).unwrap();
896-
assertEq(profiles.size(), 2UL);
941+
assertEq(profiles.size(), 3UL);
897942
assertEq(profiles.at(BuildProfile::Dev), devExpected);
898943
assertEq(profiles.at(BuildProfile::Release), relExpected);
944+
assertEq(profiles.at(BuildProfile::Test), testExpected);
899945
}
900946
}
901947

0 commit comments

Comments
 (0)