summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/base_maps/entity_name.hpp13
-rw-r--r--src/buildtool/build_engine/base_maps/entity_name_data.hpp12
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp37
-rw-r--r--src/buildtool/main/main.cpp3
4 files changed, 59 insertions, 6 deletions
diff --git a/src/buildtool/build_engine/base_maps/entity_name.hpp b/src/buildtool/build_engine/base_maps/entity_name.hpp
index e2df632e..bec5b083 100644
--- a/src/buildtool/build_engine/base_maps/entity_name.hpp
+++ b/src/buildtool/build_engine/base_maps/entity_name.hpp
@@ -112,11 +112,13 @@ template <typename T>
std::nullopt) noexcept -> std::optional<EntityName> {
try {
bool const is_file = s0 == EntityName::kFileLocationMarker;
+ bool const is_glob = s0 == EntityName::kGlobMarker;
+ bool const is_symlink = s0 == EntityName::kSymlinkLocationMarker;
auto const ref_type =
- s0 == EntityName::kFileLocationMarker
- ? ReferenceType::kFile
- : (s0 == EntityName::kGlobMarker ? ReferenceType::kGlob
- : ReferenceType::kTree);
+ is_file ? ReferenceType::kFile
+ : (is_glob ? ReferenceType::kGlob
+ : (is_symlink ? ReferenceType::kSymlink
+ : ReferenceType::kTree));
if (list_size == 3) {
if (IsString(list[2])) {
auto const& name = GetString(list[2]);
@@ -232,7 +234,8 @@ template <typename T>
}
else if (s0 == EntityName::kFileLocationMarker or
s0 == EntityName::kTreeLocationMarker or
- s0 == EntityName::kGlobMarker) {
+ s0 == EntityName::kGlobMarker or
+ s0 == EntityName::kSymlinkLocationMarker) {
return ParseEntityNameFSReference(
s0, list, list_size, current, logger);
}
diff --git a/src/buildtool/build_engine/base_maps/entity_name_data.hpp b/src/buildtool/build_engine/base_maps/entity_name_data.hpp
index c44be2b3..0de1b48f 100644
--- a/src/buildtool/build_engine/base_maps/entity_name_data.hpp
+++ b/src/buildtool/build_engine/base_maps/entity_name_data.hpp
@@ -38,7 +38,13 @@ struct AnonymousTarget {
}
};
-enum class ReferenceType : std::int8_t { kTarget, kFile, kTree, kGlob };
+enum class ReferenceType : std::int8_t {
+ kTarget,
+ kFile,
+ kTree,
+ kGlob,
+ kSymlink
+};
struct NamedTarget {
std::string repository{};
@@ -80,6 +86,7 @@ class EntityName {
static constexpr auto kFileLocationMarker = "FILE";
static constexpr auto kTreeLocationMarker = "TREE";
static constexpr auto kGlobMarker = "GLOB";
+ static constexpr auto kSymlinkLocationMarker = "SYMLINK";
static constexpr auto kRelativeLocationMarker = "./";
static constexpr auto kAnonymousMarker = "#";
@@ -137,6 +144,9 @@ class EntityName {
else if (x.reference_t == ReferenceType::kGlob) {
j.push_back(kGlobMarker);
}
+ else if (x.reference_t == ReferenceType::kSymlink) {
+ j.push_back(kSymlinkLocationMarker);
+ }
j.push_back(x.module);
j.push_back(x.name);
}
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp
index d2e73f07..99f6d9f0 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -1471,6 +1471,17 @@ void TreeTarget(
.config = Configuration{}});
}
+ for (const auto& x : dir_entries.SymlinksIterator()) {
+ v.emplace_back(ConfiguredTarget{
+ .target =
+ BuildMaps::Base::EntityName{
+ target.repository,
+ dir_name,
+ x,
+ BuildMaps::Base::ReferenceType::kSymlink},
+ .config = Configuration{}});
+ }
+
for (const auto& x : dir_entries.DirectoriesIterator()) {
v.emplace_back(ConfiguredTarget{
.target =
@@ -1573,6 +1584,15 @@ void GlobTargetWithDirEntry(
BuildMaps::Base::ReferenceType::kFile});
}
}
+ for (auto const& x : dir.SymlinksIterator()) {
+ if (fnmatch(pattern.c_str(), x.c_str(), 0) == 0) {
+ matches.emplace_back(BuildMaps::Base::EntityName{
+ target.repository,
+ target.module,
+ x,
+ BuildMaps::Base::ReferenceType::kSymlink});
+ }
+ }
source_target_map->ConsumeAfterKeysReady(
ts,
matches,
@@ -1645,6 +1665,23 @@ auto CreateTargetMap(
});
}
else if (key.target.GetNamedTarget().reference_t ==
+ BuildMaps::Base::ReferenceType::kSymlink) {
+ // Not a defined target, treat as source target
+ source_target_map->ConsumeAfterKeysReady(
+ ts,
+ {key.target},
+ [setter](auto values) {
+ (*setter)(AnalysedTargetPtr{*values[0]});
+ },
+ [logger, target = key.target](auto const& msg, auto fatal) {
+ (*logger)(fmt::format("While analysing target {} as "
+ "symlink:\n{}",
+ target.ToString(),
+ msg),
+ fatal);
+ });
+ }
+ else if (key.target.GetNamedTarget().reference_t ==
BuildMaps::Base::ReferenceType::kGlob) {
auto wrapped_logger = std::make_shared<AsyncMapConsumerLogger>(
[logger, target = key.target](auto const& msg, bool fatal) {
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index 288101f5..5589b0e0 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -1238,6 +1238,9 @@ auto DetermineNonExplicitTarget(
case Base::ReferenceType::kGlob:
std::cout << id.ToString() << " is a glob." << std::endl;
return std::nullopt;
+ case Base::ReferenceType::kSymlink:
+ std::cout << id.ToString() << " is a symlink." << std::endl;
+ return std::nullopt;
case Base::ReferenceType::kTarget:
return id;
}