Skip to content

Commit fe2f3e8

Browse files
committed
feat(app): expand vix.app manifest and CMake generation
2 parents d400d3d + de566ee commit fe2f3e8

3 files changed

Lines changed: 823 additions & 67 deletions

File tree

include/vix/cli/app/AppManifest.hpp

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,72 @@ namespace vix::cli::app
6161
std::optional<AppTargetType> app_target_type_from_string(
6262
const std::string &value);
6363

64+
/**
65+
* @brief Package dependency declared in vix.app.
66+
*
67+
* Manifest syntax accepted by the parser:
68+
* - "<name>"
69+
* - "<name>:REQUIRED"
70+
* - "<name>:COMPONENTS=a,b"
71+
* - "<name>:COMPONENTS=a,b:REQUIRED"
72+
*
73+
* The order of `COMPONENTS=...` and `REQUIRED` does not matter.
74+
* Whitespace around components is trimmed.
75+
*/
76+
struct AppPackage
77+
{
78+
/**
79+
* @brief Package name as passed to CMake `find_package`.
80+
*/
81+
std::string name;
82+
83+
/**
84+
* @brief Optional component list.
85+
*/
86+
std::vector<std::string> components;
87+
88+
/**
89+
* @brief True when the package must be marked REQUIRED.
90+
*/
91+
bool required{false};
92+
};
93+
94+
/**
95+
* @brief Resource entry copied into the build output directory.
96+
*
97+
* Manifest syntax accepted by the parser:
98+
* - "<src>" copies `<src>` next to the built target,
99+
* preserving the basename of `<src>`
100+
* - "<src>=<dest>" copies `<src>` to `<dest>` next to the
101+
* built target
102+
*
103+
* Paths are interpreted relative to the user project directory.
104+
*/
105+
struct AppResource
106+
{
107+
/**
108+
* @brief Source path relative to the user project directory.
109+
*/
110+
std::string source;
111+
112+
/**
113+
* @brief Destination path relative to the runtime output
114+
* directory of the target. May be empty to keep the source
115+
* basename.
116+
*/
117+
std::string destination;
118+
};
119+
64120
/**
65121
* @brief Simple C++ application manifest.
66122
*
67123
* This structure represents the content of a vix.app file.
68124
* It is intentionally small and exists only as a user-friendly
69125
* layer above the internal generated CMake project.
126+
*
127+
* Backward compatibility:
128+
* Manifests using only `name`, `type`, `standard`, `sources`,
129+
* `include_dirs`, `defines` and `links` are still fully supported.
70130
*/
71131
struct AppManifest
72132
{
@@ -84,9 +144,12 @@ namespace vix::cli::app
84144
* @brief C++ standard value.
85145
*
86146
* Example values:
147+
* - c++11
148+
* - c++14
87149
* - c++17
88150
* - c++20
89151
* - c++23
152+
* - c++26
90153
*/
91154
std::string standard{"c++20"};
92155

@@ -110,6 +173,40 @@ namespace vix::cli::app
110173
*/
111174
std::vector<std::string> links;
112175

176+
/**
177+
* @brief Raw compile options forwarded to the compiler.
178+
*/
179+
std::vector<std::string> compileOptions;
180+
181+
/**
182+
* @brief Raw link options forwarded to the linker.
183+
*/
184+
std::vector<std::string> linkOptions;
185+
186+
/**
187+
* @brief CMake `target_compile_features` entries (for example
188+
* `cxx_std_20`, `cxx_constexpr`).
189+
*/
190+
std::vector<std::string> compileFeatures;
191+
192+
/**
193+
* @brief External packages resolved with `find_package`.
194+
*/
195+
std::vector<AppPackage> packages;
196+
197+
/**
198+
* @brief Resources copied next to the built target.
199+
*/
200+
std::vector<AppResource> resources;
201+
202+
/**
203+
* @brief Optional output directory relative to the build tree.
204+
*
205+
* When set, the runtime, library and archive output directories
206+
* of the generated target are pointed at this location.
207+
*/
208+
std::string outputDir;
209+
113210
/**
114211
* @brief Returns true when the manifest has the minimum valid fields.
115212
*

0 commit comments

Comments
 (0)