-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathpackage_configurer.cpp
More file actions
62 lines (51 loc) · 2.11 KB
/
package_configurer.cpp
File metadata and controls
62 lines (51 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "cppship/cmake/package_configurer.h"
#include <fmt/core.h>
#include <fmt/format.h>
#include "cppship/cmake/lib.h"
#include "cppship/core/layout.h"
#include "cppship/core/manifest.h"
#include "cppship/util/io.h"
#include "cppship/util/repo.h"
using namespace cppship;
using namespace fmt::literals;
void cmake::config_packages(
const ResolvedDependencies& cppship_deps, const ResolvedDependencies& all_deps, const ConfigOptions& options)
{
for (const auto& dep : cppship_deps) {
const auto& package = dep.package;
const auto& cmake_target = dep.cmake_target;
const auto package_dir = options.deps_dir / dep.package;
const auto package_manifest = package_dir / kRepoConfigFile;
const auto package_cmake_config_file = options.out_dir / fmt::format("{}-config.cmake", package);
if (!fs::exists(package_manifest)) {
write(package_cmake_config_file,
fmt::format(R"(# header only lib config generated by cppship
add_library({target} INTERFACE IMPORTED)
target_include_directories({target} INTERFACE {cmake_deps_dir}/{package}/include)
)",
"target"_a = cmake_target,
"package"_a = dep.package,
"cmake_deps_dir"_a = options.cmake_deps_dir));
continue;
}
// TODO(wuqq): refine generation, apply cxxflags and definitions
Manifest manifest(package_manifest);
Layout layout(package_dir, package);
const auto lib_target = *layout.lib();
const auto cmake_deps = cmake::resolve_deps(manifest.dependencies(), all_deps);
cmake::CmakeLib lib({
.name = lib_target.name,
.include_dirs = lib_target.includes,
.sources = lib_target.sources,
.deps = cmake_deps,
});
std::ostringstream out;
lib.build(out);
out << fmt::format("\nadd_library({} ALIAS {})\n", cmake_target, lib.target());
auto content = out.str();
if (const auto& func = options.post_process) {
func(content);
}
write(package_cmake_config_file, content);
}
}