diff options
author | Shinichiro Hamaji <hamaji@google.com> | 2016-01-06 04:29:24 +0000 |
---|---|---|
committer | Shinichiro Hamaji <hamaji@google.com> | 2016-01-06 04:29:24 +0000 |
commit | 2d0ebbf5124d8245e9b4780f55620fdebc262643 (patch) | |
tree | 20ab8bf6c8fd1a7c34c773c72f13f33f476819c5 | |
parent | 70f882d297edc5156e8d709d81a19361de13fcd9 (diff) | |
download | android_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.cc | 10 | ||||
-rw-r--r-- | eval.cc | 5 | ||||
-rw-r--r-- | func.cc | 7 | ||||
-rw-r--r-- | ninja.cc | 34 | ||||
-rw-r--r-- | testcase/err_semicolon.mk | 1 | ||||
-rw-r--r-- | testcase/err_semicolon2.mk | 2 | ||||
-rw-r--r-- | testcase/err_semicolon3.mk | 3 | ||||
-rw-r--r-- | testcase/err_semicolon4.mk | 1 | ||||
-rw-r--r-- | testcase/expanded_nl.mk | 8 | ||||
-rwxr-xr-x | testcase/ninja_regen.sh | 21 | ||||
-rwxr-xr-x | testcase/ninja_regen_find_link.sh | 7 |
11 files changed, 77 insertions, 22 deletions
@@ -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) { @@ -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; @@ -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 += "$("; @@ -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 |