From 07ffa9195dd83176ddb96bbfb1eca0a3ca938a8b Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Sat, 5 Mar 2011 16:27:25 -0800 Subject: 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...) --- build.ninja | 9 ++++++++- src/browse.cc | 17 +++-------------- src/browse.py | 4 +++- src/inline.sh | 29 +++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 16 deletions(-) create mode 100755 src/inline.sh 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 #include +#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 ";" + -- cgit v0.12