Windows: Implement native binary launcher
The native launcher is implemented based on this design doc:
https://docs.google.com/document/d/1z6Xv95CJYNYNYylcRklA6xBeesNLc54dqXfri0z0e14/edit?usp=sharing
Change-Id: I83bae844f792a587ce0e342a3c0f238b760afeaa
PiperOrigin-RevId: 162736269
diff --git a/src/tools/launcher/bash_launcher.cc b/src/tools/launcher/bash_launcher.cc
new file mode 100644
index 0000000..e1203a3
--- /dev/null
+++ b/src/tools/launcher/bash_launcher.cc
@@ -0,0 +1,54 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "src/tools/launcher/bash_launcher.h"
+#include "src/tools/launcher/util/launcher_util.h"
+
+namespace bazel {
+namespace launcher {
+
+using std::ostringstream;
+using std::string;
+using std::vector;
+
+ExitCode BashBinaryLauncher::Launch() {
+ string bash_binary = this->GetLaunchInfoByKey(BASH_BIN_PATH);
+ // If specified bash binary path doesn't exist, then fall back to
+ // bash.exe and hope it's in PATH.
+ if (!DoesFilePathExist(bash_binary)) {
+ bash_binary = "bash.exe";
+ }
+
+ vector<string> origin_args = this->GetCommandlineArguments();
+ ostringstream bash_command;
+ string bash_main_file =
+ this->Rlocation(this->GetLaunchInfoByKey(BASH_MAIN_FILE));
+ bash_command << GetEscapedArgument(bash_main_file);
+ for (int i = 1; i < origin_args.size(); i++) {
+ bash_command << ' ';
+ bash_command << GetEscapedArgument(origin_args[i]);
+ }
+
+ vector<string> args;
+ args.push_back("-c");
+ args.push_back(bash_command.str());
+ return this->LaunchProcess(bash_binary, args);
+}
+
+} // namespace launcher
+} // namespace bazel