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
CYGWIN_HOME := C:/Cygwin
DEV_NULL = /dev/null
CYGPATH_CMD = cygpath -a -s -m
define PwdPath
$(shell cd $1 2> $(DEV_NULL) && pwd)
endef
define AbsPwdPathCheck
$(shell cd .. 2> $(DEV_NULL) && cd $1 2> $(DEV_NULL) && pwd)
endef
# Checks an ALT value for spaces (should be one word),
# warns and returns Check_ALT_$1 if spaces
define AltCheckSpaces
$(if $(word 2,$($1)),$(warning "WARNING: Value of $1 contains a space: '$($1)',
check or set ALT_$1")Check_ALT_$1,$($1))
endef
# Checks an ALT value for empty, warns and returns Check_ALT_$1 if empty
define AltCheckValue
$(if $($1),$($1),$(warning "WARNING: Value of $1 cannot be empty, check or set
ALT_$1")Check_ALT_$1)
endef
# Checks any value for empty, warns and returns $2 if empty
define CheckValue
$(if $($1),$($1),$(warning "WARNING: Value of $1 cannot be empty, will use
'$2'")$2)
endef
# Prefix for a utility prefix path, if empty leave alone, otherwise end with a /
define PrefixPath
$(if $1,$(subst //,/,$1/),)
endef
define DirExists
$(shell if [ -d "$1" ]; then echo "$1"; elif [ -d "$2" ]; then echo "$2";
else echo "$3"; fi)
endef
# Select a directory if it exists, or the alternate 2, or the alternate 3, or
the alternate 4
define DirExists4
$(shell \
if [ -d "$1" ]; then \
echo "$1"; \
elif [ -d "$2" ]; then \
echo "$2"; \
elif [ -d "$3" ]; then \
echo "$3"; \
else \
echo "$4"; \
fi)
endef
define ToUpper
$(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,\
$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,\
$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,\
$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,\
$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
endef
# All possible drive letters
drives=a b c d e f g h i j k l m n o p q r s t u v w x y z
#drives=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# Convert /cygdrive/ paths to the mixed style without an exec of cygpath
# Must be a path with no spaces. /cygdrive/letter is always lowercase
# and letter:/ is always uppercase coming from cygpath.
define MixedPath
$(patsubst /%,$(CYGWIN_HOME)/%,$(sort $(filter-out /cygdrive/%,$(foreach
drive,$(drives),$(patsubst /cygdrive/$(drive)/%,$(call
ToUpper,$(drive)):/%,$1)))))
endef
# Use FullPath to get C:/ style non-spaces path. Never ends with a /!
# We assume cygpath is available in the search path
# NOTE: Use of 'pwd' with CYGWIN will not get you a mixed style path!
define FullPath
$(if $(word 1,$1),$(shell $(CYGPATH_CMD) $1 2> $(DEV_NULL)),$(call
MixedPath,$(realpath -m $(subst ",,$1))))
endef
define OptFullPath
$(shell if [ "$1" != "" -a -d "$1" ]; then $(CYGPATH_CMD) "$1" 2> $(DEV_NULL);
else echo "$1"; fi)
endef
OUTPUTDIR=./build/windows-i586
ALT_HOTSPOT_IMPORT_PATH=Z:/JDK/jdk7u/build/windows-i586/hotspot/import
ABS_OUTPUTDIR:=$(call FullPath,$(OUTPUTDIR))
ifdef SYSTEMROOT
xSYSTEMROOT :="$(subst \,/,$(SYSTEMROOT))"
_system_root :=$(call FullPath,$(xSYSTEMROOT))
else
ifdef SystemRoot
xSYSTEMROOT :="$(subst \,/,$(SystemRoot))"
_system_root :=$(call FullPath,$(xSYSTEMROOT))
else
ifdef WINDIR
xWINDIR :="$(subst \,/,$(WINDIR))"
_system_root :=$(call FullPath,$(xWINDIR))
else
ifdef windir
xWINDIR :="$(subst \,/,$(windir))"
_system_root :=$(call FullPath,$(xWINDIR))
endif
endif
endif
endif
# HOTSPOT_IMPORT_PATH: location of hotspot pre-built files
ifdef ALT_HOTSPOT_IMPORT_PATH
HOTSPOT_IMPORT_PATH :=$(call FullPath,$(ALT_HOTSPOT_IMPORT_PATH))
else
# Default locations include the current $OUTPUTDIR, RE Promotions,
# and a JDK. Please be aware the JDK does not include a Kernel VM.
_HOTSPOT_IMPORT_PATH1 := $(OUTPUTDIR)/hotspot/import
_HOTSPOT_IMPORT_PATH2 := $(PROMOTED_BUILD_DISTDIR)/hotspot/import
_HOTSPOT_IMPORT_PATH3 := $(JDK_IMPORT_PATH)
HOTSPOT_IMPORT_PATH := $(call
DirExists,$(_HOTSPOT_IMPORT_PATH1),$(_HOTSPOT_IMPORT_PATH2),$(_HOTSPOT_IMPORT_PATH3))
endif
HOTSPOT_IMPORT_PATH:=$(call AltCheckSpaces,HOTSPOT_IMPORT_PATH)
HOTSPOT_IMPORT_PATH:=$(call AltCheckValue,HOTSPOT_IMPORT_PATH)
FOO:=$(call FullPath,/cygdrive/z/JDK/jdk7u/build/windows-i586)
BAR:=$(call FullPath,"C:/WINDOWS")
all:
@echo "OUTPUTDIR="$(OUTPUTDIR)
@echo "ABS_OUTPUTDIR="$(ABS_OUTPUTDIR)
@echo "ALT_HOTSPOT_IMPORT_PATH="$(ALT_HOTSPOT_IMPORT_PATH)
@echo "_HOTSPOT_IMPORT_PATH2="$(_HOTSPOT_IMPORT_PATH2)
@echo "_HOTSPOT_IMPORT_PATH3="$(_HOTSPOT_IMPORT_PATH3)
@echo "HOTSPOT_IMPORT_PATH="$(HOTSPOT_IMPORT_PATH)
@echo "SYSTEMROOT="$(SYSTEMROOT)
@echo "xSYSTEMROOT="$(xSYSTEMROOT)
@echo "_system_root="$(_system_root)
@echo "FOO="$(FOO)
@echo "BAR="$(BAR)