Use correct path to generated binary for EXECUTABLE target The output_dir property of Target can be left empty. In that case the EXECUTABLE is created in the default_output_dir defined in the tool used for creating the final binary. Fix the Xcode project generator to respect this. Bug: 158 Change-Id: I40aa864381fec65620ed14cc646f16b600fb7c28 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/9020 Commit-Queue: Sylvain Defresne <sdefresne@chromium.org> Reviewed-by: Nico Weber <thakis@chromium.org>
diff --git a/src/gn/xcode_writer.cc b/src/gn/xcode_writer.cc index c1a8538..ee8c84d 100644 --- a/src/gn/xcode_writer.cc +++ b/src/gn/xcode_writer.cc
@@ -30,6 +30,7 @@ #include "gn/scheduler.h" #include "gn/settings.h" #include "gn/source_file.h" +#include "gn/substitution_writer.h" #include "gn/target.h" #include "gn/value.h" #include "gn/variables.h" @@ -864,8 +865,25 @@ Err* err) { DCHECK_EQ(target->output_type(), Target::EXECUTABLE); - const std::string output_dir = RebasePath(target->output_dir().value(), - build_settings_->build_dir()); + std::string output_dir = target->output_dir().value(); + if (output_dir.empty()) { + const Tool* tool = target->toolchain()->GetToolForTargetFinalOutput(target); + if (!tool) { + std::string tool_name = Tool::GetToolTypeForTargetFinalOutput(target); + *err = Err(nullptr, tool_name + " tool not defined", + "The toolchain " + + target->toolchain()->label().GetUserVisibleName(false) + + " used by target " + + target->label().GetUserVisibleName(false) + + " doesn't define a \"" + tool_name + "\" tool."); + return nullptr; + } + output_dir = SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( + target, tool, tool->default_output_dir()) + .value(); + } else { + output_dir = RebasePath(output_dir, build_settings_->build_dir()); + } return project_.AddNativeTarget( target->label().name(), "compiled.mach-o.executable",