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)

Reply via email to