aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShinichiro Hamaji <hamaji@google.com>2016-01-06 04:29:24 +0000
committerShinichiro Hamaji <hamaji@google.com>2016-01-06 04:29:24 +0000
commit2d0ebbf5124d8245e9b4780f55620fdebc262643 (patch)
tree20ab8bf6c8fd1a7c34c773c72f13f33f476819c5
parent70f882d297edc5156e8d709d81a19361de13fcd9 (diff)
downloadandroid_build_kati-2d0ebbf5124d8245e9b4780f55620fdebc262643.tar.gz
android_build_kati-2d0ebbf5124d8245e9b4780f55620fdebc262643.tar.bz2
android_build_kati-2d0ebbf5124d8245e9b4780f55620fdebc262643.zip
Revert "Revert "Merge remote-tracking branch 'aosp/upstream'""
This reverts commit 70f882d297edc5156e8d709d81a19361de13fcd9. Change-Id: Ic8df8bf22c23215d1f3b79f93a9ae67d0037899d
-rw-r--r--command.cc10
-rw-r--r--eval.cc5
-rw-r--r--func.cc7
-rw-r--r--ninja.cc34
-rw-r--r--testcase/err_semicolon.mk1
-rw-r--r--testcase/err_semicolon2.mk2
-rw-r--r--testcase/err_semicolon3.mk3
-rw-r--r--testcase/err_semicolon4.mk1
-rw-r--r--testcase/expanded_nl.mk8
-rwxr-xr-xtestcase/ninja_regen.sh21
-rwxr-xr-xtestcase/ninja_regen_find_link.sh7
11 files changed, 77 insertions, 22 deletions
diff --git a/command.cc b/command.cc
index 99984c2..ac7fadd 100644
--- a/command.cc
+++ b/command.cc
@@ -70,6 +70,7 @@ DECLARE_AUTO_VAR_CLASS(AutoLessVar);
DECLARE_AUTO_VAR_CLASS(AutoHatVar);
DECLARE_AUTO_VAR_CLASS(AutoPlusVar);
DECLARE_AUTO_VAR_CLASS(AutoStarVar);
+DECLARE_AUTO_VAR_CLASS(AutoNotImplementedVar);
class AutoSuffixDVar : public AutoVar {
public:
@@ -128,6 +129,11 @@ void AutoStarVar::Eval(Evaluator*, string* s) const {
pat.Stem(n->output.str()).AppendToString(s);
}
+void AutoNotImplementedVar::Eval(Evaluator* ev, string*) const {
+ ev->Error(StringPrintf(
+ "Automatic variable `$%s' isn't supported yet", sym_));
+}
+
void AutoSuffixDVar::Eval(Evaluator* ev, string* s) const {
string buf;
wrapped_->Eval(ev, &buf);
@@ -177,6 +183,10 @@ CommandEvaluator::CommandEvaluator(Evaluator* ev)
INSERT_AUTO_VAR(AutoHatVar, "^");
INSERT_AUTO_VAR(AutoPlusVar, "+");
INSERT_AUTO_VAR(AutoStarVar, "*");
+ // TODO: Implement them.
+ INSERT_AUTO_VAR(AutoNotImplementedVar, "%");
+ INSERT_AUTO_VAR(AutoNotImplementedVar, "?");
+ INSERT_AUTO_VAR(AutoNotImplementedVar, "|");
}
void CommandEvaluator::Eval(DepNode* n, vector<Command*>* commands) {
diff --git a/eval.cc b/eval.cc
index 3c0eae2..ae41567 100644
--- a/eval.cc
+++ b/eval.cc
@@ -115,8 +115,11 @@ void Evaluator::EvalRule(const RuleStmt* stmt) {
const string&& expr = stmt->expr->Eval(this);
// See semicolon.mk.
- if (expr.find_first_not_of(" \t\n;") == string::npos)
+ if (expr.find_first_not_of(" \t;") == string::npos) {
+ if (stmt->term == ';')
+ Error("*** missing rule before commands.");
return;
+ }
Rule* rule;
RuleVarAssignment rule_var;
diff --git a/func.cc b/func.cc
index 2e6eb99..39af0e9 100644
--- a/func.cc
+++ b/func.cc
@@ -547,10 +547,9 @@ void ShellFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
string cmd = args[0]->Eval(ev);
if (ev->avoid_io() && !HasNoIoInShellScript(cmd)) {
if (ev->eval_depth() > 1) {
- // TODO: Make this an error.
- WARN("%s:%d: kati doesn't support passing results of $(shell) "
- "to other make constructs: %s",
- LOCF(ev->loc()), cmd.c_str());
+ ERROR("%s:%d: kati doesn't support passing results of $(shell) "
+ "to other make constructs: %s",
+ LOCF(ev->loc()), cmd.c_str());
}
StripShellComment(&cmd);
*s += "$(";
diff --git a/ninja.cc b/ninja.cc
index 15f938c..c638267 100644
--- a/ninja.cc
+++ b/ninja.cc
@@ -191,6 +191,14 @@ class NinjaGenerator {
GenerateStamp(orig_args);
}
+ static string GetNinjaFilename() {
+ return GetFilename("build%s.ninja");
+ }
+
+ static string GetShellScriptFilename() {
+ return GetFilename("ninja%s.sh");
+ }
+
static string GetStampFilename() {
return GetFilename(".kati_stamp%s");
}
@@ -554,15 +562,7 @@ class NinjaGenerator {
fprintf(fp_, "\n\n");
}
- string GetNinjaFilename() const {
- return GetFilename("build%s.ninja");
- }
-
- string GetShellScriptFilename() const {
- return GetFilename("ninja%s.sh");
- }
-
- string GetEnvScriptFilename() const {
+ static string GetEnvScriptFilename() {
return GetFilename("env%s.sh");
}
@@ -605,7 +605,10 @@ class NinjaGenerator {
EmitNode(node);
}
- for (Symbol e : Vars::used_env_vars()) {
+ unordered_set<Symbol> used_env_vars(Vars::used_env_vars());
+ // PATH changes $(shell).
+ used_env_vars.insert(Intern("PATH"));
+ for (Symbol e : used_env_vars) {
StringPiece val(getenv(e.c_str()));
used_envs_.emplace(e.str(), val.as_string());
}
@@ -805,6 +808,17 @@ bool NeedsRegen(double start_time, const string& orig_args) {
} \
})
+ if (!Exists(NinjaGenerator::GetNinjaFilename())) {
+ fprintf(stderr, "%s is missing, regenerating...\n",
+ NinjaGenerator::GetNinjaFilename().c_str());
+ return true;
+ }
+ if (!Exists(NinjaGenerator::GetShellScriptFilename())) {
+ fprintf(stderr, "%s is missing, regenerating...\n",
+ NinjaGenerator::GetShellScriptFilename().c_str());
+ return true;
+ }
+
const string& stamp_filename = NinjaGenerator::GetStampFilename();
FILE* fp = fopen(stamp_filename.c_str(), "rb+");
if (!fp) {
diff --git a/testcase/err_semicolon.mk b/testcase/err_semicolon.mk
index 2e244ce..f85826a 100644
--- a/testcase/err_semicolon.mk
+++ b/testcase/err_semicolon.mk
@@ -1,3 +1,2 @@
-# TODO(c): fix error message
# This is an error. See also semicolon.mk
;
diff --git a/testcase/err_semicolon2.mk b/testcase/err_semicolon2.mk
new file mode 100644
index 0000000..9b3bde1
--- /dev/null
+++ b/testcase/err_semicolon2.mk
@@ -0,0 +1,2 @@
+a;
+
diff --git a/testcase/err_semicolon3.mk b/testcase/err_semicolon3.mk
new file mode 100644
index 0000000..ba3f501
--- /dev/null
+++ b/testcase/err_semicolon3.mk
@@ -0,0 +1,3 @@
+# TODO(go): Fix
+
+ ;
diff --git a/testcase/err_semicolon4.mk b/testcase/err_semicolon4.mk
new file mode 100644
index 0000000..2dd21f2
--- /dev/null
+++ b/testcase/err_semicolon4.mk
@@ -0,0 +1 @@
+;
diff --git a/testcase/expanded_nl.mk b/testcase/expanded_nl.mk
new file mode 100644
index 0000000..b5ff7c4
--- /dev/null
+++ b/testcase/expanded_nl.mk
@@ -0,0 +1,8 @@
+# TODO(go): Fix
+
+define nl
+
+
+endef
+
+$(nl)
diff --git a/testcase/ninja_regen.sh b/testcase/ninja_regen.sh
index 1755eb2..7f9b35e 100755
--- a/testcase/ninja_regen.sh
+++ b/testcase/ninja_regen.sh
@@ -20,7 +20,7 @@ log=/tmp/log
mk="$@"
sleep_if_necessary() {
- if [ x$(uname) != x"Linux" ]; then
+ if [ x$(uname) != x"Linux" -o x"${TRAVIS}" != x"" ]; then
sleep "$@"
fi
}
@@ -51,7 +51,7 @@ EOF
${mk} 2> ${log}
if [ -e ninja.sh ]; then
if ! grep regenerating ${log} > /dev/null; then
- echo 'Should be regenerated'
+ echo 'Should be regenerated (Makefile)'
fi
./ninja.sh
fi
@@ -60,7 +60,7 @@ export VAR=fuga
${mk} 2> ${log}
if [ -e ninja.sh ]; then
if ! grep regenerating ${log} > /dev/null; then
- echo 'Should be regenerated'
+ echo 'Should be regenerated (env changed)'
fi
./ninja.sh
fi
@@ -69,7 +69,16 @@ export VAR2=OK
${mk} 2> ${log}
if [ -e ninja.sh ]; then
if ! grep regenerating ${log} > /dev/null; then
- echo 'Should be regenerated'
+ echo 'Should be regenerated (env added)'
+ fi
+ ./ninja.sh
+fi
+
+export PATH=/random_path:$PATH
+${mk} 2> ${log}
+if [ -e ninja.sh ]; then
+ if ! grep regenerating ${log} > /dev/null; then
+ echo 'Should be regenerated (PATH changed)'
fi
./ninja.sh
fi
@@ -79,7 +88,7 @@ touch PASS.mk
${mk} 2> ${log}
if [ -e ninja.sh ]; then
if ! grep regenerating ${log} > /dev/null; then
- echo 'Should be regenerated'
+ echo 'Should be regenerated (wildcard)'
fi
./ninja.sh
fi
@@ -97,7 +106,7 @@ fi
${mk} other 2> ${log}
if [ -e ninja.sh ]; then
if ! grep regenerating ${log} >/dev/null; then
- echo 'Should be regenerated'
+ echo 'Should be regenerated (argument)'
fi
./ninja.sh other
fi
diff --git a/testcase/ninja_regen_find_link.sh b/testcase/ninja_regen_find_link.sh
index 94a6bb1..657f8ae 100755
--- a/testcase/ninja_regen_find_link.sh
+++ b/testcase/ninja_regen_find_link.sh
@@ -16,6 +16,12 @@
set -e
+sleep_if_necessary() {
+ if [ x"${TRAVIS}" != x"" ]; then
+ sleep "$@"
+ fi
+}
+
mk="$@"
if echo "${mk}" | grep kati > /dev/null; then
mk="${mk} --use_find_emulator"
@@ -36,6 +42,7 @@ touch dir1/file1 dir2/file2
ln -s ../../dir1 linkdir/d/link
build
+sleep_if_necessary 1
touch dir1/file1_2
build