Detect depfile renaming for commands without -MF
diff --git a/ninja.go b/ninja.go
index 57b6573..3ea4a73 100644
--- a/ninja.go
+++ b/ninja.go
@@ -30,17 +30,12 @@
}
}
-func getDepfile(ss string) (string, error) {
+func getDepfileImpl(ss string) (string, error) {
tss := ss + " "
if !strings.Contains(tss, " -MD ") && !strings.Contains(tss, " -MMD ") {
return "", nil
}
- // A hack for Android - llvm-rs-cc seems not to emit a dep file.
- if strings.Contains(ss, "bin/llvm-rs-cc ") {
- return "", nil
- }
-
mfIndex := strings.Index(ss, " -MF ")
if mfIndex >= 0 {
mf := trimLeftSpace(ss[mfIndex+4:])
@@ -52,19 +47,6 @@
mf = mf[:mfEndIndex]
}
- // A hack for Android to get .P files instead of .d.
- p := stripExt(mf) + ".P"
- if strings.Contains(ss, p) {
- return p, nil
- }
-
- // A hack for Android. For .s files, GCC does not use
- // C preprocessor, so it ignores -MF flag.
- as := "/" + stripExt(filepath.Base(mf)) + ".s"
- if strings.Contains(ss, as) {
- return "", nil
- }
-
return mf, nil
}
@@ -83,6 +65,33 @@
return stripExt(out) + ".d", nil
}
+func getDepfile(ss string) (string, error) {
+ // A hack for Android - llvm-rs-cc seems not to emit a dep file.
+ if strings.Contains(ss, "bin/llvm-rs-cc ") {
+ return "", nil
+ }
+
+ r, err := getDepfileImpl(ss)
+ if err != nil {
+ return r, err
+ }
+
+ // A hack for Android to get .P files instead of .d.
+ p := stripExt(r) + ".P"
+ if strings.Contains(ss, p) {
+ return p, nil
+ }
+
+ // A hack for Android. For .s files, GCC does not use
+ // C preprocessor, so it ignores -MF flag.
+ as := "/" + stripExt(filepath.Base(r)) + ".s"
+ if strings.Contains(ss, as) {
+ return "", nil
+ }
+
+ return r, nil
+}
+
func stripShellComment(s string) string {
if strings.IndexByte(s, '#') < 0 {
// Fast path.
diff --git a/ninja_test.go b/ninja_test.go
index 9ec90e5..f094ba0 100644
--- a/ninja_test.go
+++ b/ninja_test.go
@@ -107,6 +107,10 @@
in: `echo "RenderScript: Galaxy4 <= packages/wallpapers/Galaxy4/src/com/android/galaxy4/galaxy.rs" && rm -rf out/target/common/obj/APPS/Galaxy4_intermediates/src/renderscript && mkdir -p out/target/common/obj/APPS/Galaxy4_intermediates/src/renderscript/res/raw && mkdir -p out/target/common/obj/APPS/Galaxy4_intermediates/src/renderscript/src && out/host/linux-x86/bin/llvm-rs-cc -o out/target/common/obj/APPS/Galaxy4_intermediates/src/renderscript/res/raw -p out/target/common/obj/APPS/Galaxy4_intermediates/src/renderscript/src -d out/target/common/obj/APPS/Galaxy4_intermediates/src/renderscript -a out/target/common/obj/APPS/Galaxy4_intermediates/src/RenderScript.stamp -MD -target-api 14 -Wall -Werror -I prebuilts/sdk/renderscript/clang-include -I prebuilts/sdk/renderscript/include packages/wallpapers/Galaxy4/src/com/android/galaxy4/galaxy.rs && mkdir -p out/target/common/obj/APPS/Galaxy4_intermediates/src/ && touch out/target/common/obj/APPS/Galaxy4_intermediates/src/RenderScript.stamp`,
want: ``,
},
+ {
+ in: `(echo "bc: libclcore.bc <= frameworks/rs/driver/runtime/arch/generic.c") && (mkdir -p out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/) && (prebuilts/clang/linux-x86/host/3.6/bin/clang -Iframeworks/rs/scriptc -Iexternal/clang/lib/Headers -MD -DRS_VERSION=23 -std=c99 -c -O3 -fno-builtin -emit-llvm -target armv7-none-linux-gnueabi -fsigned-char -Iframeworks/rs/cpu_ref -DRS_DECLARE_EXPIRED_APIS -Xclang -target-feature -Xclang +long64 frameworks/rs/driver/runtime/arch/generic.c -o out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.bc) && (cp out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.d out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.P; sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' -e '/^$$/ d' -e 's/$$/ :/' < out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.d >> out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.P; rm -f out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.d)`,
+ want: `out/target/product/generic/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/arch/generic.P`,
+ },
} {
got, err := getDepfile(tc.in)
if got != tc.want {