]> git.sesse.net Git - x264/commitdiff
cygwin: Enable MSVS support
authorHenrik Gramner <henrik@gramner.com>
Sat, 8 Aug 2015 20:26:38 +0000 (22:26 +0200)
committerAnton Mitrofanov <BugMaster@narod.ru>
Tue, 18 Aug 2015 22:00:24 +0000 (01:00 +0300)
`cl -showIncludes` creates absolute Windows paths for some files, attempt
to convert those to Unix paths.

Use relative paths for dependencies located in or below the working directory
in order to mimic the behavior of gcc and to make the paths more readable.

Make the dependency generation script a bit more robust in general.

configure
tools/msvsdepend.sh

index 486b1a9aef10bdc65f3ab6f1587e1ee51ec46dd2..70aa07f212690bfb7b9119784b35d9dc7fb065d0 100755 (executable)
--- a/configure
+++ b/configure
@@ -527,8 +527,6 @@ if [[ $host_os = mingw* || $host_os = cygwin* ]]; then
         fi
     elif [[ "$cc_base" = cl || "$cc_base" = cl[\ .]* ]]; then
         # Standard Microsoft Visual Studio
-        # Dependency creation includes absolute windows paths, Cygwin's make does not support Windows paths.
-        [[ $host_os = cygwin* ]] && die "Microsoft Visual Studio support requires MSYS"
         compiler=CL
         compiler_style=MS
         CFLAGS="$CFLAGS -nologo -DHAVE_STRING_H -I\$(SRCPATH)/extras"
@@ -591,7 +589,7 @@ case $host_os in
         ;;
     cygwin*)
         EXE=".exe"
-        if cc_check "" -mno-cygwin; then
+        if [ $compiler_style = GNU ] && cc_check "" -mno-cygwin; then
             CFLAGS="$CFLAGS -mno-cygwin"
             LDFLAGS="$LDFLAGS -mno-cygwin"
         fi
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"