cygpath does not work properly in Makefile

Corinna Vinschen corinna-cygwin@cygwin.com
Tue Jul 22 10:16:00 GMT 2014


On Jul 22 11:24, Gökçe Aydos wrote:
> On 2014-07-21 13:23, Marco Atzeri wrote:
> >I presume the make you are using is not cygwin one
> >as the first form is understandable only by cygwin programs
> 
> I do not see a difference between the two lines, because the command
> "cygpath" is used in both. I want to add that I get the behavior both under
> Cygwin64 terminal and in Win command prompt with bash. If the cygpath is run
> embedded in another function, it does not produce a usable path for Windows
> programs.

It's not cygpath at fault here.  It's how make works.  Your patsubst
with a shell call in the replacement string simply doesn't work as
intended.

For testing purposes, replace cygpath with this simple test application:

$ cat > mycygpath.c <<EOF
#include <stdio.h>

int
main (int argc, char **argv)
{
  int i;
  for (i = 1; i < argc; ++i)
    {
      fprintf (stderr, "ARGV[%d] = '%s'\n", i, argv[i]);
      if (argv[i][0] == '-')
      	continue;
      if (argv[i][0] == '/')
      	{
	  if (!strncmp (argv[i], "/cygdrive/c/", 7))
	    printf ("C:/%s\n", argv[i] + 7);
	  else
	    printf ("C:/cygwin64/%s\n", argv[i] + 1);
	}
      else if (!strncmp (argv[i], "./", 2))
      	printf ("%s\n", argv[i] + 2);
      else
      	printf ("%s\n", argv[i]);
    }
  return 0;
}
EOF

It works exactly as cygpath for your testcase, but additionally
it reproduces the exact incoming argument string on stderr:

$ gcc -o mycygpath mycygpath.c
$ ./mycygpath lib1 ./relative.vhd /cygdrive/c/Windows/absolute.vhd
ARGV[1] = 'lib1'
lib1
ARGV[2] = './relative.vhd'
relative.vhd
ARGV[3] = '/cygdrive/c/Windows/absolute.vhd'
C:/Windows/absolute.vhd

Now change your Makefile like this:

$ cat > Makefile <<EOF
FILES = lib1 ./relative.vhd \
        lib2 /cygdrive/c/Windows/absolute.vhd

convert_absolute_paths_to_windows_paths:
        @echo 1: $(patsubst /%,$(shell ./mycygpath -m /%),$(FILES))
        @echo 2: $(shell ./mycygpath -m $(FILES))
EOF

And now run make:

$ make
ARGV[1] = '-m'
ARGV[2] = '/%'
ARGV[1] = '-m'
ARGV[2] = 'lib1'
ARGV[3] = './relative.vhd'
ARGV[4] = 'lib2'
ARGV[5] = '/cygdrive/c/Windows/absolute.vhd'
1: lib1 ./relative.vhd lib2 C:/cygwin64/cygdrive/c/Windows/absolute.vhd
2: lib1 relative.vhd lib2 C:/Windows/absolute.vhd

Observe what make gives to the first mycygpath call.  cygpath gets
a literal "/%" string.  mycygpath as well as cygpath will *correctly*
generate "C:/cygwin64/%", and then, *after* the call to $(shell), the
% substitution of patsubst will be performed.


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20140722/ac9dbfeb/attachment.sig>


More information about the Cygwin mailing list