Skip to content

Commit ac15d0e

Browse files
committed
Enhance metadata generation by adding directory creation and error handling for umbrella header output
1 parent e6ace9f commit ac15d0e

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

metadata-generator/src/main.cpp

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
#include <cstdio>
44
#include <cstdlib>
5+
#include <cstring>
6+
#include <filesystem>
7+
#include <fstream>
58
#include <iostream>
69
#include <sstream>
710
#include <string>
@@ -187,9 +190,35 @@ int main(int argc, char** argv) {
187190
}
188191
}
189192

190-
auto umbrellaHeader = std::fopen(umbrellaHeaderName.c_str(), "w");
191-
std::fwrite(code.data(), 1, code.size(), umbrellaHeader);
192-
std::fclose(umbrellaHeader);
193+
std::error_code umbrellaDirError;
194+
std::filesystem::path umbrellaPath(umbrellaHeaderName);
195+
if (!umbrellaPath.parent_path().empty()) {
196+
std::filesystem::create_directories(umbrellaPath.parent_path(),
197+
umbrellaDirError);
198+
if (umbrellaDirError) {
199+
std::cerr << "Failed to create umbrella output directory: "
200+
<< umbrellaPath.parent_path() << " ("
201+
<< umbrellaDirError.message() << ")" << std::endl;
202+
std::exit(1);
203+
}
204+
}
205+
206+
std::ofstream umbrellaHeader(
207+
umbrellaHeaderName, std::ios::out | std::ios::binary | std::ios::trunc);
208+
if (!umbrellaHeader.is_open()) {
209+
std::cerr << "Failed to open umbrella header for writing: "
210+
<< umbrellaHeaderName << " (" << std::strerror(errno) << ")"
211+
<< std::endl;
212+
std::exit(1);
213+
}
214+
215+
umbrellaHeader.write(code.data(), static_cast<std::streamsize>(code.size()));
216+
if (!umbrellaHeader) {
217+
std::cerr << "Failed to write umbrella header: " << umbrellaHeaderName
218+
<< std::endl;
219+
std::exit(1);
220+
}
221+
umbrellaHeader.close();
193222

194223
std::vector<const char*> argsC(args.size());
195224
for (size_t i = 0; i < args.size(); ++i) {

scripts/metagen.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,10 @@ async function main() {
312312
}
313313

314314
const typesDir = path.resolve(__dirname, "..", "packages", sdkName, "types");
315+
const metadataDir = path.resolve(__dirname, "..", "metadata-generator", "metadata");
315316
await fsp.rm(typesDir, { recursive: true, force: true });
316317
await fsp.mkdir(typesDir, { recursive: true });
318+
await fsp.mkdir(metadataDir, { recursive: true });
317319

318320
for (const arch of Object.keys(sdk.targets)) {
319321
// Use the matching arch binary when available, falling back to arm64.
@@ -357,18 +359,12 @@ async function main() {
357359
"-verbose",
358360
"-output-bin",
359361
path.resolve(
360-
__dirname,
361-
"..",
362-
"metadata-generator",
363-
"metadata",
362+
metadataDir,
364363
`metadata.${sdkName}.${arch}.nsmd`,
365364
),
366365
"-output-umbrella",
367366
path.resolve(
368-
__dirname,
369-
"..",
370-
"metadata-generator",
371-
"metadata",
367+
metadataDir,
372368
`metadata.${sdkName}.${arch}.h`,
373369
),
374370
"Xclang",

0 commit comments

Comments
 (0)