This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: DJGPP stage 2 C++ makefile failure


> Add "SHELL = /bin/sh" to the Makefile and then try @echo "\$(CC)"
> (with the quotes) instead.  Did it work now?

Adding SHELL or adding double quotes to my simplified Makefile made no difference.

The part of the Makefile in question is generated from from <top_dir>/gcc/Makefile.in> and looks like this:

# Flags to pass to recursive makes.
# CC is set by configure.  Hosts without symlinks need special handling
# because we need CC="stage1/xgcc -Bstage1/" to work in the language
# subdirectories.
# ??? The choices here will need some experimenting with.
ORDINARY_FLAGS_TO_PASS = \
	"AR_FLAGS_FOR_TARGET=$(AR_FLAGS_FOR_TARGET)" \
	"AR_CREATE_FOR_TARGET=$(AR_CREATE_FOR_TARGET)" \
	"AR_EXTRACT_FOR_TARGET=$(AR_EXTRACT_FOR_TARGET)" \
	"AR_FOR_TARGET=$(AR_FOR_TARGET)" \
	"BISON=$(BISON)" \
	"BISONFLAGS=$(BISONFLAGS)" \
	"CFLAGS=$(CFLAGS)" \
	"CLIB=$(CLIB)" \
	"GCC_FOR_TARGET=$(GCC_FOR_TARGET)" \
	"LDFLAGS=$(LDFLAGS)" \
	"LEX=$(LEX)" \
	"LEXFLAGS=$(LEXFLAGS)" \
	"LN=$(LN)" \
	"LN_S=$(LN_S)" \
	"MAKEINFO=$(MAKEINFO)" \
	"MAKEINFOFLAGS=$(MAKEINFOFLAGS)" \
	"RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET)" \
	"RANLIB_TEST_FOR_TARGET=$(RANLIB_TEST_FOR_TARGET)" \
	"SHELL=$(SHELL)" \
	"STAGE_PREFIX=`case '$(STAGE_PREFIX)' in stage*) echo '$(STAGE_PREFIX)' | sed -e 's|stage|../stage|g';; *) echo '$(STAGE_PREFIX)';; esac`" \
	"exeext=$(exeext)" \
	"build_exeext=$(build_exeext)" \
	"objext=$(objext)" \
	"exec_prefix=$(exec_prefix)" \
	"prefix=$(prefix)" \
	"local_prefix=$(local_prefix)" \
	"gxx_include_dir=$(gcc_gxx_include_dir)" \
	"tooldir=$(tooldir)" \
	"gcc_tooldir=$(gcc_tooldir)" \
	"bindir=$(bindir)" \
	"libsubdir=$(libsubdir)" \
	"datadir=$(datadir)" \
	"distdir=../tmp/\$$(subdir)" \
	"localedir=$(localedir)"
FLAGS_TO_PASS = $(ORDINARY_FLAGS_TO_PASS) "CC=`case '$(CC)' in stage*) echo 
'$(CC)' | sed -e 's|stage|../stage|g';; *) echo '$(CC)';; esac`"
PREPEND_DOTDOT_TO_RELATIVE_PATHS = sed \
	-e 's|^ *[^ /][^ /]*/|%&|' \
	-e 's| -B| -B%|g' \
	-e 's|% *[^- /]|%&|g' \
	-e 's|%% *|../|g' \
	-e 's|%||g'
SUBDIR_FLAGS_TO_PASS = $(ORDINARY_FLAGS_TO_PASS) \
	"CC=`echo \`case '\$(CC)' in stage*) echo '\$(CC)' | sed -e 
's|stage|../stage|g';; *) echo '\$(CC)';; esac\` | 
$(PREPEND_DOTDOT_TO_RELATIVE_PATHS)`"
# Flags to pass when recursing into a frontend subdirectory.
LANG_FLAGS_TO_PASS = $(SUBDIR_FLAGS_TO_PASS) \
	"CFLAGS=$(LOOSE_CFLAGS)"

it expands to this (in stage 1 when CC=gcc):

