make-w32
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: enhancement request for gmake


From: Rob Walker
Subject: Re: enhancement request for gmake
Date: Mon, 9 May 2011 10:16:38 -0700
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9

BrewMP ships with a make function that can be relied upon to get the
correct shortened name:

##########################################################################
# CMD_MODE
# set to yes if the shell from make is actually cmd.exe
##########################################################################
CMD_MODE:=$(if $(strip $(shell echo)),yes)


##########################################################################
# shortPath, equivalent to "cygpath -mas $1" under WinNT

shortPath=$(strip $(subst \,/,$(firstword $(subst \:cmdbug:, ,\
               $(if $(CMD_MODE),\
                  $(shell for %%g in ( "$1\:cmdbug:" ) do echo. %%~fsg),\
                  $(shell cmd /Q /C for %g in \( "$1\:cmdbug:" \) do
echo. %~fsg))))))


Pardon the extra line wraps...  If it's not valid make, remove a line feed.

-Rob


On 5/9/2011 9:51 AM, Rob Juergens wrote:
> In most Unix environments, the "cc" program has a switch to build either a 
> 32-bit or a 64-bit environment,
> For example "gcc -m32 ..." or "gcc -m64 ...".
> 
> However, in Windoze, there are separate programs that must be invoked:
> 
>       32 bit: C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe
>       64 bit: C:\Program Files\Microsoft Visual Studio 
> 9.0\VC\bin\x86_amd64\cl.exe
> 
> The result of this is that rather than depending on finding "cl.exe" in the 
> path, you have to specify the full path in your command line.  The problem 
> here is that the full path contains spaces, which really messes up gmake.
> 
> Now, Windoze has the ability to "shorten" a path, thus "Program Files" 
> becomes "Micros~1" or something similar, which has no spaces in it.  
> Unfortunately, you cannot hard-code this short path in a makefile, since how 
> the actual short name is created depends on what other files/directories are 
> in that directory.
> 
> My suggestion:
> 
> Add a new function "shortname", which in Windoze creates a short name of the 
> given name, and in all other environments just copies the name.  Thus, I can 
> then do the following:
> 
>       VSINSTALLDIR := $(strip $(shortname C:/Program Files/Microsoft Visual 
> Studio 9.0/VC/bin))
> 
> And then just invoke the command "$(VSINSTALLDIR)/cl.exe".
> 
> The only changes would be in function.c.  Here is the code:
> 
> #if _WIN32
> #include <windows.h>
> #endif
> 
> .....
> 
> static char *
> func_shortname (char *o, char **argv, const char *funcname)
> {
>   /* Expand the argument.  */
>   const char *p3 = argv[0];
>   const char *p2;
>   PATH_VAR(path);
>   int doneany=0;
>   unsigned int len=0;
> 
>   while ((p2 = find_next_token (&p3, &len)) != 0)
>     {
> #if _WIN32
>        len = GetShortPathName(p2, path, PATH_MAX);
> #else
>        strcpy(buf, p2);
>        len = strlen(buf);
> #endif
>       o = variable_buffer_output (o, path, len);
>       o = variable_buffer_output (o, " ", 1);
>       doneany = 1;
>     }
> 
>   if (doneany)
>     /* Kill last space.  */
>     --o;
> 
>   return o;
> }
> 
> .....
> 
> static struct function_table_entry function_table_init[] =
> {
>  /* Name/size */                    /* MIN MAX EXP? Function */
>   ...
>   { STRING_SIZE_TUPLE("shortname"),     0,  1,  1,  func_shortname},
> 
> 
> _______________________________________________
> Make-w32 mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/make-w32




reply via email to

[Prev in Thread] Current Thread [Next in Thread]