]> git.sesse.net Git - x264/blobdiff - tools/msvsdepend.sh
x86inc: Improve handling of %ifid with multi-token parameters
[x264] / tools / msvsdepend.sh
index 4d054eb2964551de389df7712f008aabdeef068a..568f6112fabaf37e8a44559a886d3cfebd4fd449 100755 (executable)
@@ -1,21 +1,44 @@
 #!/bin/sh
-# There's a lot of things going on here
-# expected arguments are $(CC) $(CFLAGS) $(SRC) $(OBJ)
-# 1) start the dependency line with the object argument
-# 2) need to add -Zs -showIncludes to the flags to have the compiler output list of include files without compilation
-# 3) look for notes in the output that start with "Note: including file:"
-# 4) retain only the filepath from the notes
-# 5) convert \ foldername separators to /
-# 6) escape spaces in the filepath
-# 7) remove system includes (hack: check for "/Program Files" string in filepath)
-# 8) sort and remove duplicate filepath entries
-# 9) convert newlines to spaces to collapse the dependencies into the one dependency line
-# 10) print a newline character, to properly separate dependency lines
-echo -n "$4: "
-$1 $2 $3 -Zs -showIncludes 2>&1 |
-    grep '^Note: including file:' |
-    sed 's/^Note: including file:[[:space:]]*\(.*\)$/\1/; s/\\/\//g; s/ /\\ /g' |
-    sed '/\/[Pp]rogram\\ [Ff]iles/d' |
-    sort | uniq |
-    tr -s '\n\r' ' '
-echo ''
+
+# Output a Makefile rule describing the dependencies of a given source file.
+# Expected arguments are $(CC) $(CFLAGS) $(SRC) $(OBJ)
+
+set -f
+
+[ -n "$1" ] && [ -n "$3" ] && [ -n "$4" ] || exit 1
+
+# Add flags to only perform syntax checking and output a list of included files
+# Discard all output other than included files
+# Convert '\' directory separators to '/'
+# Remove system includes (hack: check for "/Program Files" string in path)
+# Add the source file itself as a dependency
+deps="$($1 $2 -nologo -showIncludes -W0 -Zs "$3" 2>&1 |
+        grep '^Note: including file:' |
+        sed 's/^Note: including file:[[:space:]]*\(.*\)$/\1/; s/\\/\//g' |
+        sed '/\/[Pp]rogram [Ff]iles/d')
+$3"
+
+# Convert Windows paths to Unix paths if possible
+if command -v cygpath >/dev/null 2>&1 ; then
+    IFS='
+'
+    deps="$(cygpath -u -- $deps)"
+fi
+
+# Escape characters as required to create valid Makefile file names
+escape() {
+    sed 's/ /\\ /g; s/#/\\#/g; s/\$/\$\$/g'
+}
+
+# Remove prefixes that are equal to the working directory
+# Sort and remove duplicate entries
+# Escape and collapse the dependencies into one line
+deps="$(printf '%s' "$deps" |
+        sed "s/^$(pwd | sed 's/\//\\\//g')\///; s/^\.\///" |
+        sort | uniq |
+        escape | tr -s '\n\r' ' ' | sed 's/^ *\(.*\) $/\1/')"
+
+# Escape the target file name as well
+target="$(printf '%s' "$4" | escape)"
+
+printf '%s: %s\n' "$target" "$deps"