cd cp; c:/djgpp/bin/make.exe "AR_FLAGS_FOR_TARGET=" "AR_CREATE_FOR_TARGET=ar  
rc" "AR_EXTRACT_FOR_TARGET=ar  x" "AR_FOR_TARGET=ar" "BISON=bison" 
"BISONFLAGS=" "CFLAGS=-g" "CLIB=" 
"GCC_FOR_TARGET=c:/djgpp/cvs/gcc/build/gcc/xgcc -Bc:/djgpp/cvs/gcc/build/gcc/ 
-B/dev/env/DJDIR/i586-pc-msdosdjgpp/bin/ -I/dev/env/DJDIR/i586-pc-
msdosdjgpp/include" "LDFLAGS=" "LEX=flex" "LEXFLAGS=" "LN=cp -p" "LN_S=cp -p" 
"MAKEINFO=makeinfo " "MAKEINFOFLAGS=" "RANLIB_FOR_TARGET=ranlib" 
"RANLIB_TEST_FOR_TARGET=[ -f ranlib ] || ( [ "i586-pc-msdosdjgpp" = "i586-pc-
msdosdjgpp" ] && [ -f /usr/bin/ranlib -o -f /bin/ranlib ] )" 
"SHELL=c:/djgpp/bin/bash.exe" "STAGE_PREFIX=`case '' in stage*) echo '' | sed 
-e 's|stage|../stage|g';; *) echo '';; esac`" "exeext=.exe" 
"build_exeext=.exe" "objext=.o" "exec_prefix=/dev/env/DJDIR" 
"prefix=/dev/env/DJDIR" "local_prefix=/usr/local" 
"gxx_include_dir=/dev/env/DJDIR/include/cxx" "tooldir=/dev/env/DJDIR/i586-pc-
msdosdjgpp" "gcc_tooldir=/dev/env/DJDIR/lib/gcc-
lib/djgpp/2.96/../../../../djgpp" "bindir=/dev/env/DJDIR/bin" 
"libsubdir=/dev/env/DJDIR/lib/gcc-lib/djgpp/2.96" 
"datadir=/dev/env/DJDIR/share" "distdir=../tmp/\$(subdir)" 
"localedir=/dev/env/DJDIR/share/locale" "CC=`echo \`case '\gcc' in stage*) 
echo '\gcc' | sed -e 's|stage|../stage|g';; *) echo '\gcc';; esac\` | sed -e 
's|^ *[^ /][^ /]*/|%&|' -e 's| -B| -B%|g' -e 's|% *[^- /]|%&|g' -e 's|%% 
*|../|g' -e 's|%||g'`" "CFLAGS=`echo -g|sed -e 's/-pedantic//g' -e 's/-
Wtraditional//g'`" "CXX_FOR_BUILD=gpp" "CXXFLAGS=-O2" "CXX_FOR_TARGET=gpp" 
../cc1plus.exe
make.exe[2]: Entering directory `c:/djgpp/cvs/gcc/build/gcc/cp'
\gcc -c  -DIN_GCC    -g  -W -Wall    -I. -I.. -I/djgpp/cvs/gcc/gcc/cp -
I/djgpp/cvs/gcc/gcc/cp/.. -I/djgpp/cvs/gcc/gcc/cp/../config -
I/djgpp/cvs/gcc/gcc/cp/../../include /djgpp/cvs/gcc/gcc/cp/call.c
make.exe[2]: *** [call.o] Error -1
make.exe[2]: Leaving directory `c:/djgpp/cvs/gcc/build/gcc/cp'

You can see that the '\' makes it in to g++'s CC.

The problem to me still seems to be that '\'. I've modifed the simplified 
Makefile as requested with some changes of my own:

SHELL=/bin/sh
CC=/foo/gcc
CC_DBL_QUOTED="\$(CC)"
CC_SNGL_QUOTED='\$(CC)'
all:
	echo "CC #1 = '\$(CC)'"
	echo "CC #2 = "\$(CC)""
	echo 'CC_DBL_QUOTED #1 = $(CC_DBL_QUOTED)'
	echo "CC_DBL_QUOTED #2 = $(CC_DBL_QUOTED)"
	echo 'CC_SNGL_QUOTED #1 = $(CC_SNGL_QUOTED)'
	echo "CC_SNGL_QUOTED #2 = $(CC_SNGL_QUOTED)"

and the output:

echo "CC #1 = '\/foo/gcc'"
CC #1 = '\/foo/gcc'
echo "CC #2 = "\/foo/gcc""
CC #2 = /foo/gcc
echo 'CC_DBL_QUOTED #1 = "\/foo/gcc"'
CC_DBL_QUOTED #1 = "\/foo/gcc"
echo "CC_DBL_QUOTED #2 = "\/foo/gcc""
CC_DBL_QUOTED #2 = /foo/gcc
echo 'CC_SNGL_QUOTED #1 = '\/foo/gcc''
CC_SNGL_QUOTED #1 = /foo/gcc
echo "CC_SNGL_QUOTED #2 = '\/foo/gcc'"
CC_SNGL_QUOTED #2 = '\/foo/gcc'

CC #1 closely matches what the Makefile in question is doing. It works when
modified to CC #2.
It seems that when the same quote characters are used, GNU Make removes the 
backslash escape and when different quote characters are used, GNU Make 
doesn't remove the backslash escape. Eli, is the Makefile correct in assuming
the escape should be removed or does it need to be changed?

Mark


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]