Skip to content

Commit ff90784

Browse files
committed
Improve VS generator and configless mode.
1 parent 728c47b commit ff90784

9 files changed

Lines changed: 91 additions & 37 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ bin
1919
*~
2020
*.user
2121

22+
*.sln
2223
*.aps
2324
*.exe
2425
*.dll

src/builder/build.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ bool build(const String &s)
8585
// local file or dir is preferable rather than some remote pkg
8686
if (fs::exists(s))
8787
return build(path(s));
88-
return build({ s });
88+
return build(Strings{ s });
8989
}
9090

9191
PackageScriptPtr load(const path &file_or_dir)

src/client/client.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ static ::cl::alias override_package2("override", ::cl::desc("Alias for -override
368368
static ::cl::opt<bool> list_overridden_packages("list-overridden-remote-packages", ::cl::desc("List overridden packages"));
369369
static ::cl::opt<String> delete_overridden_package("delete-overridden-remote-package", ::cl::value_desc("package"), ::cl::desc("Delete overridden package from index"));
370370
static ::cl::opt<path> delete_overridden_package_dir("delete-overridden-remote-package-dir", ::cl::value_desc("sdir"), ::cl::desc("Delete overridden dir packages"));
371+
static ::cl::alias delete_overridden_package_dir2("delete-override", ::cl::desc("Alias for -delete-overridden-remote-package-dir"), ::cl::aliasopt(delete_overridden_package_dir));
371372

372373
// uri commands
373374
extern bool gRunAppInContainer;
@@ -801,6 +802,9 @@ static ::cl::opt<bool, true> print_dependencies("print-dependencies", ::cl::loca
801802
extern bool gOutputNoConfigSubdir;
802803
static ::cl::opt<bool, true> output_no_config_subdir("output-no-config-subdir", ::cl::location(gOutputNoConfigSubdir), ::cl::sub(subcommand_generate));
803804

805+
// generated solution dir instead of .sw/...
806+
//static ::cl::opt<String> generate_binary_dir("B", ::cl::desc("Explicitly specify a build directory."), ::cl::sub(subcommand_build), ::cl::init(SW_BINARY_DIR));
807+
804808
SUBCOMMAND_DECL(generate)
805809
{
806810
if (cl_generator.empty())

src/driver/cpp/driver.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ PackageScriptPtr CppDriver::load(const path &file_or_dir) const
4444
LOG_INFO(logger, "Unknown config, trying in configless mode. Default mode is native (ASM/C/C++)");
4545

4646
path p = file_or_dir;
47-
if (fs::is_directory(p))
48-
;
49-
else
50-
p = p.parent_path();
47+
p = fs::absolute(p);
5148

5249
auto b = std::make_unique<Build>();
5350
b->Local = true;

src/driver/cpp/generator/generator.cpp

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ void ProjectContext::printProject(
991991
endBlock(true);
992992
};
993993

994-
std::unordered_set<void *> rules;
994+
Files rules;
995995
for (auto &[p, sf] : nt)
996996
{
997997
if (sf->skip)
@@ -1000,12 +1000,12 @@ void ProjectContext::printProject(
10001000
if (g.type == GeneratorType::VisualStudio && ff.isGenerated())
10011001
{
10021002
auto gen = ff.getFileRecord().getGenerator();
1003-
if (rules.find(gen.get()) == rules.end())
1004-
{
1005-
rules.insert(gen.get());
1003+
auto rule = get_int_dir(nt, s.Settings) / "rules" / (p.filename().string() + ".rule");
1004+
write_file_if_not_exists(rule, "");
10061005

1007-
auto rule = get_int_dir(nt, s.Settings) / "rules" / (p.filename().string() + ".rule");
1008-
write_file_if_not_exists(rule, "");
1006+
if (rules.find(rule) == rules.end())
1007+
{
1008+
rules.insert(rule);
10091009

10101010
// VS crash
10111011
// beginBlockWithConfiguration(get_vs_file_type_by_ext(rule), s.Settings, { {"Include", rule.string()} });
@@ -1098,19 +1098,29 @@ void ProjectContext::printProject(
10981098
fctx.endBlock();
10991099
}
11001100

1101-
auto t = get_vs_file_type_by_ext(p);
1102-
beginBlock(toString(t), { { "Include", p.string() } });
1103-
add_excluded_from_build(s);
1104-
add_obj_file(t, p);
1105-
endBlock();
1101+
if (files_added.find(p) == files_added.end())
1102+
{
1103+
files_added.insert(p);
1104+
1105+
auto t = get_vs_file_type_by_ext(p);
1106+
beginBlock(toString(t), { { "Include", p.string() } });
1107+
add_excluded_from_build(s);
1108+
add_obj_file(t, p);
1109+
endBlock();
1110+
}
11061111
}
11071112
else if (g.type == GeneratorType::VisualStudio && ff.isGeneratedAtAll())
11081113
{
1109-
auto t = get_vs_file_type_by_ext(p);
1110-
beginBlock(toString(t), { { "Include", p.string() } });
1111-
add_excluded_from_build(s);
1112-
add_obj_file(t, p);
1113-
endBlock();
1114+
if (files_added.find(p) == files_added.end())
1115+
{
1116+
files_added.insert(p);
1117+
1118+
auto t = get_vs_file_type_by_ext(p);
1119+
beginBlock(toString(t), { { "Include", p.string() } });
1120+
add_excluded_from_build(s);
1121+
add_obj_file(t, p);
1122+
endBlock();
1123+
}
11141124
}
11151125
else
11161126
{

src/driver/cpp/solution.cpp

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,7 +2279,7 @@ void Build::setupSolutionName(const path &file_or_dir)
22792279

22802280
bool dir = fs::is_directory(file_or_dir);
22812281
if (dir || isFrontendConfigFilename(file_or_dir))
2282-
ide_solution_name = fs::canonical(file_or_dir).filename().u8string();
2282+
ide_solution_name = fs::canonical(file_or_dir).parent_path().filename().u8string();
22832283
else
22842284
ide_solution_name = file_or_dir.stem().u8string();
22852285
}
@@ -2636,23 +2636,62 @@ void Build::load_configless(const path &file_or_dir)
26362636

26372637
bool dir = fs::is_directory(config_file_or_dir);
26382638

2639-
auto &s = solutions[0];
2640-
auto &exe = s.addExecutable(ide_solution_name);
2641-
bool read_deps_from_comments = false;
2639+
Strings comments;
26422640
if (!dir)
26432641
{
2644-
exe += file_or_dir;
2642+
// for generators
2643+
config = file_or_dir;
26452644

2646-
// read deps from comments
2647-
// read_deps_from_comments = true;
2645+
auto f = read_file(file_or_dir);
2646+
2647+
auto b = f.find("/*");
2648+
if (b != f.npos)
2649+
{
2650+
auto e = f.find("*/", b);
2651+
if (e != f.npos)
2652+
{
2653+
auto s = f.substr(b + 2, e - b - 2);
2654+
if (!s.empty())
2655+
comments.push_back(s);
2656+
}
2657+
}
26482658
}
26492659

2650-
if (!read_deps_from_comments)
2660+
createSolutions("", false);
2661+
for (auto &s : solutions)
26512662
{
2652-
for (auto &[p, d] : getPackageStore().resolved_packages)
2663+
current_solution = &s;
2664+
if (!dir)
2665+
{
2666+
//exe += file_or_dir;
2667+
2668+
for (auto &c : comments)
2669+
{
2670+
auto root = YAML::Load(c);
2671+
cppan_load(root, file_or_dir.stem().u8string());
2672+
}
2673+
2674+
if (s.children.size() == 1)
2675+
{
2676+
if (auto nt = s.children.begin()->second->as<NativeExecutedTarget>())
2677+
*nt += file_or_dir;
2678+
}
2679+
2680+
TargetsToBuild = s.children;
2681+
}
2682+
else
26532683
{
2654-
if (d.installed)
2655-
exe += std::make_shared<Dependency>(p.toString());
2684+
auto &exe = s.addExecutable(ide_solution_name);
2685+
bool read_deps_from_comments = false;
2686+
2687+
if (!read_deps_from_comments)
2688+
{
2689+
for (auto &[p, d] : getPackageStore().resolved_packages)
2690+
{
2691+
if (d.installed)
2692+
exe += std::make_shared<Dependency>(p.toString());
2693+
}
2694+
}
26562695
}
26572696
}
26582697
}
@@ -2697,6 +2736,7 @@ void Build::build_packages(const StringSet &pkgs)
26972736
getExecutor(e.get());
26982737
}
26992738

2739+
//
27002740
UnresolvedPackages upkgs;
27012741
for (auto &p : pkgs)
27022742
upkgs.insert(extractFromString(p));

src/driver/cpp/solution.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ struct SW_DRIVER_CPP_API Build : Solution, PackageScript
355355
// other frontends
356356
void cppan_load();
357357
void cppan_load(const path &fn);
358-
void cppan_load(const yaml &root);
358+
void cppan_load(const yaml &root, const String &root_name = {});
359359
bool cppan_check_config_root(const yaml &root);
360360

361361
public:

src/driver/cpp/solution_cppan.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void Build::cppan_load(const path &fn)
6969
cppan_load(root);
7070
}
7171

72-
void Build::cppan_load(const yaml &root)
72+
void Build::cppan_load(const yaml &root, const String &root_name)
7373
{
7474
if (!cppan_check_config_root(root))
7575
return;
@@ -196,7 +196,7 @@ void Build::cppan_load(const yaml &root)
196196
}
197197
else
198198
{
199-
add_project(root, "");
199+
add_project(root, root_name);
200200
}
201201

202202
// remove unreferences projects

src/driver/cpp/target/native.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2824,8 +2824,10 @@ void NativeExecutedTarget::cppan_load_project(const yaml &root)
28242824
{
28252825
// some code was removed here
28262826
// check out original version (v1) if you encounter some errors
2827-
auto nppath = dependency.ppath / v;
2828-
dependency.ppath = nppath;
2827+
2828+
//auto nppath = dependency.ppath / v;
2829+
//dependency.ppath = nppath;
2830+
28292831
dependency.range = v;
28302832
};
28312833

0 commit comments

Comments
 (0)