I did some experiments and looked closer at the code. I missed some
details in my earlier analysis. Here is what is supposed to happen:
FullPath is a macro that takes a path and converts it to mixed style
(c:/) path without spaces. Depending on whether the input contains a
space (the test $(if $(word 2,$1))) two different approaches to this are
employed. If there is a space, cygpath is executed as we do not know of
a way to convert to dos short names without it. If there is no space, we
avoid the overhead of executing an external command and instead use a
combination of $(realpath) and some make macro magic. $(realpath) makes
a path absolute and canonical. Then the MixedPath macro handles the
conversion of /cygdrive/c to C:.
It seems to me like your make binary is failing the realpath call. I
have no idea how this happened and have never seen it before.
One thing I am certain of is that changing the test to $(if $(word 1,$1)
is not the correct solution. It's basically changing it to "if true".
Could you try a couple of tests of realpath in your test.mk? Something
like: $(info realpath . $(realpath .))
/Erik
On 2013-11-20 21:11, Francis ANDRE wrote:
Erik
>>How are you invoking the build to cause this error? Are you
explicitly setting ALT_OUTPUTDIR?
I am invoking just: make sanity without explicitly setting ALT_OUTPUTDIR.
What is the path to your workspace?
FrancisANDRE@idefix /cygdrive/Z/JDK/jdk7u
$ hg path
default = http://hg.openjdk.java.net/jdk7u/jdk7u
FrancisANDRE@idefix /cygdrive/Z/JDK/jdk7u
$ hg root
/cygdrive/Z/JDK/jdk7u
I extracted the relevant commands from the
jdk/make/common/shared/Defs-windows.gmk into the joined test.mk file
if one runs make -f test.mk with $(if $(word 2,$1) at line 72, one gets
$ make -f test.mk
*OUTPUTDIR=./build/windows-i586**
**ABS_OUTPUTDIR=*
ALT_HOTSPOT_IMPORT_PATH=Z:/JDK/jdk7u/build/windows-i586/hotspot/import
_HOTSPOT_IMPORT_PATH2=
_HOTSPOT_IMPORT_PATH3=
HOTSPOT_IMPORT_PATH=Z:/JDK/jdk7u/build/windows-i586/hotspot/import
SYSTEMROOT=C:WINDOWS
xSYSTEMROOT=C:/WINDOWS
_system_root=C:/WINDOWS
FOO=Z:/JDK/jdk7u/build/windows-i586
BAR=C:/WINDOWS
if one runs make -f test.mk with $(if $(word 1,$1) at line 72, one gets
$ make -f test.mk
*OUTPUTDIR=./build/windows-i586**
**ABS_OUTPUTDIR=Z:/JDK/jdk7u/build/WINDOW~1*
ALT_HOTSPOT_IMPORT_PATH=Z:/JDK/jdk7u/build/windows-i586/hotspot/import
_HOTSPOT_IMPORT_PATH2=
_HOTSPOT_IMPORT_PATH3=
HOTSPOT_IMPORT_PATH=Z:/JDK/jdk7u/build/WINDOW~1/hotspot/import
SYSTEMROOT=C:WINDOWS
xSYSTEMROOT=C:/WINDOWS
_system_root=C:/WINDOWS
FOO=Z:/JDK/jdk7u/build/WINDOW~1
BAR=C:/WINDOWS
in both case, OUTPUTDIR is a relative path as "./build/windows-i586",
but only the second computes properly the ABS_OUTPUTDIR as
"Z:/JDK/jdk7u/build/WINDOW~1". In the first case, ABS_OUTPUTDIR is
empty with leads to the error "ERROR: Trouble with the absolute path
for OUTPUTDIR"
Le 20/11/2013 10:47, Erik Joelsson a écrit :
The way I understand it $(if $(word 2,$1) is a check for whitespace
in the input parameter. It's an optimization to avoid executing
cygpath when it's not needed. The MixedPath macro cannot be used if
the path contains a space. It also doesn't convert to an absolute
path, just replacing cygwin specific paths with driveletter paths.
The unfortunate effect of this is that FullPath behaves differently
depending on if the path contains a space.
How are you invoking the build to cause this error? Are you
explicitly setting ALT_OUTPUTDIR? What is the path to your workspace?
/Erik
On 2013-11-15 18:37, Francis ANDRE wrote:
Hi
I am trying to fix the following error
$ make sanity
jdk/make/common/shared/Defs.gmk:563: *** "ERROR: Trouble with the
absolute path for OUTPUTDIR './bui
ld/windows-i586'". Stop.
and found the following code in
jdk/make/common/shared/Defs-windows.gmk, line 109
define FullPath
$(if $(word 2,$1),$(shell $(CYGPATH_CMD) $1 2> $(DEV_NULL)),$(call
MixedPath,$(realpath $(subst ",,$1))))
endef
Can someone explain me what use case is covered by the $(word 2,$1)
in the previous statement?
The error "ERROR: Trouble with the absolute path for OUTPUTDIR" can
be fixed by replacing $(word 2,$1) by $(word 1,$1) but I cannot find
a usage for the $(word 2,$1)
Francis