Index: runtime/bin/gen_snapshot.cc |
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc |
index aca6e2388d0117b88cf60c969c02f45118ad0e0a..39734f559f728f50f1d7092f54725d83f88c1fc6 100644 |
--- a/runtime/bin/gen_snapshot.cc |
+++ b/runtime/bin/gen_snapshot.cc |
@@ -716,51 +716,16 @@ static Builtin::BuiltinLibraryId BuiltinId(const char* url) { |
} |
-static bool WriteDependencies(const char* target, |
- File* file, |
- MallocGrowableArray<char*>* dependencies) { |
- bool success = true; |
- success &= file->Print("%s: ", target); |
- |
- if (snapshot_kind == kScript) { |
- if (vm_snapshot_data_filename != NULL) { |
- success &= file->Print("%s ", vm_snapshot_data_filename); |
- } |
- if (vm_snapshot_instructions_filename != NULL) { |
- success &= file->Print("%s ", vm_snapshot_instructions_filename); |
- } |
- if (isolate_snapshot_data_filename != NULL) { |
- success &= file->Print("%s ", isolate_snapshot_data_filename); |
- } |
- if (isolate_snapshot_instructions_filename != NULL) { |
- success &= file->Print("%s ", isolate_snapshot_instructions_filename); |
- } |
- } |
- |
- for (intptr_t i = 0; i < dependencies->length(); i++) { |
- success &= file->Print("%s ", dependencies->At(i)); |
- } |
- |
- success &= file->Print("\n"); |
- return success; |
-} |
- |
- |
-static void CreateAndWriteDependenciesFile() { |
- IsolateData* isolate_data = |
- reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); |
- MallocGrowableArray<char*>* dependencies = isolate_data->dependencies(); |
- if (dependencies == NULL) { |
- return; |
- } |
+// Generates a depfile like gcc -M -MF. Must be consumable by Ninja. |
+class DependenciesFileWriter : public ValueObject { |
+ public: |
+ DependenciesFileWriter() : dependencies_(NULL), file_(NULL), success_(true) {} |
- Loader::ResolveDependenciesAsFilePaths(); |
+ void WriteDependencies(MallocGrowableArray<char*>* dependencies) { |
+ dependencies_ = dependencies; |
- ASSERT((dependencies_filename != NULL) || print_dependencies); |
- if (dependencies_filename != NULL) { |
- bool success = true; |
- File* file = File::Open(dependencies_filename, File::kWriteTruncate); |
- if (file == NULL) { |
+ file_ = File::Open(dependencies_filename, File::kWriteTruncate); |
+ if (file_ == NULL) { |
Log::PrintErr("Error: Unable to open dependencies file: %s\n\n", |
dependencies_filename); |
exit(kErrorExitCode); |
@@ -771,37 +736,101 @@ static void CreateAndWriteDependenciesFile() { |
// output files. |
switch (snapshot_kind) { |
case kCore: |
- success &= |
- WriteDependencies(vm_snapshot_data_filename, file, dependencies); |
- // success &= WriteDependencies(isolate_snapshot_data_filename, file, |
- // dependencies); |
+ WriteDependenciesWithTarget(vm_snapshot_data_filename); |
+ // WriteDependenciesWithTarget(isolate_snapshot_data_filename); |
break; |
case kScript: |
- success &= |
- WriteDependencies(script_snapshot_filename, file, dependencies); |
+ WriteDependenciesWithTarget(script_snapshot_filename); |
break; |
case kAppAOTAssembly: |
- success &= WriteDependencies(assembly_filename, file, dependencies); |
+ WriteDependenciesWithTarget(assembly_filename); |
break; |
case kCoreJIT: |
case kAppAOTBlobs: |
- success &= |
- WriteDependencies(vm_snapshot_data_filename, file, dependencies); |
- // success &= WriteDependencies(vm_snapshot_instructions_filename, file, |
- // dependencies); |
- // success &= WriteDependencies(isolate_snapshot_data_filename, file, |
- // dependencies); |
- // success &= WriteDependencies(isolate_snapshot_instructions_filename, |
- // file, dependencies); |
+ WriteDependenciesWithTarget(vm_snapshot_data_filename); |
+ // WriteDependenciesWithTarget(vm_snapshot_instructions_filename); |
+ // WriteDependenciesWithTarget(isolate_snapshot_data_filename); |
+ // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename); |
break; |
} |
- if (!success) { |
+ if (!success_) { |
Log::PrintErr("Error: Unable to write dependencies file: %s\n\n", |
dependencies_filename); |
exit(kErrorExitCode); |
} |
- file->Release(); |
+ file_->Release(); |
+ } |
+ |
+ private: |
+ void WriteDependenciesWithTarget(const char* target) { |
+ WritePath(target); |
Chris Bracken
2017/07/01 00:47:54
It looks like we've just got one string for the ta
rmacnak
2017/07/05 16:51:04
Since all four files are generated by the same act
|
+ Write(": "); |
+ |
+ if (snapshot_kind == kScript) { |
+ if (vm_snapshot_data_filename != NULL) { |
+ WritePath(vm_snapshot_data_filename); |
+ } |
+ if (vm_snapshot_instructions_filename != NULL) { |
+ WritePath(vm_snapshot_instructions_filename); |
+ } |
+ if (isolate_snapshot_data_filename != NULL) { |
+ WritePath(isolate_snapshot_data_filename); |
+ } |
+ if (isolate_snapshot_instructions_filename != NULL) { |
+ WritePath(isolate_snapshot_instructions_filename); |
+ } |
+ } |
+ |
+ for (intptr_t i = 0; i < dependencies_->length(); i++) { |
+ WritePath(dependencies_->At(i)); |
+ } |
+ |
+ Write("\n"); |
+ } |
+ |
+ char* EscapePath(const char* path) { |
+ char* escaped_path = reinterpret_cast<char*>(malloc(strlen(path) * 2 + 1)); |
+ const char* read_cursor = path; |
+ char* write_cursor = escaped_path; |
+ while (*read_cursor != '\0') { |
+ if ((*read_cursor == ' ') || (*read_cursor == '\\')) { |
+ *write_cursor++ = '\\'; |
+ } |
+ *write_cursor++ = *read_cursor++; |
+ } |
+ *write_cursor = '\0'; |
+ return escaped_path; |
+ } |
+ |
+ void WritePath(const char* path) { |
+ char* escaped_path = EscapePath(path); |
+ success_ &= file_->Print("%s ", escaped_path); |
+ free(escaped_path); |
+ } |
+ |
+ void Write(const char* string) { success_ &= file_->Print("%s", string); } |
+ |
+ MallocGrowableArray<char*>* dependencies_; |
+ File* file_; |
+ bool success_; |
+}; |
+ |
+ |
+static void CreateAndWriteDependenciesFile() { |
+ IsolateData* isolate_data = |
+ reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); |
+ MallocGrowableArray<char*>* dependencies = isolate_data->dependencies(); |
+ if (dependencies == NULL) { |
+ return; |
+ } |
+ |
+ Loader::ResolveDependenciesAsFilePaths(); |
+ |
+ ASSERT((dependencies_filename != NULL) || print_dependencies); |
+ if (dependencies_filename != NULL) { |
+ DependenciesFileWriter writer; |
+ writer.WriteDependencies(dependencies); |
} |
if (print_dependencies) { |