summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2011-03-06 00:27:25 (GMT)
committerEvan Martin <martine@danga.com>2011-03-07 19:31:11 (GMT)
commit07ffa9195dd83176ddb96bbfb1eca0a3ca938a8b (patch)
tree03b240b89fa2500cf8b6285ad8e2f7be277eb667
parent15d4695878749c3525c96e856ef08dfb19a2c3e5 (diff)
downloadNinja-07ffa9195dd83176ddb96bbfb1eca0a3ca938a8b.zip
Ninja-07ffa9195dd83176ddb96bbfb1eca0a3ca938a8b.tar.gz
Ninja-07ffa9195dd83176ddb96bbfb1eca0a3ca938a8b.tar.bz2
use a shell script to inline browse.py
Relying on the inline-assembly trick was cute but it didn't work on other platforms; relying on xxd will make us depend on xxd being available. Instead, inline browse.py into a header using a shell script. (Making this work required fixing multiple bugs in ninja...)
-rw-r--r--build.ninja9
-rw-r--r--src/browse.cc17
-rwxr-xr-xsrc/browse.py4
-rwxr-xr-xsrc/inline.sh29
4 files changed, 43 insertions, 16 deletions
diff --git a/build.ninja b/build.ninja
index 7f1963f..614936a 100644
--- a/build.ninja
+++ b/build.ninja
@@ -31,7 +31,14 @@ rule link
command = $cxx $conf_ldflags $ldflags -o $out $in
description = LINK $out
-build $builddir/browse.o: cxx src/browse.cc | src/browse.py
+rule inline
+ command = src/inline.sh $varname < $in > $out
+ description = INLINE $out
+
+build $builddir/browse_py.h: inline src/browse.py
+ varname = kBrowsePy
+
+build $builddir/browse.o: cxx src/browse.cc || $builddir/browse_py.h
build $builddir/build.o: cxx src/build.cc
build $builddir/build_log.o: cxx src/build_log.cc
build $builddir/eval_env.o: cxx src/eval_env.cc
diff --git a/src/browse.cc b/src/browse.cc
index 92b290d..db89db0 100644
--- a/src/browse.cc
+++ b/src/browse.cc
@@ -17,19 +17,9 @@
#include <stdio.h>
#include <unistd.h>
+#include "../build/browse_py.h"
#include "ninja.h"
-// Import browse.py as binary data.
-asm(
-".data\n"
-"browse_data_begin:\n"
-".incbin \"src/browse.py\"\n"
-"browse_data_end:\n"
-);
-// Declare the symbols defined above.
-extern const char browse_data_begin[];
-extern const char browse_data_end[];
-
void RunBrowsePython(State* state, const char* ninja_command) {
// Fork off a Python process and have it run our code via its stdin.
// (Actually the Python process becomes the parent.)
@@ -65,9 +55,8 @@ void RunBrowsePython(State* state, const char* ninja_command) {
close(pipefd[0]);
// Write the script file into the stdin of the Python process.
- const int browse_data_len = browse_data_end - browse_data_begin;
- int len = write(pipefd[1], browse_data_begin, browse_data_len);
- if (len < browse_data_len)
+ ssize_t len = write(pipefd[1], kBrowsePy, sizeof(kBrowsePy));
+ if (len < (ssize_t)sizeof(kBrowsePy))
perror("write");
close(pipefd[1]);
exit(0);
diff --git a/src/browse.py b/src/browse.py
index 92c7eaa..1860df3 100755
--- a/src/browse.py
+++ b/src/browse.py
@@ -26,7 +26,9 @@ import sys
import webbrowser
def match_strip(prefix, line):
- assert line.startswith(prefix)
+ if not line.startswith(prefix):
+ print prefix, line
+ assert line.startswith(prefix)
return line[len(prefix):]
def parse(text):
diff --git a/src/inline.sh b/src/inline.sh
new file mode 100755
index 0000000..e32f33d
--- /dev/null
+++ b/src/inline.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Copyright 2001 Google Inc. 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.
+
+# This quick script converts a text file into an #include-able header.
+# It expects the name of the variable as its first argument, and reads
+# stdin and writes stdout.
+
+varname="$1"
+echo "const char $varname[] ="
+IFS=
+while read line; do
+ escaped=$(echo "$line" | sed -e 's|\\|\\\\|g; s|"|\\"|g')
+ echo "\"$escaped\\n\""
+done
+echo ";"
+