diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-03 15:34:18 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-03 15:34:18 +0000 |
commit | 723a0aca88a81e72f4a01b3e2fcd840b63ccc8f6 (patch) | |
tree | 163dcbd1c122008f040766e9e59e37cdd5307c1c /gcc/ada | |
parent | be489ae0b3d8da2a509806a3438683f3906a5492 (diff) | |
download | gcc-723a0aca88a81e72f4a01b3e2fcd840b63ccc8f6.tar.gz |
* bld.ads, bld.adb, bld-io.ads, bld-io.adb, gprcmd.adb,
gpr2make.ads, gpr2make.adb: Remove gpr2make, replaced by gprmake.
* Makefile.in: Add support to build shared Ada libraries on solaris x86
Remove gpr2make, replaced by gprmake.
Remove references to gnatmem and libaddr2line.
Add indepsw.adb<indepsw-linux.adb to TOOLS_TARGET_PAIRS for IA64 linux.
(gnatlib-shared-darwin): Add "-fno-common" to GNATLIBCFLAGS.
Add support for specialized version of Ada.Numerics.Aux for Darwin: use
a-numaux-darwin.ads and a-numaux-darwin.adb
Enable mlib-tgt-lynxos.adb on lynxos.
* Make-lang.in: Remove rules for gpr2make.
When generating sdefault.adb, do not call Relocate_Path
on S3 for function Target_Name, as it is not a path.
Remove references to gnatmem and libaddr2line.
* a-numaux-darwin.ads, a-numaux-darwin.adb, g-soccon-darwin.ads: New
files.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92831 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/Make-lang.in | 48 | ||||
-rw-r--r-- | gcc/ada/Makefile.in | 65 | ||||
-rw-r--r-- | gcc/ada/a-numaux-darwin.adb | 186 | ||||
-rw-r--r-- | gcc/ada/a-numaux-darwin.ads | 109 | ||||
-rw-r--r-- | gcc/ada/bld-io.adb | 285 | ||||
-rw-r--r-- | gcc/ada/bld-io.ads | 73 | ||||
-rw-r--r-- | gcc/ada/bld.adb | 3622 | ||||
-rw-r--r-- | gcc/ada/bld.ads | 38 | ||||
-rw-r--r-- | gcc/ada/g-soccon-darwin.ads | 163 | ||||
-rw-r--r-- | gcc/ada/gpr2make.adb | 34 | ||||
-rw-r--r-- | gcc/ada/gpr2make.ads | 30 | ||||
-rw-r--r-- | gcc/ada/gprcmd.adb | 612 |
12 files changed, 481 insertions, 4784 deletions
diff --git a/gcc/ada/Make-lang.in b/gcc/ada/Make-lang.in index 02510b3b157..9a03fafa6d7 100644 --- a/gcc/ada/Make-lang.in +++ b/gcc/ada/Make-lang.in @@ -321,10 +321,6 @@ ada.all.cross: then \ $(MV) gnatmake$(exeext) gnatmake-cross$(exeext); \ fi - -if [ -f gnatmem$(exeext) ] ; \ - then \ - $(MV) gnatmem$(exeext) gnatmem-cross$(exeext); \ - fi -if [ -f gnatname$(exeext) ] ; \ then \ $(MV) gnatname$(exeext) gnatname-cross$(exeext); \ @@ -353,14 +349,6 @@ ada.all.cross: then \ $(MV) gprmake$(exeext) gprmake-cross$(exeext); \ fi - -if [ -f gpr2make$(exeext) ] ; \ - then \ - $(MV) gpr2make$(exeext) gpr2make-cross$(exeext); \ - fi - -if [ -f gprcmd$(exeext) ] ; \ - then \ - $(MV) gprcmd$(exeext) gprcmd-cross$(exeext); \ - fi ada.start.encap: ada.rest.encap: @@ -447,7 +435,7 @@ ada.install-normal: # and also as either gnatbind (if native) or $(tooldir)/bin/gnatbind # likewise for gnatf, gnatchop, and gnatlink, gnatkr, gnatmake, gnat, # gnatprep, gnatbl, gnatls, gnatxref, gnatfind, gnatname, gnatclean, -# gnatsym, gprmake, gpr2make, gprcmd +# gnatsym, gprmake ada.install-common: $(MKDIR) $(DESTDIR)$(bindir) -if [ -f gnat1$(exeext) ] ; \ @@ -572,17 +560,6 @@ ada.install-common: fi -if [ -f gnat1$(exeext) ] ; \ then \ - if [ -f gnatmem-cross$(exeext) ] ; \ - then \ - $(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatmem$(exeext); \ - $(INSTALL_PROGRAM) gnatmem-cross$(exeext) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatmem$(exeext); \ - else \ - $(RM) $(DESTDIR)$(bindir)/gnatmem$(exeext); \ - $(INSTALL_PROGRAM) gnatmem$(exeext) $(DESTDIR)$(bindir)/gnatmem$(exeext); \ - fi ; \ - fi - -if [ -f gnat1$(exeext) ] ; \ - then \ if [ -f gnatname-cross$(exeext) ] ; \ then \ $(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatname$(exeext); \ @@ -651,22 +628,6 @@ ada.install-common: $(INSTALL_PROGRAM) gprmake$(exeext) $(DESTDIR)$(bindir)/gprmake$(exeext); \ fi ; \ fi - -if [ -f gnat1$(exeext) ] ; \ - then \ - if [ -f gpr2make$(exeext) ] ; \ - then \ - $(RM) $(DESTDIR)$(bindir)/gpr2make$(exeext); \ - $(INSTALL_PROGRAM) gpr2make$(exeext) $(DESTDIR)$(bindir)/gpr2make$(exeext); \ - fi ; \ - fi - -if [ -f gnat1$(exeext) ] ; \ - then \ - if [ -f gprcmd$(exeext) ] ; \ - then \ - $(RM) $(DESTDIR)$(bindir)/gprcmd$(exeext); \ - $(INSTALL_PROGRAM) gprcmd$(exeext) $(DESTDIR)$(bindir)/gprcmd$(exeext); \ - fi ; \ - fi # # Gnatsym is only built on some platforms, including VMS # @@ -738,7 +699,6 @@ ada.uninstall: -$(RM) $(DESTDIR)$(bindir)/gnatlink$(exeext) -$(RM) $(DESTDIR)$(bindir)/gnatls$(exeext) -$(RM) $(DESTDIR)$(bindir)/gnatmake$(exeext) - -$(RM) $(DESTDIR)$(bindir)/gnatmem$(exeext) -$(RM) $(DESTDIR)$(bindir)/gnatname$(exeext) -$(RM) $(DESTDIR)$(bindir)/gnatprep$(exeext) -$(RM) $(DESTDIR)$(bindir)/gnatxref$(exeext) @@ -755,7 +715,6 @@ ada.uninstall: -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatlink$(exeext) -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatls$(exeext) -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatmake$(exeext) - -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatmem$(exeext) -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatname$(exeext) -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatprep$(exeext) -$(RM) $(DESTDIR)$(bindir)/$(target_noncanonical)-gnatxref$(exeext) @@ -772,7 +731,6 @@ ada.uninstall: -$(RM) $(DESTDIR)$(tooldir)/bin/gnatlink$(exeext) -$(RM) $(DESTDIR)$(tooldir)/bin/gnatls$(exeext) -$(RM) $(DESTDIR)$(tooldir)/bin/gnatmake$(exeext) - -$(RM) $(DESTDIR)$(tooldir)/bin/gnatmem$(exeext) -$(RM) $(DESTDIR)$(tooldir)/bin/gnatname$(exeext) -$(RM) $(DESTDIR)$(tooldir)/bin/gnatprep$(exeext) -$(RM) $(DESTDIR)$(tooldir)/bin/gnatxref$(exeext) @@ -801,14 +759,12 @@ ada.distclean: -$(RM) gnatlink$(exeext) -$(RM) gnatls$(exeext) -$(RM) gnatmake$(exeext) - -$(RM) gnatmem$(exeext) -$(RM) gnatname$(exeext) -$(RM) gnatprep$(exeext) -$(RM) gnatfind$(exeext) -$(RM) gnatxref$(exeext) -$(RM) gnatclean$(exeext) -$(RM) gnatsym$(exeext) - -$(RM) gpr2make$(exeext) -$(RM) gprmake$(exeext) # Gnatlbr is only used on VMS -$(RM) gnatlbr$(exeext) @@ -969,7 +925,7 @@ ada/stamp-sdefault : $(srcdir)/version.c Makefile $(ECHO) " end Object_Dir_Default_Name;" >>tmp-sdefault.adb $(ECHO) " function Target_Name return String_Ptr is" >>tmp-sdefault.adb $(ECHO) " begin" >>tmp-sdefault.adb - $(ECHO) " return Relocate_Path (S0, S3);" >>tmp-sdefault.adb + $(ECHO) " return new String'(S3);" >>tmp-sdefault.adb $(ECHO) " end Target_Name;" >>tmp-sdefault.adb $(ECHO) " function Search_Dir_Prefix return String_Ptr is" >>tmp-sdefault.adb $(ECHO) " begin" >>tmp-sdefault.adb diff --git a/gcc/ada/Makefile.in b/gcc/ada/Makefile.in index 45490c890da..43809186177 100644 --- a/gcc/ada/Makefile.in +++ b/gcc/ada/Makefile.in @@ -133,8 +133,6 @@ THREAD_KIND = native THREADSLIB = GMEM_LIB = MISCLIB = -SYMLIB = -ADDR2LINE_SYMLIB = -laddr2line -lbfd -liberty $(LIBINTL) SYMDEPS = $(LIBINTL_DEP) OUTPUT_OPTION = @OUTPUT_OPTION@ @@ -716,7 +714,6 @@ ifeq ($(strip $(filter-out sparc sun solaris%,$(targ))),) THREADSLIB = -lposix4 -lthread MISCLIB = -lposix4 -lnsl -lsocket - SYMLIB = $(ADDR2LINE_SYMLIB) SO_OPTS = -Wl,-h, GNATLIB_SHARED = gnatlib-shared-dual GMEM_LIB = gmemlib @@ -800,10 +797,13 @@ ifeq ($(strip $(filter-out %86 solaris2%,$(arch) $(osys))),) g-soliop.ads<g-soliop-solaris.ads \ system.ads<system-solaris-x86.ads + TOOLS_TARGET_PAIRS=mlib-tgt.adb<mlib-tgt-solaris.adb + THREADSLIB = -lposix4 -lthread MISCLIB = -lposix4 -lnsl -lsocket SO_OPTS = -Wl,-h, GNATLIB_SHARED = gnatlib-shared-dual + GMEM_LIB = gmemlib PREFIX_OBJS = $(PREFIX_REAL_OBJS) LIBRARY_VERSION := $(LIB_VERSION) endif @@ -829,7 +829,6 @@ ifeq ($(strip $(filter-out %86 linux%,$(arch) $(osys))),) mlib-tgt.adb<mlib-tgt-linux.adb \ indepsw.adb<indepsw-linux.adb - SYMLIB = $(ADDR2LINE_SYMLIB) THREADSLIB = -lpthread GNATLIB_SHARED = gnatlib-shared-dual GMEM_LIB = gmemlib @@ -877,7 +876,6 @@ ifeq ($(strip $(filter-out %86 freebsd%,$(arch) $(osys))),) mlib-tgt.adb<mlib-tgt-linux.adb GNATLIB_SHARED = gnatlib-shared-dual - SYMLIB = $(ADDR2LINE_SYMLIB) THREADSLIB= -lc_r GMEM_LIB = gmemlib PREFIX_OBJS = $(PREFIX_REAL_OBJS) @@ -1012,7 +1010,6 @@ ifeq ($(strip $(filter-out hppa% hp hpux11%,$(targ))),) TOOLS_TARGET_PAIRS = mlib-tgt.adb<mlib-tgt-hpux.adb TGT_LIB = /usr/lib/libcl.a THREADSLIB = -lpthread - SYMLIB = $(ADDR2LINE_SYMLIB) GMEM_LIB = gmemlib soext = .sl SO_OPTS = -Wl,+h, @@ -1081,11 +1078,11 @@ ifeq ($(strip $(filter-out ibm aix%,$(manu) $(osys))),) indepsw.adb<indepsw-aix.adb GMEM_LIB = gmemlib - SYMLIB = $(ADDR2LINE_SYMLIB) - endif ifeq ($(strip $(filter-out lynxos,$(osys))),) + TOOLS_TARGET_PAIRS=mlib-tgt.adb<mlib-tgt-lynxos.adb + ifeq ($(strip $(filter-out %86 lynxos,$(arch) $(osys))),) LIBGNAT_TARGET_PAIRS = \ a-numaux.adb<a-numaux-x86.adb \ @@ -1130,7 +1127,6 @@ ifeq ($(strip $(filter-out lynxos,$(osys))),) s-tpopsp.adb<s-tpopsp-lynxos.adb \ system.ads<system-lynxos-ppc.ads endif - endif endif @@ -1168,7 +1164,6 @@ ifeq ($(strip $(filter-out alpha% dec osf%,$(targ))),) TOOLS_TARGET_PAIRS=mlib-tgt.adb<mlib-tgt-tru64.adb GMEM_LIB=gmemlib - SYMLIB = $(ADDR2LINE_SYMLIB) THREADSLIB = -lpthread -lmach -lexc -lrt PREFIX_OBJS = $(PREFIX_REAL_OBJS) GNATLIB_SHARED = gnatlib-shared-default @@ -1304,7 +1299,6 @@ ifeq ($(strip $(filter-out cygwin32% mingw32% pe,$(osys))),) indepsw.adb<indepsw-mingw.adb MISCLIB = -lwsock32 - SYMLIB = $(ADDR2LINE_SYMLIB) GMEM_LIB = gmemlib PREFIX_OBJS = $(PREFIX_REAL_OBJS) EXTRA_GNATTOOLS = ../../gnatdll$(exeext) @@ -1335,7 +1329,6 @@ ifeq ($(strip $(filter-out powerpc% linux%,$(arch) $(osys))),) mlib-tgt.adb<mlib-tgt-linux.adb \ indepsw.adb<indepsw-linux.adb - SYMLIB = $(ADDR2LINE_SYMLIB) THREADSLIB = -lpthread GNATLIB_SHARED = gnatlib-shared-dual GMEM_LIB = gmemlib @@ -1358,7 +1351,10 @@ ifeq ($(strip $(filter-out %ia64 linux%,$(arch) $(osys))),) s-taspri.ads<s-taspri-linux.ads \ system.ads<system-linux-ia64.ads - TOOLS_TARGET_PAIRS=mlib-tgt.adb<mlib-tgt-linux.adb + TOOLS_TARGET_PAIRS = \ + mlib-tgt.adb<mlib-tgt-linux.adb \ + indepsw.adb<indepsw-linux.adb + MISCLIB= THREADSLIB=-lpthread GNATLIB_SHARED=gnatlib-shared-dual @@ -1382,7 +1378,6 @@ ifeq ($(strip $(filter-out %x86_64 linux%,$(arch) $(osys))),) system.ads<system-linux-x86_64.ads TOOLS_TARGET_PAIRS=mlib-tgt.adb<mlib-tgt-linux.adb - SYMLIB = $(ADDR2LINE_SYMLIB) THREADSLIB=-lpthread GNATLIB_SHARED=gnatlib-shared-dual GMEM_LIB = gmemlib @@ -1401,7 +1396,9 @@ ifeq ($(strip $(filter-out powerpc darwin%,$(arch) $(osys))),) s-taprop.adb<s-taprop-posix.adb \ s-taspri.ads<s-taspri-posix.ads \ s-tpopsp.adb<s-tpopsp-posix-foreign.adb \ - g-soccon.ads<g-soccon-aix.ads \ + g-soccon.ads<g-soccon-darwin.ads \ + a-numaux.ads<a-numaux-darwin.ads \ + a-numaux.adb<a-numaux-darwin.adb \ system.ads<system-darwin-ppc.ads TOOLS_TARGET_PAIRS = \ @@ -1413,9 +1410,7 @@ ifeq ($(strip $(filter-out powerpc darwin%,$(arch) $(osys))),) GMEM_LIB = gmemlib LIBRARY_VERSION := $(LIB_VERSION) - soext = .dylib - endif # The runtime library for gnat comprises two directories. One contains the @@ -1430,7 +1425,7 @@ endif LIBGNAT_SRCS = ada.h adaint.c adaint.h argv.c cio.c cstreams.c \ errno.c exit.c cal.c ctrl_c.c \ raise.h raise.c sysdep.c aux-io.c init.c \ - final.c tracebak.c tb-alvms.c tb-alvxw.c expect.c mkdir.c socket.c \ + final.c tracebak.c tb-alvms.c tb-alvxw.c expect.c mkdir.c socket.c gsocket.h \ $(EXTRA_LIBGNAT_SRCS) LIBGNAT_OBJS = adaint.o argv.o cio.o cstreams.o ctrl_c.o errno.o exit.o \ @@ -1537,14 +1532,14 @@ gnattools2: ../stamp-tools ../../gnatls$(exeext) ../../gnatprep$(exeext) \ ../../gnatxref$(exeext) \ ../../gnatfind$(exeext) ../../gnatname$(exeext) \ - ../../gnatclean$(exeext) ../../gprmake$(exeext) \ - ../../gprcmd$(exeext) ../../gpr2make$(exeext) + ../../gnatclean$(exeext) ../../gprmake$(exeext) # These tools are only built for the native version. gnattools3: ../stamp-tools -# $(MAKE) -C tools -f ../Makefile $(TOOLS_FLAGS_TO_PASS) \ -# TOOLSCASE=native top_builddir=../../.. \ -# ../../gnatmem$(exeext) $(EXTRA_GNATTOOLS) +ifneq ($(EXTRA_GNATTOOLS),) + $(MAKE) -C tools -f ../Makefile $(TOOLS_FLAGS_TO_PASS) \ + TOOLSCASE=native top_builddir=../../.. $(EXTRA_GNATTOOLS) +endif # those tools are only built for the cross version gnattools4: ../stamp-tools @@ -1585,12 +1580,6 @@ gnattools4: ../stamp-tools $(GNATLINK) -v gprmake -o $@ --GCC="$(CC) $(ADA_INCLUDES)" \ $(TOOLS_LIBS) -../../gpr2make$(exeext): ../stamp-tools - $(GNATMAKE) -c $(ADA_INCLUDES) gpr2make --GCC="$(CC) $(ALL_ADAFLAGS)" - $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gpr2make - $(GNATLINK) -v gpr2make -o $@ --GCC="$(CC) $(ADA_INCLUDES)" \ - $(TOOLS_LIBS) - ../../gnatprep$(exeext): ../stamp-tools $(GNATMAKE) -c $(ADA_INCLUDES) gnatprep --GCC="$(CC) $(ALL_ADAFLAGS)" $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatprep @@ -1621,25 +1610,12 @@ gnattools4: ../stamp-tools $(GNATLINK) -v gnatsym -o $@ --GCC="$(CC) $(ADA_INCLUDES)" \ $(TOOLS_LIBS) -../../gnatmem$(exeext): ../stamp-tools gmem.o $(SYMDEPS) -ifeq ($(GMEM_LIB),gmemlib) - $(GNATMAKE) -c $(ADA_INCLUDES) gnatmem --GCC="$(CC) $(ALL_ADAFLAGS)" - $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatmem - $(GNATLINK) -v gnatmem -o $@ --GCC="$(CC) $(ADA_INCLUDES)" \ - gmem.o $(SYMLIB) $(TOOLS_LIBS) -endif - ../../gnatdll$(exeext): ../stamp-tools $(GNATMAKE) -c $(ADA_INCLUDES) gnatdll --GCC="$(CC) $(ALL_ADAFLAGS)" $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) $(GNATBIND_FLAGS) gnatdll $(GNATLINK) -v gnatdll -o $@ --GCC="$(CC) $(ADA_INCLUDES)" \ $(TOOLS_LIBS) -../../gprcmd$(exeext): ../stamp-tools - $(GNATMAKE) -c $(ADA_INCLUDES) gprcmd --GCC="$(CC) $(ALL_ADAFLAGS)" - $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gprcmd - $(GNATLINK) -v gprcmd -o $@ --GCC="$(CC) $(ADA_INCLUDES)" $(TOOLS_LIBS) - ../../vxaddr2line$(exeext): ../stamp-tools $(GNATMAKE) -c $(ADA_INCLUDES) vxaddr2line --GCC="$(CC) $(ALL_ADAFLAGS)" $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) vxaddr2line @@ -1890,7 +1866,8 @@ gnatlib-shared-win32: gnatlib-shared-darwin: $(MAKE) $(FLAGS_TO_PASS) \ GNATLIBFLAGS="$(GNATLIBFLAGS)" \ - GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) \ + -fno-common" \ THREAD_KIND="$(THREAD_KIND)" \ gnatlib $(RM) rts/libgnat$(soext) rts/libgnarl$(soext) @@ -2039,7 +2016,7 @@ final.o : raise.h final.c gmem.o : gmem.c link.o : link.c mkdir.o : mkdir.c -socket.o : socket.c +socket.o : socket.c gsocket.h sysdep.o : sysdep.c cio.o : cio.c diff --git a/gcc/ada/a-numaux-darwin.adb b/gcc/ada/a-numaux-darwin.adb new file mode 100644 index 00000000000..19d8881a9f4 --- /dev/null +++ b/gcc/ada/a-numaux-darwin.adb @@ -0,0 +1,186 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUNTIME COMPONENTS -- +-- -- +-- A D A . N U M E R I C S . A U X -- +-- -- +-- B o d y -- +-- (Apple OS X Version) -- +-- -- +-- Copyright (C) 1998-2004 Free Software Foundation, Inc. -- +-- -- +-- GNAT is free software; you can redistribute it and/or modify it under -- +-- terms of the GNU General Public License as published by the Free Soft- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- +-- for more details. You should have received a copy of the GNU General -- +-- Public License distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- +-- MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- File a-numaux.adb <- a-numaux-darwin.adb + +package body Ada.Numerics.Aux is + + ----------------------- + -- Local subprograms -- + ----------------------- + + procedure Reduce (X : in out Double; Q : out Natural); + -- Implements reduction of X by Pi/2. Q is the quadrant of the final + -- result in the range 0 .. 3. The absolute value of X is at most Pi/4. + + -- The following three functions implement Chebishev approximations + -- of the trigoniometric functions in their reduced domain. + -- These approximations have been computed using Maple. + + function Sine_Approx (X : Double) return Double; + function Cosine_Approx (X : Double) return Double; + + pragma Inline (Reduce); + pragma Inline (Sine_Approx); + pragma Inline (Cosine_Approx); + + function Cosine_Approx (X : Double) return Double is + XX : constant Double := X * X; + begin + return (((((16#8.DC57FBD05F640#E-08 * XX + - 16#4.9F7D00BF25D80#E-06) * XX + + 16#1.A019F7FDEFCC2#E-04) * XX + - 16#5.B05B058F18B20#E-03) * XX + + 16#A.AAAAAAAA73FA8#E-02) * XX + - 16#7.FFFFFFFFFFDE4#E-01) * XX + - 16#3.655E64869ECCE#E-14 + 1.0; + end Cosine_Approx; + + function Sine_Approx (X : Double) return Double is + XX : constant Double := X * X; + begin + return (((((16#A.EA2D4ABE41808#E-09 * XX + - 16#6.B974C10F9D078#E-07) * XX + + 16#2.E3BC673425B0E#E-05) * XX + - 16#D.00D00CCA7AF00#E-04) * XX + + 16#2.222222221B190#E-02) * XX + - 16#2.AAAAAAAAAAA44#E-01) * (XX * X) + X; + end Sine_Approx; + + ------------ + -- Reduce -- + ------------ + + procedure Reduce (X : in out Double; Q : out Natural) is + Half_Pi : constant := Pi / 2.0; + Two_Over_Pi : constant := 2.0 / Pi; + + HM : constant := Integer'Min (Double'Machine_Mantissa / 2, Natural'Size); + M : constant Double := 0.5 + 2.0**(1 - HM); -- Splitting constant + P1 : constant Double := Double'Leading_Part (Half_Pi, HM); + P2 : constant Double := Double'Leading_Part (Half_Pi - P1, HM); + P3 : constant Double := Double'Leading_Part (Half_Pi - P1 - P2, HM); + P4 : constant Double := Double'Leading_Part (Half_Pi - P1 - P2 - P3, HM); + P5 : constant Double := Double'Leading_Part (Half_Pi - P1 - P2 - P3 + - P4, HM); + P6 : constant Double := Double'Model (Half_Pi - P1 - P2 - P3 - P4 - P5); + K : Double := X * Two_Over_Pi; + begin + -- For X < 2.0**HM, all products below are computed exactly. + -- Due to cancellation effects all subtractions are exact as well. + -- As no double extended floating-point number has more than 75 + -- zeros after the binary point, the result will be the correctly + -- rounded result of X - K * (Pi / 2.0). + + while abs K >= 2.0**HM loop + K := K * M - (K * M - K); + X := (((((X - K * P1) - K * P2) - K * P3) + - K * P4) - K * P5) - K * P6; + K := X * Two_Over_Pi; + end loop; + + if K /= K then + + -- K is not a number, because X was not finite + + raise Constraint_Error; + end if; + + K := Double'Rounding (K); + Q := Integer (K) mod 4; + X := (((((X - K * P1) - K * P2) - K * P3) + - K * P4) - K * P5) - K * P6; + end Reduce; + + --------- + -- Cos -- + --------- + + function Cos (X : Double) return Double is + Reduced_X : Double := abs X; + Quadrant : Natural range 0 .. 3; + + begin + if Reduced_X > Pi / 4.0 then + Reduce (Reduced_X, Quadrant); + + case Quadrant is + when 0 => + return Cosine_Approx (Reduced_X); + + when 1 => + return Sine_Approx (-Reduced_X); + + when 2 => + return -Cosine_Approx (Reduced_X); + + when 3 => + return Sine_Approx (Reduced_X); + end case; + end if; + + return Cosine_Approx (Reduced_X); + end Cos; + + --------- + -- Sin -- + --------- + + function Sin (X : Double) return Double is + Reduced_X : Double := X; + Quadrant : Natural range 0 .. 3; + + begin + if abs X > Pi / 4.0 then + Reduce (Reduced_X, Quadrant); + + case Quadrant is + when 0 => + return Sine_Approx (Reduced_X); + + when 1 => + return Cosine_Approx (Reduced_X); + + when 2 => + return Sine_Approx (-Reduced_X); + + when 3 => + return -Cosine_Approx (Reduced_X); + end case; + end if; + + return Sine_Approx (Reduced_X); + end Sin; + +end Ada.Numerics.Aux; diff --git a/gcc/ada/a-numaux-darwin.ads b/gcc/ada/a-numaux-darwin.ads new file mode 100644 index 00000000000..6ca8c3c300a --- /dev/null +++ b/gcc/ada/a-numaux-darwin.ads @@ -0,0 +1,109 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUNTIME COMPONENTS -- +-- -- +-- A D A . N U M E R I C S . A U X -- +-- -- +-- S p e c -- +-- (Apple OS X Version) -- +-- -- +-- Copyright (C) 1992-2004 Free Software Foundation, Inc. -- +-- -- +-- GNAT is free software; you can redistribute it and/or modify it under -- +-- terms of the GNU General Public License as published by the Free Soft- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- +-- for more details. You should have received a copy of the GNU General -- +-- Public License distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- +-- MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- This version is for use with normal Unix math functions, except for +-- sine/cosine which have been implemented directly in Ada to get +-- the required accuracy in OS X. Alternative packages are used +-- on OpenVMS (different import names), VxWorks (no need for the +-- -lm Linker_Options), and on the x86 (where we have two +-- versions one using inline ASM, and one importing from the C long +-- routines that take 80-bit arguments). + +package Ada.Numerics.Aux is +pragma Pure (Aux); + + pragma Linker_Options ("-lm"); + + type Double is digits 15; + -- Type Double is the type used to call the C routines + + -- The following functions have been implemented in Ada, since + -- the OS X math library didn't meet accuracy requirements for + -- argument reduction. The implementation here has been tailored + -- to match Ada strict mode Numerics requirements while maintaining + -- maximum efficiency. + function Sin (X : Double) return Double; + pragma Inline (Sin); + + function Cos (X : Double) return Double; + pragma Inline (Cos); + + -- We import these functions directly from C. Note that we label them + -- all as pure functions, because indeed all of them are in fact pure! + + function Tan (X : Double) return Double; + pragma Import (C, Tan, "tan"); + pragma Pure_Function (Tan); + + function Exp (X : Double) return Double; + pragma Import (C, Exp, "exp"); + pragma Pure_Function (Exp); + + function Sqrt (X : Double) return Double; + pragma Import (C, Sqrt, "sqrt"); + pragma Pure_Function (Sqrt); + + function Log (X : Double) return Double; + pragma Import (C, Log, "log"); + pragma Pure_Function (Log); + + function Acos (X : Double) return Double; + pragma Import (C, Acos, "acos"); + pragma Pure_Function (Acos); + + function Asin (X : Double) return Double; + pragma Import (C, Asin, "asin"); + pragma Pure_Function (Asin); + + function Atan (X : Double) return Double; + pragma Import (C, Atan, "atan"); + pragma Pure_Function (Atan); + + function Sinh (X : Double) return Double; + pragma Import (C, Sinh, "sinh"); + pragma Pure_Function (Sinh); + + function Cosh (X : Double) return Double; + pragma Import (C, Cosh, "cosh"); + pragma Pure_Function (Cosh); + + function Tanh (X : Double) return Double; + pragma Import (C, Tanh, "tanh"); + pragma Pure_Function (Tanh); + + function Pow (X, Y : Double) return Double; + pragma Import (C, Pow, "pow"); + pragma Pure_Function (Pow); + +end Ada.Numerics.Aux; diff --git a/gcc/ada/bld-io.adb b/gcc/ada/bld-io.adb deleted file mode 100644 index 7bd01e6ac6d..00000000000 --- a/gcc/ada/bld-io.adb +++ /dev/null @@ -1,285 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- B L D - I O -- --- -- --- B o d y -- --- -- --- Copyright (C) 2002-2003 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - -with Ada.Exceptions; -with Ada.Text_IO; -with Ada.Unchecked_Deallocation; - -with GNAT.OS_Lib; use GNAT.OS_Lib; -with Osint; - -package body Bld.IO is - - use Ada; - - Initial_Number_Of_Lines : constant := 100; - Initial_Length_Of_Line : constant := 50; - - type Line is record - Length : Natural := 0; - Value : String_Access; - Suppressed : Boolean := False; - end record; - -- One line of a Makefile. - -- Length is the position of the last column in the line. - -- Suppressed is set to True by procedure Suppress. - - type Line_Array is array (Positive range <>) of Line; - - type Buffer is access Line_Array; - - procedure Free is new Ada.Unchecked_Deallocation (Line_Array, Buffer); - - Lines : Buffer := new Line_Array (1 .. Initial_Number_Of_Lines); - -- The lines of a Makefile - - Current : Positive := 1; - -- Position of the last line in the Makefile - - File : Text_IO.File_Type; - -- The current Makefile - - type File_Name_Data; - type File_Name_Ref is access File_Name_Data; - - type File_Name_Data is record - Value : String_Access; - Next : File_Name_Ref; - end record; - -- Used to record the names of all Makefiles created, so that we may delete - -- them if necessary. - - File_Names : File_Name_Ref; - -- List of all the Makefiles created so far. - - ----------- - -- Close -- - ----------- - - procedure Close is - begin - Flush; - Text_IO.Close (File); - - exception - when X : others => - Text_IO.Put_Line (Exceptions.Exception_Message (X)); - Osint.Fail ("cannot close a Makefile"); - end Close; - - ------------ - -- Create -- - ------------ - - procedure Create (File_Name : String) is - begin - Text_IO.Create (File, Text_IO.Out_File, File_Name); - Current := 1; - Lines (1).Length := 0; - Lines (1).Suppressed := False; - File_Names := - new File_Name_Data'(Value => new String'(File_Name), - Next => File_Names); - exception - when X : others => - Text_IO.Put_Line (Exceptions.Exception_Message (X)); - Osint.Fail ("cannot create """ & File_Name & '"'); - end Create; - - ---------------- - -- Delete_All -- - ---------------- - - procedure Delete_All is - Success : Boolean; - begin - if Text_IO.Is_Open (File) then - Text_IO.Delete (File); - File_Names := File_Names.Next; - end if; - - while File_Names /= null loop - Delete_File (File_Names.Value.all, Success); - File_Names := File_Names.Next; - end loop; - end Delete_All; - - ----------- - -- Flush -- - ----------- - - procedure Flush is - Last : Natural; - begin - if Lines (Current).Length /= 0 then - Osint.Fail ("INTERNAL ERROR: flushing before end of line: """ & - Lines (Current).Value - (1 .. Lines (Current).Length)); - end if; - - for J in 1 .. Current - 1 loop - if not Lines (J).Suppressed then - Last := Lines (J).Length; - - -- The last character of a line cannot be a back slash ('\'), - -- otherwise make has a problem. The only real place were it - -- should happen is for directory names on Windows, and then - -- this terminal back slash is not needed. - - if Last > 0 and then Lines (J).Value (Last) = '\' then - Last := Last - 1; - end if; - - Text_IO.Put_Line (File, Lines (J).Value (1 .. Last)); - end if; - end loop; - - Current := 1; - Lines (1).Length := 0; - Lines (1).Suppressed := False; - end Flush; - - ---------- - -- Mark -- - ---------- - - procedure Mark (Pos : out Position) is - begin - if Lines (Current).Length /= 0 then - Osint.Fail ("INTERNAL ERROR: marking before end of line: """ & - Lines (Current).Value - (1 .. Lines (Current).Length)); - end if; - - Pos := (Value => Current); - end Mark; - - ------------------ - -- Name_Of_File -- - ------------------ - - function Name_Of_File return String is - begin - return Text_IO.Name (File); - end Name_Of_File; - - -------------- - -- New_Line -- - -------------- - - procedure New_Line is - begin - Current := Current + 1; - - if Current > Lines'Last then - declare - New_Lines : constant Buffer := - new Line_Array (1 .. 2 * Lines'Last); - - begin - New_Lines (1 .. Lines'Last) := Lines.all; - Free (Lines); - Lines := New_Lines; - end; - end if; - - Lines (Current).Length := 0; - Lines (Current).Suppressed := False; - - -- Allocate a new line, if necessary - - if Lines (Current).Value = null then - Lines (Current).Value := new String (1 .. Initial_Length_Of_Line); - end if; - end New_Line; - - --------- - -- Put -- - --------- - - procedure Put (S : String) is - Length : constant Natural := Lines (Current).Length; - - begin - if Length + S'Length > Lines (Current).Value'Length then - declare - New_Line : String_Access; - New_Length : Positive := 2 * Lines (Current).Value'Length; - begin - while Length + S'Length > New_Length loop - New_Length := 2 * New_Length; - end loop; - - New_Line := new String (1 .. New_Length); - New_Line (1 .. Length) := Lines (Current).Value (1 .. Length); - Free (Lines (Current).Value); - Lines (Current).Value := New_Line; - end; - end if; - - Lines (Current).Value (Length + 1 .. Length + S'Length) := S; - Lines (Current).Length := Length + S'Length; - end Put; - - ------------- - -- Release -- - ------------- - - procedure Release (Pos : Position) is - begin - if Lines (Current).Length /= 0 then - Osint.Fail ("INTERNAL ERROR: releasing before end of line: """ & - Lines (Current).Value - (1 .. Lines (Current).Length)); - end if; - - if Pos.Value > Current then - Osint.Fail ("INTERNAL ERROR: releasing ahead of current position"); - end if; - - Current := Pos.Value; - Lines (Current).Length := 0; - end Release; - - -------------- - -- Suppress -- - -------------- - - procedure Suppress (Pos : Position) is - begin - if Pos.Value >= Current then - Osint.Fail ("INTERNAL ERROR: suppressing ahead of current position"); - end if; - - Lines (Pos.Value).Suppressed := True; - end Suppress; - -begin - -- Allocate the first line. - -- The other ones are allocated by New_Line. - - Lines (1).Value := new String (1 .. Initial_Length_Of_Line); -end Bld.IO; diff --git a/gcc/ada/bld-io.ads b/gcc/ada/bld-io.ads deleted file mode 100644 index c5df6274ad1..00000000000 --- a/gcc/ada/bld-io.ads +++ /dev/null @@ -1,73 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- B L D - I O -- --- -- --- S p e c -- --- -- --- Copyright (C) 2002 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - --- The following private package allows the ouput of text to Makefiles --- though buffers. It is possible to remove some lines from the buffers --- without putting them effectively in the Makefile. - -private package Bld.IO is - - procedure Create (File_Name : String); - -- Create a new Makefile - - procedure Flush; - -- Output all not suppressed lines to the Makefile - - procedure Close; - -- Close the current Makefile - - procedure Delete_All; - -- Delete all the Makefiles that have been created - - function Name_Of_File return String; - -- Return the path name of the current Makefile - - type Position is private; - -- Identification of a line in the Makefile - - procedure Mark (Pos : out Position); - -- Record the current line. - -- No characters should have been already put on this line. - - procedure Release (Pos : Position); - -- Suppress all line after this one, including this one. - - procedure Suppress (Pos : Position); - -- Suppress a particular line - - procedure Put (S : String); - -- Append a string to the current line - - procedure New_Line; - -- End a line. Go to the next one (initially empty). - -private - - type Position is record - Value : Positive := 1; - end record; - -end Bld.IO; diff --git a/gcc/ada/bld.adb b/gcc/ada/bld.adb deleted file mode 100644 index e8b5c89eb82..00000000000 --- a/gcc/ada/bld.adb +++ /dev/null @@ -1,3622 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- B L D -- --- -- --- B o d y -- --- -- --- Copyright (C) 2002-2004 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - --- This package is still a work in progress. - -with Ada.Characters.Handling; use Ada.Characters.Handling; -with Ada.Strings.Fixed; use Ada.Strings.Fixed; - -with Bld.IO; -with Csets; - -with GNAT.HTable; -with GNAT.Case_Util; use GNAT.Case_Util; -with GNAT.Command_Line; use GNAT.Command_Line; -with GNAT.Directory_Operations; use GNAT.Directory_Operations; -with GNAT.OS_Lib; use GNAT.OS_Lib; - -with Erroutc; use Erroutc; -with Err_Vars; use Err_Vars; -with Gnatvsn; -with Namet; use Namet; -with Opt; use Opt; -with Output; use Output; -with Prj; use Prj; -with Prj.Com; use Prj.Com; -with Prj.Err; use Prj.Err; -with Prj.Part; -with Prj.Tree; use Prj.Tree; -with Snames; -with Table; -with Types; use Types; - -package body Bld is - - function "=" (Left, Right : IO.Position) return Boolean - renames IO."="; - - MAKE_ROOT : constant String := "MAKE_ROOT"; - - Process_All_Project_Files : Boolean := True; - -- Set to False by command line switch -R - - Copyright_Displayed : Boolean := False; - -- To avoid displaying the Copyright line several times - - Usage_Displayed : Boolean := False; - -- To avoid displaying the usage several times - - type Expression_Kind_Type is (Undecided, Static_String, Other); - - Expression_Kind : Expression_Kind_Type := Undecided; - -- After procedure Expression has been called, this global variable - -- indicates if the expression is a static string or not. - -- If it is a static string, then Expression_Value (1 .. Expression_Last) - -- is the static value of the expression. - - Expression_Value : String_Access := new String (1 .. 10); - Expression_Last : Natural := 0; - - -- The following variables indicates if the suffixes and the languages - -- are statically specified and, if they are, their values. - - C_Suffix : String_Access := new String (1 .. 10); - C_Suffix_Last : Natural := 0; - C_Suffix_Static : Boolean := True; - - Cxx_Suffix : String_Access := new String (1 .. 10); - Cxx_Suffix_Last : Natural := 0; - Cxx_Suffix_Static : Boolean := True; - - Ada_Spec_Suffix : String_Access := new String (1 .. 10); - Ada_Spec_Suffix_Last : Natural := 0; - Ada_Spec_Suffix_Static : Boolean := True; - - Ada_Body_Suffix : String_Access := new String (1 .. 10); - Ada_Body_Suffix_Last : Natural := 0; - Ada_Body_Suffix_Static : Boolean := True; - - Languages : String_Access := new String (1 .. 50); - Languages_Last : Natural := 0; - Languages_Static : Boolean := True; - - type Source_Kind_Type is (Unknown, Ada_Spec, Ada_Body, C, Cxx, None); - -- Used when post-processing Compiler'Switches to indicate the language - -- of a source. - - -- The following variables are used to controlled what attributes - -- Default_Switches and Switches are allowed in expressions. - - Default_Switches_Package : Name_Id := No_Name; - Default_Switches_Language : Name_Id := No_Name; - Switches_Package : Name_Id := No_Name; - Switches_Language : Source_Kind_Type := Unknown; - - -- Other attribute references are only allowed in attribute declarations - -- of the same package and of the same name. - - -- Other_Attribute is True only during attribute declarations other than - -- Switches or Default_Switches. - - Other_Attribute : Boolean := False; - Other_Attribute_Package : Name_Id := No_Name; - Other_Attribute_Name : Name_Id := No_Name; - - type Declaration_Type is (False, May_Be, True); - - Source_Files_Declaration : Declaration_Type := False; - - Source_List_File_Declaration : Declaration_Type := False; - - -- Names that are not in Snames - - Name_Ide : Name_Id := No_Name; - Name_Compiler_Command : Name_Id := No_Name; - Name_Main_Language : Name_Id := No_Name; - Name_C_Plus_Plus : Name_Id := No_Name; - - package Processed_Projects is new GNAT.HTable.Simple_HTable - (Header_Num => Header_Num, - Element => Project_Node_Id, - No_Element => Empty_Node, - Key => Name_Id, - Hash => Hash, - Equal => "="); - -- This hash table contains all processed projects. - -- It is used to avoid processing the same project file several times. - - package Externals is new GNAT.HTable.Simple_HTable - (Header_Num => Header_Num, - Element => Natural, - No_Element => 0, - Key => Project_Node_Id, - Hash => Hash, - Equal => "="); - -- This hash table is used to store all the external references. - -- For each project file, the tree is first traversed and all - -- external references are put in variables. Each of these variables - -- are identified by a number, so that the can be referred to - -- later during the second traversal of the tree. - - package Variable_Names is new Table.Table - (Table_Component_Type => Name_Id, - Table_Index_Type => Natural, - Table_Low_Bound => 1, - Table_Initial => 10, - Table_Increment => 10, - Table_Name => "Bld.Variable_Names"); - -- This table stores all the variables declared in a package. - -- It is used to distinguish project level and package level - -- variables identified by simple names. - -- This table is reset for each package. - - package Switches is new Table.Table - (Table_Component_Type => Name_Id, - Table_Index_Type => Natural, - Table_Low_Bound => 1, - Table_Initial => 10, - Table_Increment => 10, - Table_Name => "Bld.Switches"); - -- This table stores all the indexs of associative array attribute - -- Compiler'Switches specified in a project file. It is reset for - -- each project file. At the end of processing of a project file - -- this table is traversed to output targets for those files - -- that may be C or C++ source files. - - Last_External : Natural := 0; - -- For each external reference, this variable in incremented by 1, - -- and a Makefile variable <PROJECT>__EXTERNAL__<Last_External> is - -- declared. See procedure Process_Externals. - - Last_Case_Construction : Natural := 0; - -- For each case construction, this variable is incremented by 1, - -- and a Makefile variable <PROJECT>__CASE__<Last_Case_Construction> is - -- declared. See procedure Process_Declarative_Items. - - Saved_Suffix : constant String := ".saved"; - -- Prefix to be added to the name of reserved variables (see below) when - -- used in external references. - - -- A number of environment variables, whose names are used in the - -- Makefiles are saved at the beginning of the main Makefile. - -- Each reference to any such environment variable is replaced - -- in the Makefiles with the name of the saved variable. - - Ada_Body_String : aliased String := "ADA_BODY"; - Ada_Flags_String : aliased String := "ADA_FLAGS"; - Ada_Mains_String : aliased String := "ADA_MAINS"; - Ada_Sources_String : aliased String := "ADA_SOURCES"; - Ada_Spec_String : aliased String := "ADA_SPEC"; - Ar_Cmd_String : aliased String := "AR_CMD"; - Ar_Ext_String : aliased String := "AR_EXT"; - Base_Dir_String : aliased String := "BASE_DIR"; - Cc_String : aliased String := "CC"; - C_Ext_String : aliased String := "C_EXT"; - Cflags_String : aliased String := "CFLAGS"; - Cxx_String : aliased String := "CXX"; - Cxx_Ext_String : aliased String := "CXX_EXT"; - Cxxflags_String : aliased String := "CXXFLAGS"; - Deps_Projects_String : aliased String := "DEPS_PROJECT"; - Exec_String : aliased String := "EXEC"; - Exec_Dir_String : aliased String := "EXEC_DIR"; - Fldflags_String : aliased String := "FLDFLAGS"; - Gnatmake_String : aliased String := "GNATMAKE"; - Languages_String : aliased String := "LANGUAGES"; - Ld_Flags_String : aliased String := "LD_FLAGS"; - Libs_String : aliased String := "LIBS"; - Main_String : aliased String := "MAIN"; - Obj_Ext_String : aliased String := "OBJ_EXT"; - Obj_Dir_String : aliased String := "OBJ_DIR"; - Project_File_String : aliased String := "PROJECT_FILE"; - Src_Dirs_String : aliased String := "SRC_DIRS"; - - type Reserved_Variable_Array is array (Positive range <>) of String_Access; - Reserved_Variables : constant Reserved_Variable_Array := - (Ada_Body_String 'Access, - Ada_Flags_String 'Access, - Ada_Mains_String 'Access, - Ada_Sources_String 'Access, - Ada_Spec_String 'Access, - Ar_Cmd_String 'Access, - Ar_Ext_String 'Access, - Base_Dir_String 'Access, - Cc_String 'Access, - C_Ext_String 'Access, - Cflags_String 'Access, - Cxx_String 'Access, - Cxx_Ext_String 'Access, - Cxxflags_String 'Access, - Deps_Projects_String'Access, - Exec_String 'Access, - Exec_Dir_String 'Access, - Fldflags_String 'Access, - Gnatmake_String 'Access, - Languages_String 'Access, - Ld_Flags_String 'Access, - Libs_String 'Access, - Main_String 'Access, - Obj_Ext_String 'Access, - Obj_Dir_String 'Access, - Project_File_String 'Access, - Src_Dirs_String 'Access); - - Main_Project_File_Name : String_Access; - -- The name of the main project file, given as argument. - - Project_Tree : Project_Node_Id; - -- The result of the parsing of the main project file. - - procedure Add_To_Expression_Value (S : String); - procedure Add_To_Expression_Value (S : Name_Id); - -- Add a string to variable Expression_Value - - procedure Display_Copyright; - -- Display name of the tool and the copyright - - function Equal_String (Left, Right : Name_Id) return Boolean; - -- Return True if Left and Right are the same string, without considering - -- the case. - - procedure Expression - (Project : Project_Node_Id; - First_Term : Project_Node_Id; - Kind : Variable_Kind; - In_Case : Boolean; - Reset : Boolean := False); - -- Process an expression. - -- If In_Case is True, all expressions are not static. - - procedure New_Line; - -- Add a line terminator in the Makefile - - procedure Process (Project : Project_Node_Id); - -- Process the project tree, result of the parsing. - - procedure Process_Case_Construction - (Current_Project : Project_Node_Id; - Current_Pkg : Name_Id; - Case_Project : Project_Node_Id; - Case_Pkg : Name_Id; - Name : Name_Id; - Node : Project_Node_Id); - -- Process a case construction. - -- The Makefile declations may be suppressed if no declarative - -- items in the case items are to be put in the Makefile. - - procedure Process_Declarative_Items - (Project : Project_Node_Id; - Pkg : Name_Id; - In_Case : Boolean; - Item : Project_Node_Id); - -- Process the declarative items for a project, a package - -- or a case item. - -- If In_Case is True, all expressions are not static - - procedure Process_Externals (Project : Project_Node_Id); - -- Look for all external references in one project file, populate the - -- table Externals, and output the necessary declarations, if any. - - procedure Put (S : String; With_Substitution : Boolean := False); - -- Add a string to the Makefile. - -- When With_Substitution is True, if the string is one of the reserved - -- variables, replace it with the name of the corresponding saved - -- variable. - - procedure Put (S : Name_Id); - -- Add a string to the Makefile. - - procedure Put (P : Positive); - -- Add the image of a number to the Makefile, without leading space - - procedure Put_Attribute - (Project : Project_Node_Id; - Pkg : Name_Id; - Name : Name_Id; - Index : Name_Id); - -- Put the full name of an attribute in the Makefile - - procedure Put_Directory_Separator; - -- Add a directory separator to the Makefile - - procedure Put_Include_Project - (Included_Project_Path : Name_Id; - Included_Project : Project_Node_Id; - Including_Project_Name : String); - -- Output an include directive for a project - - procedure Put_Line (S : String); - -- Add a string and a line terminator to the Makefile - - procedure Put_L_Name (N : Name_Id); - -- Put a name in lower case in the Makefile - - procedure Put_M_Name (N : Name_Id); - -- Put a name in mixed case in the Makefile - - procedure Put_U_Name (N : Name_Id); - -- Put a name in upper case in the Makefile - - procedure Special_Put_U_Name (S : Name_Id); - -- Put a name in upper case in the Makefile. - -- If "C++" change it to "CXX". - - procedure Put_Variable - (Project : Project_Node_Id; - Pkg : Name_Id; - Name : Name_Id); - -- Put the full name of a variable in the Makefile - - procedure Recursive_Process (Project : Project_Node_Id); - -- Process a project file and the project files it depends on iteratively - -- without processing twice the same project file. - - procedure Reset_Suffixes_And_Languages; - -- Indicate that all suffixes and languages have the default values - - function Source_Kind_Of (File_Name : Name_Id) return Source_Kind_Type; - -- From a source file name, returns the source kind of the file - - function Suffix_Of - (Static : Boolean; - Value : String_Access; - Last : Natural; - Default : String) return String; - -- Returns the current suffix, if it is statically known, or "" - -- if it is not statically known. Used on C_Suffix, Cxx_Suffix, - -- Ada_Body_Suffix and Ada_Spec_Suffix. - - procedure Usage; - -- Display the usage of gnatbuild - - ----------------------------- - -- Add_To_Expression_Value -- - ----------------------------- - - procedure Add_To_Expression_Value (S : String) is - begin - -- Check that the buffer is large enough. - -- If it is not, double it until it is large enough. - - while Expression_Last + S'Length > Expression_Value'Last loop - declare - New_Value : constant String_Access := - new String (1 .. 2 * Expression_Value'Last); - - begin - New_Value (1 .. Expression_Last) := - Expression_Value (1 .. Expression_Last); - Free (Expression_Value); - Expression_Value := New_Value; - end; - end loop; - - Expression_Value (Expression_Last + 1 .. Expression_Last + S'Length) - := S; - Expression_Last := Expression_Last + S'Length; - end Add_To_Expression_Value; - - procedure Add_To_Expression_Value (S : Name_Id) is - begin - Get_Name_String (S); - Add_To_Expression_Value (S => Name_Buffer (1 .. Name_Len)); - end Add_To_Expression_Value; - - ----------------------- - -- Display_Copyright -- - ----------------------- - - procedure Display_Copyright is - begin - if not Copyright_Displayed then - Copyright_Displayed := True; - Write_Str ("GPR2MAKE "); - Write_Str (Gnatvsn.Gnat_Version_String); - Write_Str (" Copyright 2002-2004 Free Software Foundation, Inc."); - Write_Eol; - Write_Eol; - end if; - end Display_Copyright; - - ------------------ - -- Equal_String -- - ------------------ - - function Equal_String (Left, Right : Name_Id) return Boolean is - begin - Get_Name_String (Left); - - declare - Left_Value : constant String := - To_Lower (Name_Buffer (1 .. Name_Len)); - - begin - Get_Name_String (Right); - return Left_Value = To_Lower (Name_Buffer (1 .. Name_Len)); - end; - end Equal_String; - - ---------------- - -- Expression -- - ---------------- - - procedure Expression - (Project : Project_Node_Id; - First_Term : Project_Node_Id; - Kind : Variable_Kind; - In_Case : Boolean; - Reset : Boolean := False) - is - Term : Project_Node_Id := First_Term; - -- The term in the expression list - - Current_Term : Project_Node_Id := Empty_Node; - -- The current term node id - - begin - if In_Case then - Expression_Kind := Other; - - elsif Reset then - Expression_Kind := Undecided; - Expression_Last := 0; - end if; - - while Term /= Empty_Node loop - - Current_Term := Tree.Current_Term (Term); - - case Kind_Of (Current_Term) is - - when N_Literal_String => - -- If we are in a string list, we precede this literal string - -- with a space; it does not matter if the output list - -- has a leading space. - -- Otherwise we just output the literal string: - -- if it is not the first term of the expression, it will - -- concatenate with was previously output. - - if Kind = List then - Put (" "); - end if; - - -- If in a static string expression, add to expression value - - if Expression_Kind = Undecided - or else Expression_Kind = Static_String - then - Expression_Kind := Static_String; - - if Kind = List then - Add_To_Expression_Value (" "); - end if; - - Add_To_Expression_Value (String_Value_Of (Current_Term)); - end if; - - Put (String_Value_Of (Current_Term)); - - when N_Literal_String_List => - -- For string list, we repetedly call Expression with each - -- element of the list. - - declare - String_Node : Project_Node_Id := - First_Expression_In_List (Current_Term); - - begin - if String_Node = Empty_Node then - - -- If String_Node is nil, it is an empty list, - -- set Expression_Kind if it is still Undecided - - if Expression_Kind = Undecided then - Expression_Kind := Static_String; - end if; - - else - Expression - (Project => Project, - First_Term => Tree.First_Term (String_Node), - Kind => Single, - In_Case => In_Case); - - loop - -- Add the other element of the literal string list - -- one after the other - - String_Node := - Next_Expression_In_List (String_Node); - - exit when String_Node = Empty_Node; - - Put (" "); - Add_To_Expression_Value (" "); - Expression - (Project => Project, - First_Term => Tree.First_Term (String_Node), - Kind => Single, - In_Case => In_Case); - end loop; - end if; - end; - - when N_Variable_Reference | N_Attribute_Reference => - -- A variable or attribute reference is never static - - Expression_Kind := Other; - - -- A variable or an attribute is identified by: - -- - its project name, - -- - its package name, if any, - -- - its name, and - -- - its index (if an associative array attribute). - - declare - Term_Project : Project_Node_Id := - Project_Node_Of (Current_Term); - Term_Package : constant Project_Node_Id := - Package_Node_Of (Current_Term); - - Name : constant Name_Id := Name_Of (Current_Term); - - Term_Package_Name : Name_Id := No_Name; - - begin - if Term_Project = Empty_Node then - Term_Project := Project; - end if; - - if Term_Package /= Empty_Node then - Term_Package_Name := Name_Of (Term_Package); - end if; - - -- If we are in a string list, we precede this variable or - -- attribute reference with a space; it does not matter if - -- the output list has a leading space. - - if Kind = List then - Put (" "); - end if; - - Put ("$("); - - if Kind_Of (Current_Term) = N_Variable_Reference then - Put_Variable - (Project => Term_Project, - Pkg => Term_Package_Name, - Name => Name); - - else - -- Attribute reference. - - -- If it is a Default_Switches attribute, check if it - -- is allowed in this expression (same package and same - -- language). - - if Name = Snames.Name_Default_Switches then - if Default_Switches_Package /= Term_Package_Name - or else not Equal_String - (Default_Switches_Language, - Associative_Array_Index_Of - (Current_Term)) - then - -- This Default_Switches attribute is not allowed - -- here; report an error and continue. - -- The Makefiles created will be deleted at the - -- end. - - Error_Msg_Name_1 := Term_Package_Name; - Error_Msg - ("reference to `%''Default_Switches` " & - "not allowed here", - Location_Of (Current_Term)); - end if; - - -- If it is a Switches attribute, check if it is allowed - -- in this expression (same package and same source - -- kind). - - elsif Name = Snames.Name_Switches then - if Switches_Package /= Term_Package_Name - or else Source_Kind_Of (Associative_Array_Index_Of - (Current_Term)) - /= Switches_Language - then - -- This Switches attribute is not allowed here; - -- report an error and continue. The Makefiles - -- created will be deleted at the end. - - Error_Msg_Name_1 := Term_Package_Name; - Error_Msg - ("reference to `%''Switches` " & - "not allowed here", - Location_Of (Current_Term)); - end if; - - else - -- Other attribute references are only allowed in - -- the declaration of an atribute of the same - -- package and of the same name. - - if not Other_Attribute - or else Other_Attribute_Package /= Term_Package_Name - or else Other_Attribute_Name /= Name - then - if Term_Package_Name = No_Name then - Error_Msg_Name_1 := Name; - Error_Msg - ("reference to % not allowed here", - Location_Of (Current_Term)); - - else - Error_Msg_Name_1 := Term_Package_Name; - Error_Msg_Name_2 := Name; - Error_Msg - ("reference to `%''%` not allowed here", - Location_Of (Current_Term)); - end if; - end if; - end if; - - Put_Attribute - (Project => Term_Project, - Pkg => Term_Package_Name, - Name => Name, - Index => Associative_Array_Index_Of (Current_Term)); - end if; - - Put (")"); - end; - - when N_External_Value => - -- An external reference is never static - - Expression_Kind := Other; - - -- As the external references have already been processed, - -- we just output the name of the variable that corresponds - -- to this external reference node. - - Put ("$("); - Put_U_Name (Name_Of (Project)); - Put (".external."); - Put (Externals.Get (Current_Term)); - Put (")"); - - when others => - - -- Should never happen - - pragma Assert - (False, - "illegal node kind in an expression"); - raise Program_Error; - end case; - - Term := Next_Term (Term); - end loop; - end Expression; - - -------------- - -- Gpr2make -- - -------------- - - procedure Gpr2make is - begin - -- First, get the switches, if any - - loop - case Getopt ("h q v R") is - when ASCII.NUL => - exit; - - -- -h: Help - - when 'h' => - Usage; - - -- -q: Quiet - - when 'q' => - Opt.Quiet_Output := True; - - -- -v: Verbose - - when 'v' => - Opt.Verbose_Mode := True; - Display_Copyright; - - -- -R: no Recursivity - - when 'R' => - Process_All_Project_Files := False; - - when others => - raise Program_Error; - end case; - end loop; - - -- Now, get the project file (maximum one) - - loop - declare - S : constant String := Get_Argument (Do_Expansion => True); - begin - exit when S'Length = 0; - - if Main_Project_File_Name /= null then - Fail ("only one project file may be specified"); - - else - Main_Project_File_Name := new String'(S); - end if; - end; - end loop; - - -- If no project file specified, display the usage and exit - - if Main_Project_File_Name = null then - Usage; - return; - end if; - - -- Do the necessary initializations - - Csets.Initialize; - Namet.Initialize; - - Snames.Initialize; - - Prj.Initialize; - - -- Parse the project file(s) - - Prj.Part.Parse (Project_Tree, Main_Project_File_Name.all, False); - - -- If parsing was successful, process the project tree - - if Project_Tree /= Empty_Node then - - -- Create some Name_Ids that are not in Snames - - Name_Len := 3; - Name_Buffer (1 .. Name_Len) := "ide"; - Name_Ide := Name_Find; - - Name_Len := 16; - Name_Buffer (1 .. Name_Len) := "compiler_command"; - Name_Compiler_Command := Name_Find; - - Name_Len := 13; - Name_Buffer (1 .. Name_Len) := "main_language"; - Name_Main_Language := Name_Find; - - Name_Len := 3; - Name_Buffer (1 .. Name_Len) := "c++"; - Name_C_Plus_Plus := Name_Find; - - Process (Project_Tree); - - if Compilation_Errors then - if not Verbose_Mode then - Write_Eol; - end if; - - Prj.Err.Finalize; - Write_Eol; - IO.Delete_All; - Fail ("no Makefile created"); - end if; - end if; - end Gpr2make; - - -------------- - -- New_Line -- - -------------- - - procedure New_Line is - begin - IO.New_Line; - end New_Line; - - ------------- - -- Process -- - ------------- - - procedure Process (Project : Project_Node_Id) is - begin - Processed_Projects.Reset; - Recursive_Process (Project); - end Process; - - ------------------------------- - -- Process_Case_Construction -- - ------------------------------- - - procedure Process_Case_Construction - (Current_Project : Project_Node_Id; - Current_Pkg : Name_Id; - Case_Project : Project_Node_Id; - Case_Pkg : Name_Id; - Name : Name_Id; - Node : Project_Node_Id) - is - Case_Project_Name : constant Name_Id := Name_Of (Case_Project); - Before : IO.Position; - Start : IO.Position; - After : IO.Position; - - procedure Put_Case_Construction; - -- Output the variable $<PROJECT>__CASE__#, specific to - -- this case construction. It contains the number of the - -- branch to follow. - - procedure Recursive_Process - (Case_Item : Project_Node_Id; - Branch_Number : Positive); - -- A recursive procedure. Calls itself for each branch, increasing - -- Branch_Number by 1 each time. - - procedure Put_Variable_Name; - -- Output the case variable - - --------------------------- - -- Put_Case_Construction -- - --------------------------- - - procedure Put_Case_Construction is - begin - Put_U_Name (Case_Project_Name); - Put (".case."); - Put (Last_Case_Construction); - end Put_Case_Construction; - - ----------------------- - -- Recursive_Process -- - ----------------------- - - procedure Recursive_Process - (Case_Item : Project_Node_Id; - Branch_Number : Positive) - is - Choice_String : Project_Node_Id := First_Choice_Of (Case_Item); - - Before : IO.Position; - Start : IO.Position; - After : IO.Position; - - No_Lines : Boolean := False; - - begin - -- Nothing to do if Case_Item is empty. - -- That should happen only if the case construvtion is totally empty. - -- case Var is - -- end case; - - if Case_Item /= Empty_Node then - -- Remember where we are, to be able to come back here if this - -- case item is empty. - - IO.Mark (Before); - - if Choice_String = Empty_Node then - -- when others => - - -- Output a comment "# when others => ..." - - Put_Line ("# when others => ..."); - - -- Remember where we are, to detect if there is anything - -- put in the Makefile for this branch. - - IO.Mark (Start); - - -- Process the declarative items of this branch - - Process_Declarative_Items - (Project => Current_Project, - Pkg => Current_Pkg, - In_Case => True, - Item => First_Declarative_Item_Of (Case_Item)); - - -- Where are we now? - IO.Mark (After); - - -- If we are at the same place, the branch is totally empty: - -- suppress it completely. - - if Start = After then - IO.Release (Before); - end if; - else - -- Case Item with one or several case labels - - -- Output a comment - -- # case <label> => ... - -- or - -- # case <first_Label> | ... => - -- depending on the number of case labels. - - Put ("# when """); - Put (String_Value_Of (Choice_String)); - Put (""""); - - if Next_Literal_String (Choice_String) /= Empty_Node then - Put (" | ..."); - end if; - - Put (" => ..."); - New_Line; - - -- Check if the case variable is equal to the first case label - Put ("ifeq ($("); - Put_Variable_Name; - Put ("),"); - Put (String_Value_Of (Choice_String)); - Put (")"); - New_Line; - - if Next_Literal_String (Choice_String) /= Empty_Node then - -- Several choice strings. We need to use an auxiliary - -- variable <PROJECT.case.# to detect if we should follow - -- this branch. - - loop - Put_Case_Construction; - Put (":="); - Put (Branch_Number); - New_Line; - - Put_Line ("endif"); - - Choice_String := Next_Literal_String (Choice_String); - - exit when Choice_String = Empty_Node; - - Put ("ifeq ($("); - Put_Variable_Name; - Put ("),"); - Put (String_Value_Of (Choice_String)); - Put (")"); - New_Line; - end loop; - - -- Now, we test the auxiliary variable - - Put ("ifeq ($("); - Put_Case_Construction; - Put ("),"); - Put (Branch_Number); - Put (")"); - New_Line; - end if; - - -- Remember where we are before calling - -- Process_Declarative_Items. - - IO.Mark (Start); - - Process_Declarative_Items - (Project => Current_Project, - Pkg => Current_Pkg, - In_Case => True, - Item => First_Declarative_Item_Of (Case_Item)); - - -- Check where we are now, to detect if some lines have been - -- added to the Makefile. - - IO.Mark (After); - - No_Lines := Start = After; - - -- If no lines have been added, then suppress completely this - -- branch. - - if No_Lines then - IO.Release (Before); - end if; - - -- If there is a next branch, process it - - if Next_Case_Item (Case_Item) /= Empty_Node then - -- If this branch has not been suppressed, we need an "else" - - if not No_Lines then - -- Mark the position of the "else" - - IO.Mark (Before); - - Put_Line ("else"); - - -- Mark the position before the next branch - - IO.Mark (Start); - end if; - - Recursive_Process - (Case_Item => Next_Case_Item (Case_Item), - Branch_Number => Branch_Number + 1); - - if not No_Lines then - -- Where are we? - IO.Mark (After); - - -- If we are at the same place, suppress the useless - -- "else". - - if After = Start then - IO.Release (Before); - end if; - end if; - end if; - - -- If the branch has not been suppressed, we need an "endif" - - if not No_Lines then - Put_Line ("endif"); - end if; - end if; - end if; - end Recursive_Process; - - ----------------------- - -- Put_Variable_Name -- - ----------------------- - - procedure Put_Variable_Name is - begin - Put_Variable (Case_Project, Case_Pkg, Name); - end Put_Variable_Name; - - -- Start of procedure Process_Case_Construction - - begin - Last_Case_Construction := Last_Case_Construction + 1; - - -- Remember where we are in case we suppress completely the case - -- construction. - - IO.Mark (Before); - - New_Line; - - -- Output a comment line for this case construction - - Put ("# case "); - Put_M_Name (Case_Project_Name); - - if Case_Pkg /= No_Name then - Put ("."); - Put_M_Name (Case_Pkg); - end if; - - Put ("."); - Put_M_Name (Name); - Put (" is ..."); - New_Line; - - -- Remember where we are, to detect if all branches have been suppressed - - IO.Mark (Start); - - -- Start at the first case item - - Recursive_Process - (Case_Item => First_Case_Item_Of (Node), - Branch_Number => 1); - - -- Where are we? - - IO.Mark (After); - - -- If we are at the same position, it means that all branches have been - -- suppressed: then we suppress completely the case construction. - - if Start = After then - IO.Release (Before); - - else - -- If the case construction is not completely suppressed, we issue - -- a comment indicating the end of the case construction. - - Put_Line ("# end case;"); - - New_Line; - end if; - end Process_Case_Construction; - - ------------------------------- - -- Process_Declarative_Items -- - ------------------------------- - - procedure Process_Declarative_Items - (Project : Project_Node_Id; - Pkg : Name_Id; - In_Case : Boolean; - Item : Project_Node_Id) - is - Current_Declarative_Item : Project_Node_Id := Item; - Current_Item : Project_Node_Id := Empty_Node; - - Project_Name : constant String := - To_Upper (Get_Name_String (Name_Of (Project))); - Item_Name : Name_Id := No_Name; - - begin - -- For each declarative item - - while Current_Declarative_Item /= Empty_Node loop - -- Get its data - - Current_Item := Current_Item_Node (Current_Declarative_Item); - - -- And set Current_Declarative_Item to the next declarative item - -- ready for the next iteration - - Current_Declarative_Item := Next_Declarative_Item - (Current_Declarative_Item); - - -- By default, indicate that we are not declaring attribute - -- Default_Switches or Switches. - - Other_Attribute := False; - - -- Write_Line (Project_Node_Kind'Image (Kind_Of (Current_Item))); - - case Kind_Of (Current_Item) is - - when N_Package_Declaration => - Item_Name := Name_Of (Current_Item); - - declare - Real_Project : constant Project_Node_Id := - Project_Of_Renamed_Package_Of - (Current_Item); - - Before_Package : IO.Position; - Start_Of_Package : IO.Position; - End_Of_Package : IO.Position; - - Decl_Item : Project_Node_Id; - - begin - -- If it is a renaming package, we go to the original - -- package. This is guaranteed to work, otherwise the - -- parsing of the project file tree would have already - -- failed. - - if Real_Project /= Empty_Node then - Decl_Item := - First_Declarative_Item_Of - (Project_Declaration_Of (Real_Project)); - - -- Traverse the declarative items of the project, - -- until we find the renamed package. - - while Decl_Item /= Empty_Node loop - Current_Item := Current_Item_Node (Decl_Item); - exit when Kind_Of (Current_Item) - = N_Package_Declaration - and then Name_Of (Current_Item) = Item_Name; - Decl_Item := Next_Declarative_Item (Decl_Item); - end loop; - end if; - - -- Remember where we are, in case we want to completely - -- suppress this package. - - IO.Mark (Before_Package); - - New_Line; - - -- Output comment line for this package - - Put ("# package "); - Put_M_Name (Item_Name); - Put (" is ..."); - New_Line; - - -- Record where we are before calling - -- Process_Declarative_Items. - - IO.Mark (Start_Of_Package); - - -- And process the declarative items of this package - - Process_Declarative_Items - (Project => Project, - Pkg => Item_Name, - In_Case => False, - Item => First_Declarative_Item_Of (Current_Item)); - - -- Reset the local variables once we have finished with - -- this package. - - Variable_Names.Init; - - -- Where are we? - IO.Mark (End_Of_Package); - - -- If we are at the same place, suppress completely the - -- package. - - if End_Of_Package = Start_Of_Package then - IO.Release (Before_Package); - - else - - -- otherwise, utput comment line for end of package - - Put ("# end "); - Put_M_Name (Item_Name); - Put (";"); - New_Line; - - New_Line; - end if; - end; - - when N_Variable_Declaration | N_Typed_Variable_Declaration => - Item_Name := Name_Of (Current_Item); - - -- Output comment line for this variable - - Put ("# "); - Put_M_Name (Item_Name); - Put (" := ..."); - New_Line; - - -- If we are inside a package, the variable is a local - -- variable, not a project level variable. - -- So we check if its name is included in the Variables - -- table; if it is not already, we put it in the table. - - if Pkg /= No_Name then - declare - Found : Boolean := False; - - begin - for - Index in Variable_Names.First .. Variable_Names.Last - loop - if Variable_Names.Table (Index) = Item_Name then - Found := True; - exit; - end if; - end loop; - - if not Found then - Variable_Names.Increment_Last; - Variable_Names.Table (Variable_Names.Last) := - Item_Name; - end if; - end; - end if; - - -- Output the line <variable_Name>:=<expression> - - Put_Variable (Project, Pkg, Item_Name); - - Put (":="); - - Expression - (Project => Project, - First_Term => Tree.First_Term (Expression_Of (Current_Item)), - Kind => Expression_Kind_Of (Current_Item), - In_Case => In_Case); - - New_Line; - - when N_Attribute_Declaration => - Item_Name := Name_Of (Current_Item); - - declare - Index : constant Name_Id := - Associative_Array_Index_Of (Current_Item); - - Pos_Comment : IO.Position; - Put_Declaration : Boolean := True; - - begin - -- If it is a Default_Switches attribute register the - -- project, the package and the language to indicate - -- what Default_Switches attribute references are allowed - -- in expressions. - - if Item_Name = Snames.Name_Default_Switches then - Default_Switches_Package := Pkg; - Default_Switches_Language := Index; - - -- If it is a Switches attribute register the project, - -- the package and the source kind to indicate what - -- Switches attribute references are allowed in expressions. - - elsif Item_Name = Snames.Name_Switches then - Switches_Package := Pkg; - Switches_Language := Source_Kind_Of (Index); - - else - -- Set Other_Attribute to True to indicate that we are - -- in the declaration of an attribute other than - -- Switches or Default_Switches. - - Other_Attribute := True; - Other_Attribute_Package := Pkg; - Other_Attribute_Name := Item_Name; - end if; - - -- Record where we are to be able to suppress the - -- declaration. - - IO.Mark (Pos_Comment); - - -- Output comment line for this attribute - - Put ("# for "); - Put_M_Name (Item_Name); - - if Index /= No_Name then - Put (" ("""); - Put (Index); - Put (""")"); - end if; - - Put (" use ..."); - New_Line; - - -- Output the line <attribute_name>:=<expression> - - Put_Attribute (Project, Pkg, Item_Name, Index); - Put (":="); - Expression - (Project => Project, - First_Term => - Tree.First_Term (Expression_Of (Current_Item)), - Kind => Expression_Kind_Of (Current_Item), - In_Case => In_Case, - Reset => True); - New_Line; - - -- Remove any Default_Switches attribute declaration for - -- languages other than C or C++. - - if Item_Name = Snames.Name_Default_Switches then - Get_Name_String (Index); - To_Lower (Name_Buffer (1 .. Name_Len)); - Put_Declaration := - Name_Buffer (1 .. Name_Len) = "c" or else - Name_Buffer (1 .. Name_Len) = "c++"; - - -- Remove any Switches attribute declaration for source - -- kinds other than C, C++ or unknown. - - elsif Item_Name = Snames.Name_Switches then - Put_Declaration := - Switches_Language = Unknown - or else Switches_Language = C - or else Switches_Language = Cxx; - - end if; - - -- Attributes in packages other than Naming, Compiler or - -- IDE are of no interest; suppress their declarations. - - Put_Declaration := Put_Declaration and - (Pkg = No_Name - or else Pkg = Snames.Name_Naming - or else Pkg = Snames.Name_Compiler - or else Pkg = Name_Ide - or else Pkg = Snames.Name_Linker); - - if Put_Declaration then - -- Some attributes are converted into reserved variables - - if Pkg = No_Name then - - -- Project level attribute - - if Item_Name = Snames.Name_Languages then - - -- for Languages use ... - - -- Attribute Languages is converted to variable - -- LANGUAGES. The actual string is put in lower - -- case. - - Put ("LANGUAGES:="); - - -- If the expression is static (expected to be so - -- most of the cases), then just give to LANGUAGES - -- the lower case value of the expression. - - if Expression_Kind = Static_String then - Put (To_Lower (Expression_Value - (1 .. Expression_Last))); - - else - -- Otherwise, call to_lower on the value - -- of the attribute. - - Put ("$(shell gprcmd to_lower $("); - Put_Attribute - (Project, No_Name, Item_Name, No_Name); - Put ("))"); - end if; - - New_Line; - - -- Record value of Languages if expression is - -- static and if Languages_Static is True. - - if Expression_Kind /= Static_String then - Languages_Static := False; - - elsif Languages_Static then - To_Lower - (Expression_Value (1 .. Expression_Last)); - - if Languages_Last = 0 then - if Languages'Last < Expression_Last + 2 then - Free (Languages); - Languages := - new String (1 .. Expression_Last + 2); - end if; - - Languages (1) := ' '; - Languages (2 .. Expression_Last + 1) := - Expression_Value (1 .. Expression_Last); - Languages_Last := Expression_Last + 2; - Languages (Languages_Last) := ' '; - - else - Languages_Static := - Languages (2 .. Languages_Last - 1) = - Expression_Value (1 .. Expression_Last); - end if; - end if; - - elsif Item_Name = Snames.Name_Source_Dirs then - - -- for Source_Dirs use ... - - -- String list attribute Source_Dirs is converted - -- to variable <PROJECT>.src_dirs, each element - -- being an absolute directory name. - - Put (Project_Name & - ".src_dirs:=$(foreach name,$("); - Put_Attribute (Project, Pkg, Item_Name, No_Name); - Put ("),$(shell gprcmd extend $("); - Put (Project_Name); - Put_Line (".base_dir) '""$(name)""'))"); - - elsif Item_Name = Snames.Name_Source_Files then - - -- for Source_Files use ... - - -- String list Source_Files is converted to - -- variable <PROJECT>.src_files - - Put (Project_Name); - Put (".src_files:=$("); - Put_Attribute (Project, Pkg, Item_Name, No_Name); - Put (")"); - New_Line; - - if In_Case then - if Source_Files_Declaration = False then - Source_Files_Declaration := May_Be; - end if; - - if Source_Files_Declaration /= True then - - -- Variable src_files.specified is set to - -- TRUE. It will be tested to decide if there - -- is a need to look for source files either - -- in the source directories or in a source - -- list file. - - Put_Line ("src_files.specified:=TRUE"); - end if; - - else - Source_Files_Declaration := True; - end if; - - elsif Item_Name = Snames.Name_Source_List_File then - - -- for Source_List_File use ... - - -- Single string Source_List_File is converted to - -- variable src.list_file. It will be used - -- later, if necessary, to get the source - -- file names from the specified file. - -- The file name is converted to an absolute path - -- name if necessary. - - Put ("src.list_file:=" & - "$(strip $(shell gprcmd to_absolute $("); - Put (Project_Name); - Put (".base_dir) '$("); - Put_Attribute (Project, Pkg, Item_Name, No_Name); - Put_Line (")'))"); - - if In_Case then - if Source_List_File_Declaration = False then - Source_List_File_Declaration := May_Be; - end if; - - if Source_Files_Declaration /= True - and then Source_List_File_Declaration /= True - then - -- Variable src_list_file.specified is set to - -- TRUE. It will be tested later, if - -- necessary, to read the source list file. - - Put_Line ("src_list_file.specified:=TRUE"); - end if; - - else - Source_List_File_Declaration := True; - end if; - - elsif Item_Name = Snames.Name_Object_Dir then - - -- for Object_Dir use ... - - -- Single string attribute Object_Dir is converted - -- to variable <PROJECT>.obj_dir. The directory is - -- converted to an absolute path name, - -- if necessary. - - Put (Project_Name); - Put (".obj_dir:=" & - "$(strip $(shell gprcmd to_absolute $("); - Put (Project_Name); - Put (".base_dir) '$("); - Put_Attribute (Project, Pkg, Item_Name, No_Name); - Put_Line (")'))"); - - elsif Item_Name = Snames.Name_Exec_Dir then - - -- for Exec_Dir use ... - - -- Single string attribute Exec_Dir is converted - -- to variable EXEC_DIR. The directory is - -- converted to an absolute path name, - -- if necessary. - - Put ("EXEC_DIR:=" & - "$(strip $(shell gprcmd to_absolute $("); - Put (Project_Name); - Put (".base_dir) '$("); - Put_Attribute (Project, Pkg, Item_Name, No_Name); - Put_Line (")'))"); - - elsif Item_Name = Snames.Name_Main then - - -- for Mains use ... - - -- String list attribute Main is converted to - -- variable ADA_MAINS. - - Put ("ADA_MAINS:=$("); - Put_Attribute (Project, Pkg, Item_Name, No_Name); - Put (")"); - New_Line; - - elsif Item_Name = Name_Main_Language then - - -- for Main_Language use ... - - Put ("MAIN:="); - - -- If the expression is static (expected to be so - -- most of the cases), then just give to MAIN - -- the lower case value of the expression. - - if Expression_Kind = Static_String then - Put (To_Lower (Expression_Value - (1 .. Expression_Last))); - - else - -- Otherwise, call to_lower on the value - -- of the attribute. - - Put ("$(shell gprcmd to_lower $("); - Put_Attribute - (Project, No_Name, Item_Name, No_Name); - Put ("))"); - end if; - - New_Line; - - else - -- Other attribute are of no interest; suppress - -- their declarations. - - Put_Declaration := False; - end if; - - elsif Pkg = Snames.Name_Compiler then - -- Attribute of package Compiler - - if Item_Name = Snames.Name_Switches then - - -- for Switches (<file_name>) use ... - - -- As the C and C++ extension may not be known - -- statically, at the end of the processing of this - -- project file, a test will done to decide if the - -- file name (the index) has a C or C++ extension. - -- The index is recorded in the table Switches, - -- making sure that it appears only once. - - declare - Found : Boolean := False; - begin - for J in Switches.First .. Switches.Last loop - if Switches.Table (J) = Index then - Found := True; - exit; - end if; - end loop; - - if not Found then - Switches.Increment_Last; - Switches.Table (Switches.Last) := Index; - end if; - end; - - elsif Item_Name = Snames.Name_Default_Switches then - Get_Name_String (Index); - To_Lower (Name_Buffer (1 .. Name_Len)); - - if Name_Buffer (1 .. Name_Len) = "c" then - Put ("CFLAGS:=$("); - Put_Attribute (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - elsif Name_Buffer (1 .. Name_Len) = "c++" then - Put ("CXXFLAGS:=$("); - Put_Attribute (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - end if; - else - -- Other attribute are of no interest; suppress - -- their declarations. - - Put_Declaration := False; - end if; - - elsif Pkg = Name_Ide then - - -- Attributes of package IDE - - if Item_Name = Name_Compiler_Command then - - -- for Compiler_Command (<language>) use ... - - declare - Index_Name : Name_Id := No_Name; - - begin - Get_Name_String (Index); - To_Lower (Name_Buffer (1 .. Name_Len)); - Index_Name := Name_Find; - - -- Only "Ada", "C" and "C++" are of interest - - if Index_Name = Snames.Name_Ada then - - -- For "Ada", we set the variable $GNATMAKE - - Put ("GNATMAKE:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - elsif Index_Name = Snames.Name_C then - - -- For "C", we set the variable $CC - - Put ("CC:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - elsif Index_Name = Name_C_Plus_Plus then - - -- For "C++", we set the variable $CXX - - Put ("CXX:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - end if; - end; - else - -- Other attribute are of no interest; suppress - -- their declarations. - - Put_Declaration := False; - end if; - - elsif Pkg = Snames.Name_Naming then - -- Attributes of package Naming - - if Item_Name = Snames.Name_Body_Suffix then - - -- for Body_Suffix (<language>) use ... - - declare - Index_Name : Name_Id := No_Name; - - begin - Get_Name_String (Index); - To_Lower (Name_Buffer (1 .. Name_Len)); - Index_Name := Name_Find; - - -- Languages "C", "C++" & "Ada" are of interest - - if Index_Name = Snames.Name_C then - - -- For "C", we set the variable C_EXT - - Put ("C_EXT:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - if Expression_Kind /= Static_String then - C_Suffix_Static := False; - - elsif C_Suffix_Static then - if C_Suffix_Last = 0 then - if C_Suffix'Last < Expression_Last then - Free (C_Suffix); - C_Suffix := new String' - (Expression_Value - (1 .. Expression_Last)); - - else - C_Suffix (1 .. Expression_Last) := - Expression_Value - (1 .. Expression_Last); - end if; - - C_Suffix_Last := Expression_Last; - - else - C_Suffix_Static := - Expression_Value - (1 .. Expression_Last) = - C_Suffix (1 .. C_Suffix_Last); - end if; - end if; - - elsif Index_Name = Name_C_Plus_Plus then - - -- For "C++", we set the variable CXX_EXT - - Put ("CXX_EXT:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - if Expression_Kind /= Static_String then - Cxx_Suffix_Static := False; - - elsif Cxx_Suffix_Static then - if Cxx_Suffix_Last = 0 then - if - Cxx_Suffix'Last < Expression_Last - then - Free (Cxx_Suffix); - Cxx_Suffix := new String' - (Expression_Value - (1 .. Expression_Last)); - - else - Cxx_Suffix (1 .. Expression_Last) := - Expression_Value - (1 .. Expression_Last); - end if; - - Cxx_Suffix_Last := Expression_Last; - - else - Cxx_Suffix_Static := - Expression_Value - (1 .. Expression_Last) = - Cxx_Suffix (1 .. Cxx_Suffix_Last); - end if; - end if; - - elsif Index_Name = Snames.Name_Ada then - - -- For "Ada", we set the variable ADA_BODY - - Put ("ADA_BODY:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - if Expression_Kind /= Static_String then - Ada_Body_Suffix_Static := False; - - elsif Ada_Body_Suffix_Static then - if Ada_Body_Suffix_Last = 0 then - if - Ada_Body_Suffix'Last < Expression_Last - then - Free (Ada_Body_Suffix); - Ada_Body_Suffix := new String' - (Expression_Value - (1 .. Expression_Last)); - - else - Ada_Body_Suffix - (1 .. Expression_Last) := - Expression_Value - (1 .. Expression_Last); - end if; - - Ada_Body_Suffix_Last := Expression_Last; - - else - Ada_Body_Suffix_Static := - Expression_Value - (1 .. Expression_Last) = - Ada_Body_Suffix - (1 .. Ada_Body_Suffix_Last); - end if; - end if; - end if; - end; - - elsif Item_Name = Snames.Name_Spec_Suffix then - - -- for Spec_Suffix (<language>) use ... - - declare - Index_Name : Name_Id := No_Name; - - begin - Get_Name_String (Index); - To_Lower (Name_Buffer (1 .. Name_Len)); - Index_Name := Name_Find; - - -- Only "Ada" is of interest - - if Index_Name = Snames.Name_Ada then - - -- For "Ada", we set the variable ADA_SPEC - - Put ("ADA_SPEC:=$("); - Put_Attribute - (Project, Pkg, Item_Name, Index); - Put (")"); - New_Line; - - if Expression_Kind /= Static_String then - Ada_Spec_Suffix_Static := False; - - elsif Ada_Spec_Suffix_Static then - if Ada_Spec_Suffix_Last = 0 then - if - Ada_Spec_Suffix'Last < Expression_Last - then - Free (Ada_Spec_Suffix); - Ada_Spec_Suffix := new String' - (Expression_Value - (1 .. Expression_Last)); - - else - Ada_Spec_Suffix - (1 .. Expression_Last) := - Expression_Value - (1 .. Expression_Last); - end if; - - Ada_Spec_Suffix_Last := Expression_Last; - - else - Ada_Spec_Suffix_Static := - Expression_Value - (1 .. Expression_Last) = - Ada_Spec_Suffix - (1 .. Ada_Spec_Suffix_Last); - end if; - end if; - end if; - end; - - else - -- Other attribute are of no interest; suppress - -- their declarations. - - Put_Declaration := False; - end if; - - elsif Pkg = Snames.Name_Linker then - if Item_Name = Snames.Name_Linker_Options then - - -- Only add linker options if this is not the - -- root project. - - Put ("ifeq ($("); - Put (Project_Name); - Put (".root),False)"); - New_Line; - - -- Add linker options to FLDFLAGS in reverse order - - Put (" FLDFLAGS:=$(shell gprcmd linkopts $("); - Put (Project_Name); - Put (".base_dir) $("); - Put_Attribute - (Project, Pkg, Item_Name, No_Name); - Put (")) $(FLDFLAGS)"); - New_Line; - - Put ("endif"); - New_Line; - - -- Other attributes are of no interest. Suppress - -- their declarations. - - else - Put_Declaration := False; - end if; - end if; - end if; - - -- Suppress the attribute declaration if not needed - - if not Put_Declaration then - IO.Release (Pos_Comment); - end if; - end; - - when N_Case_Construction => - - -- case <typed_string_variable> is ... - - declare - Case_Project : Project_Node_Id := Project; - Case_Pkg : Name_Id := No_Name; - Variable_Node : constant Project_Node_Id := - Case_Variable_Reference_Of (Current_Item); - Variable_Name : constant Name_Id := Name_Of (Variable_Node); - - begin - if Project_Node_Of (Variable_Node) /= Empty_Node then - Case_Project := Project_Node_Of (Variable_Node); - end if; - - if Package_Node_Of (Variable_Node) /= Empty_Node then - Case_Pkg := Name_Of (Package_Node_Of (Variable_Node)); - end if; - - -- If we are in a package, and no package is specified - -- for the case variable, we look into the table - -- Variables_Names to decide if it is a variable local - -- to the package or a project level variable. - - if Pkg /= No_Name - and then Case_Pkg = No_Name - and then Case_Project = Project - then - for - Index in Variable_Names.First .. Variable_Names.Last - loop - if Variable_Names.Table (Index) = Variable_Name then - Case_Pkg := Pkg; - exit; - end if; - end loop; - end if; - - -- The real work is done in Process_Case_Construction. - - Process_Case_Construction - (Current_Project => Project, - Current_Pkg => Pkg, - Case_Project => Case_Project, - Case_Pkg => Case_Pkg, - Name => Variable_Name, - Node => Current_Item); - end; - - when others => - null; - - end case; - end loop; - end Process_Declarative_Items; - - ----------------------- - -- Process_Externals -- - ----------------------- - procedure Process_Externals (Project : Project_Node_Id) is - Project_Name : constant Name_Id := Name_Of (Project); - - No_External_Yet : Boolean := True; - - procedure Expression (First_Term : Project_Node_Id); - -- Look for external reference in the term of an expression. - -- If one is found, build the Makefile external reference variable. - - procedure Process_Declarative_Items (Item : Project_Node_Id); - -- Traverse the declarative items of a project file to find all - -- external references. - - ---------------- - -- Expression -- - ---------------- - - procedure Expression (First_Term : Project_Node_Id) is - Term : Project_Node_Id := First_Term; - -- The term in the expression list - - Current_Term : Project_Node_Id := Empty_Node; - -- The current term node id - - Default : Project_Node_Id; - - begin - -- Check each term of the expression - - while Term /= Empty_Node loop - Current_Term := Tree.Current_Term (Term); - - if Kind_Of (Current_Term) = N_External_Value then - - -- If it is the first external reference of this project file, - -- output a comment - - if No_External_Yet then - No_External_Yet := False; - New_Line; - - Put_Line ("# external references"); - - New_Line; - end if; - - -- Increase Last_External and record the node of the external - -- reference in table Externals, so that the external reference - -- variable can be identified later. - - Last_External := Last_External + 1; - Externals.Set (Current_Term, Last_External); - - Default := External_Default_Of (Current_Term); - - Get_Name_String - (String_Value_Of (External_Reference_Of (Current_Term))); - - declare - External_Name : constant String := - Name_Buffer (1 .. Name_Len); - - begin - -- Output a comment for this external reference - - Put ("# external ("""); - Put (External_Name); - - if Default /= Empty_Node then - Put (""", """); - Put (String_Value_Of (Default)); - end if; - - Put (""")"); - New_Line; - - -- If there is no default, output one line: - - -- <PROJECT>__EXTERNAL__#:=$(<external name>) - - if Default = Empty_Node then - Put_U_Name (Project_Name); - Put (".external."); - Put (Last_External); - Put (":=$("); - Put (External_Name, With_Substitution => True); - Put (")"); - New_Line; - - else - -- When there is a default, output the following lines: - - -- ifeq ($(<external_name),) - -- <PROJECT>__EXTERNAL__#:=<default> - -- else - -- <PROJECT>__EXTERNAL__#:=$(<external_name>) - -- endif - - Put ("ifeq ($("); - Put (External_Name, With_Substitution => True); - Put ("),)"); - New_Line; - - Put (" "); - Put_U_Name (Project_Name); - Put (".external."); - Put (Last_External); - Put (":="); - Put (String_Value_Of (Default)); - New_Line; - - Put_Line ("else"); - - Put (" "); - Put_U_Name (Project_Name); - Put (".external."); - Put (Last_External); - Put (":=$("); - Put (External_Name, With_Substitution => True); - Put (")"); - New_Line; - - Put_Line ("endif"); - end if; - end; - end if; - - Term := Next_Term (Term); - end loop; - end Expression; - - ------------------------------- - -- Process_Declarative_Items -- - ------------------------------- - - procedure Process_Declarative_Items (Item : Project_Node_Id) is - Current_Declarative_Item : Project_Node_Id := Item; - Current_Item : Project_Node_Id := Empty_Node; - - begin - -- For each declarative item - - while Current_Declarative_Item /= Empty_Node loop - Current_Item := Current_Item_Node (Current_Declarative_Item); - - -- Set Current_Declarative_Item to the next declarative item - -- ready for the next iteration - - Current_Declarative_Item := Next_Declarative_Item - (Current_Declarative_Item); - - -- Write_Line (Project_Node_Kind'Image (Kind_Of (Current_Item))); - - case Kind_Of (Current_Item) is - - when N_Package_Declaration => - - -- Recursive call the declarative items of a package - - if - Project_Of_Renamed_Package_Of (Current_Item) = Empty_Node - then - Process_Declarative_Items - (First_Declarative_Item_Of (Current_Item)); - end if; - - when N_Attribute_Declaration | - N_Typed_Variable_Declaration | - N_Variable_Declaration => - - -- Process the expression to look for external references - - Expression - (First_Term => Tree.First_Term - (Expression_Of (Current_Item))); - - when N_Case_Construction => - - -- Recursive calls to process the declarative items of - -- each case item. - - declare - Case_Item : Project_Node_Id := - First_Case_Item_Of (Current_Item); - - begin - while Case_Item /= Empty_Node loop - Process_Declarative_Items - (First_Declarative_Item_Of (Case_Item)); - Case_Item := Next_Case_Item (Case_Item); - end loop; - end; - - when others => - null; - end case; - end loop; - end Process_Declarative_Items; - - -- Start of procedure Process_Externals - - begin - Process_Declarative_Items - (First_Declarative_Item_Of (Project_Declaration_Of (Project))); - - if not No_External_Yet then - Put_Line ("# end of external references"); - New_Line; - end if; - end Process_Externals; - - --------- - -- Put -- - --------- - - procedure Put (S : String; With_Substitution : Boolean := False) is - begin - IO.Put (S); - - -- If With_Substitution is True, check if S is one of the reserved - -- variables. If it is, append to it the Saved_Suffix. - - if With_Substitution then - for J in Reserved_Variables'Range loop - if S = Reserved_Variables (J).all then - IO.Put (Saved_Suffix); - exit; - end if; - end loop; - end if; - end Put; - - procedure Put (P : Positive) is - Image : constant String := P'Img; - - begin - Put (Image (Image'First + 1 .. Image'Last)); - end Put; - - procedure Put (S : Name_Id) is - begin - Get_Name_String (S); - Put (Name_Buffer (1 .. Name_Len)); - end Put; - - ------------------- - -- Put_Attribute -- - ------------------- - - procedure Put_Attribute - (Project : Project_Node_Id; - Pkg : Name_Id; - Name : Name_Id; - Index : Name_Id) - is - begin - Put_U_Name (Name_Of (Project)); - - if Pkg /= No_Name then - Put ("."); - Put_L_Name (Pkg); - end if; - - Put ("."); - Put_L_Name (Name); - - if Index /= No_Name then - Put ("."); - - -- For attribute Switches, we don't want to change the file name - - if Name = Snames.Name_Switches then - Get_Name_String (Index); - Put (Name_Buffer (1 .. Name_Len)); - - else - Special_Put_U_Name (Index); - end if; - end if; - end Put_Attribute; - - ----------------------------- - -- Put_Directory_Separator -- - ----------------------------- - - procedure Put_Directory_Separator is - begin - Put (S => (1 => Directory_Separator)); - end Put_Directory_Separator; - - ------------------------- - -- Put_Include_Project -- - ------------------------- - - procedure Put_Include_Project - (Included_Project_Path : Name_Id; - Included_Project : Project_Node_Id; - Including_Project_Name : String) - is - begin - -- If path is null, there is nothing to do. - -- This happens when there is no project being extended. - - if Included_Project_Path /= No_Name then - Get_Name_String (Included_Project_Path); - - declare - Included_Project_Name : constant String := - Get_Name_String (Name_Of (Included_Project)); - Included_Directory_Path : constant String := - Dir_Name (Name_Buffer (1 .. Name_Len)); - Last : Natural := Included_Directory_Path'Last; - - begin - -- Remove possible directory separator at end of the directory - - if Last >= Included_Directory_Path'First - and then (Included_Directory_Path (Last) = Directory_Separator - or else - Included_Directory_Path (Last) = '/') - then - Last := Last - 1; - end if; - - Put ("BASE_DIR="); - - -- If it is a relative path, precede the directory with - -- $(<PROJECT>.base_dir)/ - - if not Is_Absolute_Path (Included_Directory_Path) then - Put ("$("); - Put (Including_Project_Name); - Put (".base_dir)/"); - end if; - - Put (Included_Directory_Path - (Included_Directory_Path'First .. Last)); - New_Line; - - -- Include the Makefile - - Put ("include $(BASE_DIR)"); - Put_Directory_Separator; - Put ("Makefile."); - Put (To_Lower (Included_Project_Name)); - New_Line; - - New_Line; - end; - end if; - end Put_Include_Project; - - -------------- - -- Put_Line -- - -------------- - - procedure Put_Line (S : String) is - begin - IO.Put (S); - IO.New_Line; - end Put_Line; - - ---------------- - -- Put_L_Name -- - ---------------- - - procedure Put_L_Name (N : Name_Id) is - begin - Put (To_Lower (Get_Name_String (N))); - end Put_L_Name; - - ---------------- - -- Put_M_Name -- - ---------------- - - procedure Put_M_Name (N : Name_Id) is - Name : String := Get_Name_String (N); - - begin - To_Mixed (Name); - Put (Name); - end Put_M_Name; - - ---------------- - -- Put_U_Name -- - ---------------- - - procedure Put_U_Name (N : Name_Id) is - begin - Put (To_Upper (Get_Name_String (N))); - end Put_U_Name; - - ------------------ - -- Put_Variable -- - ------------------ - - procedure Put_Variable - (Project : Project_Node_Id; - Pkg : Name_Id; - Name : Name_Id) - is - begin - Put_U_Name (Name_Of (Project)); - - if Pkg /= No_Name then - Put ("."); - Put_L_Name (Pkg); - end if; - - Put ("."); - Put_U_Name (Name); - end Put_Variable; - - ----------------------- - -- Recursive_Process -- - ----------------------- - - procedure Recursive_Process (Project : Project_Node_Id) is - With_Clause : Project_Node_Id; - Last_Case : Natural := Last_Case_Construction; - There_Are_Cases : Boolean := False; - May_Be_C_Sources : Boolean := False; - May_Be_Cxx_Sources : Boolean := False; - Post_Processing : Boolean := False; - Src_Files_Init : IO.Position; - Src_List_File_Init : IO.Position; - begin - -- Nothing to do if Project is nil. - - if Project /= Empty_Node then - declare - Declaration_Node : constant Project_Node_Id := - Project_Declaration_Of (Project); - -- Used to get the project being extended, if any, and the - -- declarative items of the project to be processed. - - Name : constant Name_Id := Name_Of (Project); - -- Name of the project being processed - - Directory : constant Name_Id := Directory_Of (Project); - -- Directory of the project being processed. Used as default - -- for the object directory and the source directories. - - Lname : constant String := To_Lower (Get_Name_String (Name)); - -- <project>: name of the project in lower case - - Uname : constant String := To_Upper (Lname); - -- <PROJECT>: name of the project in upper case - - begin - -- Nothing to do if project file has already been processed - - if Processed_Projects.Get (Name) = Empty_Node then - - -- Put project name in table Processed_Projects to avoid - -- processing the project several times. - - Processed_Projects.Set (Name, Project); - - -- Process all the projects imported, if any - - if Process_All_Project_Files then - With_Clause := First_With_Clause_Of (Project); - - while With_Clause /= Empty_Node loop - Recursive_Process (Project_Node_Of (With_Clause)); - With_Clause := Next_With_Clause_Of (With_Clause); - end loop; - - -- Process the project being extended, if any. - -- If there is no project being extended, - -- Process_Declarative_Items will be called with Empty_Node - -- and nothing will happen. - - Recursive_Process (Extended_Project_Of (Declaration_Node)); - end if; - - Source_Files_Declaration := False; - Source_List_File_Declaration := False; - - -- Build in Name_Buffer the path name of the Makefile - - -- Start with the directory of the project file - - Get_Name_String (Directory); - - -- Add a directory separator, if needed - - if Name_Buffer (Name_Len) /= Directory_Separator then - Name_Len := Name_Len + 1; - Name_Buffer (Name_Len) := Directory_Separator; - end if; - - -- Add the filename of the Makefile: "Makefile.<project>" - - Name_Buffer (Name_Len + 1 .. Name_Len + 9) := "Makefile."; - Name_Len := Name_Len + 9; - - Name_Buffer (Name_Len + 1 .. Name_Len + Lname'Length) := - Lname; - Name_Len := Name_Len + Lname'Length; - - IO.Create (Name_Buffer (1 .. Name_Len)); - - -- Display the Makefile being created, but only if not in - -- quiet output. - - if not Opt.Quiet_Output then - Write_Str ("creating """); - Write_Str (IO.Name_Of_File); - Write_Line (""""); - end if; - - -- And create the Makefile - - New_Line; - - -- Outut a comment with the path name of the Makefile - Put ("# "); - Put_Line (IO.Name_Of_File); - - New_Line; - - -- The Makefile is a big ifeq to avoid multiple inclusion - -- ifeq ($(<PROJECT>.project),) - -- <PROJECT>.project:=True - -- ... - -- endif - - Put ("ifeq ($("); - Put (Uname); - Put (".project),)"); - New_Line; - - Put (Uname); - Put (".project=True"); - New_Line; - - New_Line; - - -- If it is the main Makefile (BASE_DIR is empty) - - Put_Line ("ifeq ($(BASE_DIR),)"); - - -- Set <PROJECT>.root to True - - Put (" "); - Put (Uname); - Put (".root=True"); - New_Line; - - Put (" "); - Put (Uname); - Put (".base_dir:=$(shell gprcmd pwd)"); - New_Line; - - -- Include some utility functions and saved all reserved - -- env. vars. by including Makefile.prolog. - - New_Line; - - -- First, if MAKE_ROOT is not defined, try to get GNAT prefix - - Put (" ifeq ($("); - Put (MAKE_ROOT); - Put ("),)"); - New_Line; - - Put (" MAKE_ROOT=$(shell gprcmd prefix)"); - New_Line; - - Put (" endif"); - New_Line; - - New_Line; - - -- If MAKE_ROOT is still not defined, then fail - - Put (" ifeq ($("); - Put (MAKE_ROOT); - Put ("),)"); - New_Line; - - Put (" $(error "); - Put (MAKE_ROOT); - Put (" variable is undefined, "); - Put ("Makefile.prolog cannot be loaded)"); - New_Line; - - Put_Line (" else"); - - Put (" include $("); - Put (MAKE_ROOT); - Put (")"); - Put_Directory_Separator; - Put ("share"); - Put_Directory_Separator; - Put ("gnat"); - Put_Directory_Separator; - Put ("Makefile.prolog"); - New_Line; - - Put_Line (" endif"); - - -- Initialize some defaults - - Put (" OBJ_EXT:="); - Put (Get_Object_Suffix.all); - New_Line; - - Put_Line ("else"); - - -- When not the main Makefile, set <PROJECT>.root to False - - Put (" "); - Put (Uname); - Put (".root=False"); - New_Line; - - Put (" "); - Put (Uname); - Put (".base_dir:=$(BASE_DIR)"); - New_Line; - - Put_Line ("endif"); - New_Line; - - -- For each imported project, if any, set BASE_DIR to the - -- directory of the imported project, and add an include - -- directive for the Makefile of the imported project. - - With_Clause := First_With_Clause_Of (Project); - - while With_Clause /= Empty_Node loop - Put_Include_Project - (String_Value_Of (With_Clause), - Project_Node_Of (With_Clause), - Uname); - With_Clause := Next_With_Clause_Of (With_Clause); - end loop; - - -- Do the same if there is a project being extended. - -- If there is no project being extended, Put_Include_Project - -- will return immediately. - - Put_Include_Project - (Extended_Project_Path_Of (Project), - Extended_Project_Of (Declaration_Node), - Uname); - - -- Set defaults to some variables - - -- CFLAGS and CXXFLAGS are set by default to nothing. - -- Their initial values have been saved, If they are not set - -- by this project file, then they will be reset to their - -- initial values. This is to avoid "inheritance" of these - -- flags from an imported project file. - - Put_Line ("CFLAGS:="); - Put_Line ("CXXFLAGS:="); - - IO.Mark (Src_Files_Init); - Put_Line ("src_files.specified:=FALSE"); - - IO.Mark (Src_List_File_Init); - Put_Line ("src_list_file.specified:=FALSE"); - - -- Default language is Ada, but variable LANGUAGES may have - -- been changed by an imported Makefile. So, we set it - -- to "ada"; if attribute Languages is defined in the project - -- file, it will be redefined. - - Put_Line ("LANGUAGES:=ada"); - - -- <PROJECT>.src_dirs is set by default to the project - -- directory. - - Put (Uname); - Put (".src_dirs:=$("); - Put (Uname); - Put (".base_dir)"); - New_Line; - - -- <PROJECT>.obj_dir is set by default to the project - -- directory. - - Put (Uname); - Put (".obj_dir:=$("); - Put (Uname); - Put (".base_dir)"); - New_Line; - - -- PROJECT_FILE:=<project> - - Put ("PROJECT_FILE:="); - Put (Lname); - New_Line; - - -- Output a comment indicating the name of the project being - -- processed. - - Put ("# project "); - Put_M_Name (Name); - New_Line; - - -- Process the external references of this project file - - Process_Externals (Project); - - New_Line; - - -- Reset the compiler switches, the suffixes and the languages - - Switches.Init; - Reset_Suffixes_And_Languages; - - -- Record the current value of Last_Case_Construction to - -- detect if there are case constructions in this project file. - - Last_Case := Last_Case_Construction; - - -- Process the declarative items of this project file - - Process_Declarative_Items - (Project => Project, - Pkg => No_Name, - In_Case => False, - Item => First_Declarative_Item_Of (Declaration_Node)); - - -- Set There_Are_Case to True if there are case constructions - -- in this project file. - - There_Are_Cases := Last_Case /= Last_Case_Construction; - - -- If the suffixes and the languages have not been specified, - -- give them the default values. - - if C_Suffix_Static and then C_Suffix_Last = 0 then - C_Suffix_Last := 2; - C_Suffix (1 .. 2) := ".c"; - end if; - - if Cxx_Suffix_Static and then Cxx_Suffix_Last = 0 then - Cxx_Suffix_Last := 3; - Cxx_Suffix (1 .. 3) := ".cc"; - end if; - - if Ada_Body_Suffix_Static and then Ada_Body_Suffix_Last = 0 then - Ada_Body_Suffix_Last := 4; - Ada_Body_Suffix (1 .. 4) := ".adb"; - end if; - - if Ada_Spec_Suffix_Static and then Ada_Spec_Suffix_Last = 0 then - Ada_Spec_Suffix_Last := 4; - Ada_Spec_Suffix (1 .. 4) := ".ads"; - end if; - - if Languages_Static and then Languages_Last = 0 then - Languages_Last := 5; - Languages (1 .. 5) := " ada "; - end if; - - -- There may be C sources if the languages are not known - -- statically or if the languages include "C". - - May_Be_C_Sources := (not Languages_Static) - or else Index - (Source => Languages (1 .. Languages_Last), - Pattern => " c ") /= 0; - - -- There may be C++ sources if the languages are not known - -- statically or if the languages include "C++". - - May_Be_Cxx_Sources := (not Languages_Static) - or else Index - (Source => Languages (1 .. Languages_Last), - Pattern => " c++ ") /= 0; - - New_Line; - - -- If there are attribute Switches specified in package - -- Compiler of this project, post-process them. - - if Switches.Last >= Switches.First then - - -- Output a comment indicating this post-processing - - for Index in Switches.First .. Switches.Last loop - Get_Name_String (Switches.Table (Index)); - - declare - File : constant String := - Name_Buffer (1 .. Name_Len); - Source_Kind : Source_Kind_Type := Unknown; - - begin - -- First, attempt to determine the language - - if Ada_Body_Suffix_Static then - if File'Length > Ada_Body_Suffix_Last - and then - File (File'Last - Ada_Body_Suffix_Last + 1 .. - File'Last) = - Ada_Body_Suffix - (1 .. Ada_Body_Suffix_Last) - then - Source_Kind := Ada_Body; - end if; - end if; - - if Source_Kind = Unknown - and then Ada_Spec_Suffix_Static - then - if File'Length > Ada_Spec_Suffix_Last - and then - File (File'Last - Ada_Spec_Suffix_Last + 1 .. - File'Last) = - Ada_Spec_Suffix - (1 .. Ada_Spec_Suffix_Last) - then - Source_Kind := Ada_Spec; - end if; - end if; - - if Source_Kind = Unknown - and then C_Suffix_Static - then - if File'Length > C_Suffix_Last - and then - File (File'Last - C_Suffix_Last + 1 - .. File'Last) = - C_Suffix (1 .. C_Suffix_Last) - then - Source_Kind := C; - end if; - end if; - - if Source_Kind = Unknown - and then Cxx_Suffix_Static - then - if File'Length > Cxx_Suffix_Last - and then - File (File'Last - Cxx_Suffix_Last + 1 - .. File'Last) = - Cxx_Suffix (1 .. Cxx_Suffix_Last) - then - Source_Kind := Cxx; - end if; - end if; - - -- If we still don't know the language, and all - -- suffixes are static, then it cannot any of the - -- processed languages. - - if Source_Kind = Unknown - and then Ada_Body_Suffix_Static - and then Ada_Spec_Suffix_Static - and then C_Suffix_Static - and then Cxx_Suffix_Static - then - Source_Kind := None; - end if; - - -- If it can be "C" or "C++", post-process - - if (Source_Kind = Unknown and - (May_Be_C_Sources or May_Be_Cxx_Sources)) - or else (May_Be_C_Sources and Source_Kind = C) - or else (May_Be_Cxx_Sources and Source_Kind = Cxx) - then - if not Post_Processing then - Post_Processing := True; - Put_Line - ("# post-processing of Compiler'Switches"); - end if; - - New_Line; - - -- Output a comment: - -- # for Switches (<file>) use ... - - Put ("# for Switches ("""); - Put (File); - Put (""") use ..."); - New_Line; - - if There_Are_Cases then - - -- Check that effectively there was Switches - -- specified for this file: the attribute - -- declaration may be in a case branch which was - -- not followed. - - Put ("ifneq ($("); - Put (Uname); - Put (".compiler.switches."); - Put (File); - Put ("),)"); - New_Line; - end if; - - if May_Be_C_Sources - and then - (Source_Kind = Unknown or else Source_Kind = C) - then - -- If it is definitely a C file, no need to test - - if Source_Kind = C then - Put (File (1 .. File'Last - C_Suffix_Last)); - Put (Get_Object_Suffix.all); - Put (": "); - Put (File); - New_Line; - - else - -- May be a C file: test to know - - Put ("ifeq ($(filter %$(C_EXT),"); - Put (File); - Put ("),"); - Put (File); - Put (")"); - New_Line; - - -- If it is, output a rule for the object - - Put ("$(subst $(C_EXT),$(OBJ_EXT),"); - Put (File); - Put ("): "); - Put (File); - New_Line; - end if; - - Put (ASCII.HT & "@echo $(CC) -c $("); - Put (Uname); - Put (".compiler.switches."); - Put (File); - Put (") $< -o $(OBJ_DIR)/$@"); - New_Line; - - -- If FAKE_COMPILE is defined, do not issue - -- the compile command. - - Put_Line ("ifndef FAKE_COMPILE"); - - Put (ASCII.HT & "@$(CC) -c $("); - Put (Uname); - Put (".compiler.switches."); - Put (File); - Put (") $(C_INCLUDES) $(DEP_CFLAGS) " & - "$< -o $(OBJ_DIR)/$@"); - New_Line; - - Put_Line (ASCII.HT & "@$(post-compile)"); - - Put_Line ("endif"); - - if Source_Kind = Unknown then - Put_Line ("endif"); - end if; - end if; - - -- Now, test if it is a C++ file - - if May_Be_Cxx_Sources - and then - (Source_Kind = Unknown - or else - Source_Kind = Cxx) - then - -- No need to test if definitely a C++ file - - if Source_Kind = Cxx then - Put (File (1 .. File'Last - Cxx_Suffix_Last)); - Put (Get_Object_Suffix.all); - Put (": "); - Put (File); - New_Line; - - else - -- May be a C++ file: test to know - - Put ("ifeq ($(filter %$(CXX_EXT),"); - Put (File); - Put ("),"); - Put (File); - Put (")"); - New_Line; - - -- If it is, output a rule for the object - - Put ("$(subst $(CXX_EXT),$(OBJ_EXT),"); - Put (File); - Put ("): $("); - Put (Uname); - Put (".absolute."); - Put (File); - Put (")"); - New_Line; - end if; - - Put (ASCII.HT & "@echo $(CXX) -c $("); - Put (Uname); - Put (".compiler.switches."); - Put (File); - Put (") $< -o $(OBJ_DIR)/$@"); - New_Line; - - -- If FAKE_COMPILE is defined, do not issue - -- the compile command - - Put_Line ("ifndef FAKE_COMPILE"); - - Put (ASCII.HT & "@$(CXX) -c $("); - Put (Uname); - Put (".compiler.switches."); - Put (File); - Put (") $(C_INCLUDES) $(DEP_CFLAGS) " & - "$< -o $(OBJ_DIR)/$@"); - New_Line; - - Put_Line (ASCII.HT & "@$(post-compile)"); - - Put_Line ("endif"); - - if Source_Kind = Unknown then - Put_Line ("endif"); - end if; - - end if; - - if There_Are_Cases then - Put_Line ("endif"); - end if; - - New_Line; - end if; - end; - end loop; - - -- Output a comment indication end of post-processing - -- of Switches, if we have done some post-processing - - if Post_Processing then - Put_Line - ("# end of post-processing of Compiler'Switches"); - - New_Line; - end if; - end if; - - -- Add source dirs of this project file to variable SRC_DIRS. - -- Put them in front, and remove duplicates. - - Put ("SRC_DIRS:=$("); - Put (Uname); - Put (".src_dirs) $(filter-out $("); - Put (Uname); - Put (".src_dirs),$(SRC_DIRS))"); - New_Line; - - -- Set OBJ_DIR to the object directory - - Put ("OBJ_DIR:=$("); - Put (Uname); - Put (".obj_dir)"); - New_Line; - - New_Line; - - if Source_Files_Declaration = True then - - -- It is guaranteed that Source_Files has been specified. - -- We then suppress the two lines that initialize - -- the variables src_files.specified and - -- src_list_file.specified. Nothing else to do. - - IO.Suppress (Src_Files_Init); - IO.Suppress (Src_List_File_Init); - - else - if Source_Files_Declaration = May_Be then - - -- Need to test if attribute Source_Files was specified - - Put_Line ("# get the source files, if necessary"); - Put_Line ("ifeq ($(src_files.specified),FALSE)"); - - else - Put_Line ("# get the source files"); - - -- We may suppress initialization of src_files.specified - - IO.Suppress (Src_Files_Init); - end if; - - if Source_List_File_Declaration /= May_Be then - IO.Suppress (Src_List_File_Init); - end if; - - case Source_List_File_Declaration is - - -- Source_List_File was specified - - when True => - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put (Uname); - Put (".src_files:= $(shell gprcmd cat " & - "$(src.list_file))"); - New_Line; - - -- Source_File_List was NOT specified - - when False => - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put (Uname); - Put (".src_files:= $(foreach name,$("); - Put (Uname); - Put (".src_dirs),$(notdir $(wildcard $(name)/*)))"); - New_Line; - - when May_Be => - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put_Line ("ifeq ($(src_list_file.specified),TRUE)"); - - -- Get the source files from the file - - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put (" "); - Put (Uname); - Put (".src_files:= $(shell gprcmd cat " & - "$(SRC__$LIST_FILE))"); - New_Line; - - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put_Line ("else"); - - -- Otherwise get source from the source directories - - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put (" "); - Put (Uname); - Put (".src_files:= $(foreach name,$("); - Put (Uname); - Put (".src_dirs),$(notdir $(wildcard $(name)/*)))"); - New_Line; - - if Source_Files_Declaration = May_Be then - Put (" "); - end if; - - Put_Line ("endif"); - end case; - - if Source_Files_Declaration = May_Be then - Put_Line ("endif"); - end if; - - New_Line; - end if; - - if not Languages_Static then - - -- If Languages include "c", get the C sources - - Put_Line - ("# get the C source files, if C is one of the languages"); - - Put_Line ("ifeq ($(filter c,$(LANGUAGES)),c)"); - - Put (" C_SRCS:=$(filter %$(C_EXT),$("); - Put (Uname); - Put (".src_files))"); - New_Line; - Put_Line (" C_SRCS_DEFINED:=True"); - - -- Otherwise set C_SRCS to empty - - Put_Line ("else"); - Put_Line (" C_SRCS="); - Put_Line ("endif"); - New_Line; - - -- If Languages include "C++", get the C++ sources - - Put_Line - ("# get the C++ source files, " & - "if C++ is one of the languages"); - - Put_Line ("ifeq ($(filter c++,$(LANGUAGES)),c++)"); - - Put (" CXX_SRCS:=$(filter %$(CXX_EXT),$("); - Put (Uname); - Put (".src_files))"); - New_Line; - Put_Line (" CXX_SRCS_DEFINED:=True"); - - -- Otherwise set CXX_SRCS to empty - - Put_Line ("else"); - Put_Line (" CXX_SRCS="); - Put_Line ("endif"); - New_Line; - - else - if Ada.Strings.Fixed.Index - (Languages (1 .. Languages_Last), " c ") /= 0 - then - Put_Line ("# get the C sources"); - Put ("C_SRCS:=$(filter %$(C_EXT),$("); - Put (Uname); - Put (".src_files))"); - New_Line; - Put_Line ("C_SRCS_DEFINED:=True"); - - else - Put_Line ("# no C sources"); - - Put_Line ("C_SRCS="); - end if; - - New_Line; - - if Ada.Strings.Fixed.Index - (Languages (1 .. Languages_Last), " c++ ") /= 0 - then - Put_Line ("# get the C++ sources"); - Put ("CXX_SRCS:=$(filter %$(CXX_EXT),$("); - Put (Uname); - Put (".src_files))"); - New_Line; - Put_Line ("CXX_SRCS_DEFINED:=True"); - - else - Put_Line ("# no C++ sources"); - - Put_Line ("CXX_SRCS="); - end if; - - New_Line; - end if; - - declare - C_Present : constant Boolean := - (not Languages_Static) or else - Ada.Strings.Fixed.Index - (Languages (1 .. Languages_Last), " c ") - /= 0; - - Cxx_Present : constant Boolean := - (not Languages_Static) or else - Ada.Strings.Fixed.Index - (Languages (1 .. Languages_Last), " c++ ") - /= 0; - - begin - if C_Present or Cxx_Present then - - -- If there are C or C++ sources, - -- add a library name to variable LIBS. - - Put ("# if there are "); - - if C_Present then - if Cxx_Present then - Put ("C or C++"); - - else - Put ("C"); - end if; - - else - Put ("C++"); - end if; - - Put (" sources, add the library"); - New_Line; - - Put ("ifneq ($(strip"); - - if C_Present then - Put (" $(C_SRCS)"); - end if; - - if Cxx_Present then - Put (" $(CXX_SRCS)"); - end if; - - Put ("),)"); - New_Line; - - Put (" LIBS:=$("); - Put (Uname); - Put (".obj_dir)/lib"); - Put (Lname); - Put ("$(AR_EXT) $(LIBS)"); - New_Line; - - Put_Line ("endif"); - - New_Line; - - end if; - end; - - -- If CFLAGS/CXXFLAGS have not been set, set them back to - -- their initial values. - - Put_Line ("ifeq ($(CFLAGS),)"); - Put_Line (" CFLAGS:=$(CFLAGS.saved)"); - Put_Line ("endif"); - New_Line; - - Put_Line ("ifeq ($(CXXFLAGS),)"); - Put_Line (" CXXFLAGS:=$(CXXFLAGS.saved)"); - Put_Line ("endif"); - New_Line; - - -- If this is the main Makefile, include Makefile.Generic - - Put ("ifeq ($("); - Put (Uname); - Put_Line (".root),True)"); - - -- Include Makefile.generic - - Put (" include $("); - Put (MAKE_ROOT); - Put (")"); - Put_Directory_Separator; - Put ("share"); - Put_Directory_Separator; - Put ("gnat"); - Put_Directory_Separator; - Put ("Makefile.generic"); - New_Line; - - -- If it is not the main Makefile, add the project to - -- variable DEPS_PROJECTS. - - Put_Line ("else"); - - Put (" DEPS_PROJECTS:=$(strip $(DEPS_PROJECTS) $("); - Put (Uname); - Put (".base_dir)/"); - Put (Lname); - Put (")"); - New_Line; - - Put_Line ("endif"); - New_Line; - - Put_Line ("endif"); - New_Line; - - -- Close the Makefile, so that another Makefile can be created - -- with the same File_Type variable. - - IO.Close; - end if; - end; - end if; - end Recursive_Process; - - ---------------------------------- - -- Reset_Suffixes_And_Languages -- - ---------------------------------- - - procedure Reset_Suffixes_And_Languages is - begin - -- Last = 0 indicates that this is the default, which is static, - -- of course. - - C_Suffix_Last := 0; - C_Suffix_Static := True; - Cxx_Suffix_Last := 0; - Cxx_Suffix_Static := True; - Ada_Body_Suffix_Last := 0; - Ada_Body_Suffix_Static := True; - Ada_Spec_Suffix_Last := 0; - Ada_Spec_Suffix_Static := True; - Languages_Last := 0; - Languages_Static := True; - end Reset_Suffixes_And_Languages; - - -------------------- - -- Source_Kind_Of -- - -------------------- - - function Source_Kind_Of (File_Name : Name_Id) return Source_Kind_Type is - Source_C_Suffix : constant String := - Suffix_Of (C_Suffix_Static, C_Suffix, C_Suffix_Last, ".c"); - - Source_Cxx_Suffix : constant String := - Suffix_Of (Cxx_Suffix_Static, Cxx_Suffix, Cxx_Suffix_Last, ".cc"); - - Body_Ada_Suffix : constant String := - Suffix_Of - (Ada_Body_Suffix_Static, - Ada_Body_Suffix, - Ada_Body_Suffix_Last, - ".adb"); - - Spec_Ada_Suffix : constant String := - Suffix_Of - (Ada_Spec_Suffix_Static, - Ada_Spec_Suffix, - Ada_Spec_Suffix_Last, - ".ads"); - - begin - -- Get the name of the file - - Get_Name_String (File_Name); - - -- If the C suffix is static, check if it is a C file - - if Source_C_Suffix /= "" - and then Name_Len > Source_C_Suffix'Length - and then Name_Buffer (Name_Len - Source_C_Suffix'Length + 1 - .. Name_Len) = Source_C_Suffix - then - return C; - - -- If the C++ suffix is static, check if it is a C++ file - - elsif Source_Cxx_Suffix /= "" - and then Name_Len > Source_Cxx_Suffix'Length - and then Name_Buffer (Name_Len - Source_Cxx_Suffix'Length + 1 - .. Name_Len) = Source_Cxx_Suffix - then - return Cxx; - - -- If the Ada body suffix is static, check if it is an Ada body - - elsif Body_Ada_Suffix /= "" - and then Name_Len > Body_Ada_Suffix'Length - and then Name_Buffer (Name_Len - Body_Ada_Suffix'Length + 1 - .. Name_Len) = Body_Ada_Suffix - then - return Ada_Body; - - -- If the Ada spec suffix is static, check if it is an Ada spec - - elsif Spec_Ada_Suffix /= "" - and then Name_Len > Spec_Ada_Suffix'Length - and then Name_Buffer (Name_Len - Spec_Ada_Suffix'Length + 1 - .. Name_Len) = Spec_Ada_Suffix - then - return Ada_Body; - - -- If the C or C++ suffix is not static, then return Unknown - - elsif Source_C_Suffix = "" or else Source_Cxx_Suffix = "" then - return Unknown; - - -- Otherwise return None - - else - return None; - end if; - end Source_Kind_Of; - - ------------------------ - -- Special_Put_U_Name -- - ------------------------ - - procedure Special_Put_U_Name (S : Name_Id) is - begin - Get_Name_String (S); - To_Upper (Name_Buffer (1 .. Name_Len)); - - -- If string is "C++", change it to "CXX" - - if Name_Buffer (1 .. Name_Len) = "C++" then - Put ("CXX"); - else - Put (Name_Buffer (1 .. Name_Len)); - end if; - end Special_Put_U_Name; - - --------------- - -- Suffix_Of -- - --------------- - - function Suffix_Of - (Static : Boolean; - Value : String_Access; - Last : Natural; - Default : String) return String - is - begin - if Static then - - -- If the suffix is static, Last = 0 indicates that it is the default - -- suffix: return the default. - - if Last = 0 then - return Default; - - -- Otherwise, return the current suffix - - else - return Value (1 .. Last); - end if; - - -- If the suffix is not static, return "" - - else - return ""; - end if; - end Suffix_Of; - - ----------- - -- Usage -- - ----------- - - procedure Usage is - begin - if not Usage_Displayed then - Usage_Displayed := True; - Display_Copyright; - Write_Line ("Usage: gpr2make switches project-file"); - Write_Eol; - Write_Line (" -h Display this usage"); - Write_Line (" -q Quiet output"); - Write_Line (" -v Verbose mode"); - Write_Line (" -R not Recursive: only one project file"); - Write_Eol; - end if; - end Usage; -end Bld; diff --git a/gcc/ada/bld.ads b/gcc/ada/bld.ads deleted file mode 100644 index 1389dc582c8..00000000000 --- a/gcc/ada/bld.ads +++ /dev/null @@ -1,38 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- B L D -- --- -- --- S p e c -- --- -- --- Copyright (C) 2002 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - --- The following package implements the facilities to build Makefiles --- for multi-language GNAT project files, so that building a complete --- multi-language system can be done easily, using GNU make. - -package Bld is - - procedure Gpr2make; - -- Parse a project file and all the other project files it depends on - -- into a project tree; then from the project tree, produce one Makefile - -- for each project file in the project tree. - -end Bld; diff --git a/gcc/ada/g-soccon-darwin.ads b/gcc/ada/g-soccon-darwin.ads new file mode 100644 index 00000000000..7010c8b4a2c --- /dev/null +++ b/gcc/ada/g-soccon-darwin.ads @@ -0,0 +1,163 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT COMPILER COMPONENTS -- +-- -- +-- G N A T . S O C K E T S . C O N S T A N T S -- +-- -- +-- S p e c -- +-- -- +-- Copyright (C) 2000-2004 Free Software Foundation, Inc. -- +-- -- +-- GNAT is free software; you can redistribute it and/or modify it under -- +-- terms of the GNU General Public License as published by the Free Soft- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- +-- for more details. You should have received a copy of the GNU General -- +-- Public License distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- +-- MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- This package provides target dependent definitions of constant for use +-- by the GNAT.Sockets package (g-socket.ads). This package should not be +-- directly with'ed by an applications program. + +-- This is the version for powerpc-apple-darwin7.4.1 +-- This file is generated automatically, do not modify it by hand! Instead, +-- make changes to gen-soccon.c and re-run it on each target. + +package GNAT.Sockets.Constants is + + -------------- + -- Families -- + -------------- + + AF_INET : constant := 2; -- IPv4 address family + AF_INET6 : constant := 30; -- IPv6 address family + + ----------- + -- Modes -- + ----------- + + SOCK_STREAM : constant := 1; -- Stream socket + SOCK_DGRAM : constant := 2; -- Datagram socket + + ------------------- + -- Socket errors -- + ------------------- + + EACCES : constant := 13; -- Permission denied + EADDRINUSE : constant := 48; -- Address already in use + EADDRNOTAVAIL : constant := 49; -- Cannot assign address + EAFNOSUPPORT : constant := 47; -- Addr family not supported + EALREADY : constant := 37; -- Operation in progress + EBADF : constant := 9; -- Bad file descriptor + ECONNABORTED : constant := 53; -- Connection aborted + ECONNREFUSED : constant := 61; -- Connection refused + ECONNRESET : constant := 54; -- Connection reset by peer + EDESTADDRREQ : constant := 39; -- Destination addr required + EFAULT : constant := 14; -- Bad address + EHOSTDOWN : constant := 64; -- Host is down + EHOSTUNREACH : constant := 65; -- No route to host + EINPROGRESS : constant := 36; -- Operation now in progress + EINTR : constant := 4; -- Interrupted system call + EINVAL : constant := 22; -- Invalid argument + EIO : constant := 5; -- Input output error + EISCONN : constant := 56; -- Socket already connected + ELOOP : constant := 62; -- Too many symbolic lynks + EMFILE : constant := 24; -- Too many open files + EMSGSIZE : constant := 40; -- Message too long + ENAMETOOLONG : constant := 63; -- Name too long + ENETDOWN : constant := 50; -- Network is down + ENETRESET : constant := 52; -- Disconn. on network reset + ENETUNREACH : constant := 51; -- Network is unreachable + ENOBUFS : constant := 55; -- No buffer space available + ENOPROTOOPT : constant := 42; -- Protocol not available + ENOTCONN : constant := 57; -- Socket not connected + ENOTSOCK : constant := 38; -- Operation on non socket + EOPNOTSUPP : constant := 45; -- Operation not supported + EPFNOSUPPORT : constant := 46; -- Unknown protocol family + EPROTONOSUPPORT : constant := 43; -- Unknown protocol + EPROTOTYPE : constant := 41; -- Unknown protocol type + ESHUTDOWN : constant := 58; -- Cannot send once shutdown + ESOCKTNOSUPPORT : constant := 44; -- Socket type not supported + ETIMEDOUT : constant := 60; -- Connection timed out + ETOOMANYREFS : constant := 59; -- Too many references + EWOULDBLOCK : constant := 35; -- Operation would block + + ----------------- + -- Host errors -- + ----------------- + + HOST_NOT_FOUND : constant := 1; -- Unknown host + TRY_AGAIN : constant := 2; -- Host name lookup failure + NO_DATA : constant := 4; -- No data record for name + NO_RECOVERY : constant := 3; -- Non recoverable errors + + ------------------- + -- Control flags -- + ------------------- + + FIONBIO : constant := -2147195266; -- Set/clear non-blocking io + FIONREAD : constant := 1074030207; -- How many bytes to read + + -------------------- + -- Shutdown modes -- + -------------------- + + SHUT_RD : constant := 0; -- No more recv + SHUT_WR : constant := 1; -- No more send + SHUT_RDWR : constant := 2; -- No more recv/send + + --------------------- + -- Protocol levels -- + --------------------- + + SOL_SOCKET : constant := 65535; -- Options for socket level + IPPROTO_IP : constant := 0; -- Dummy protocol for IP + IPPROTO_UDP : constant := 17; -- UDP + IPPROTO_TCP : constant := 6; -- TCP + + ------------------- + -- Request flags -- + ------------------- + + MSG_OOB : constant := 1; -- Process out-of-band data + MSG_PEEK : constant := 2; -- Peek at incoming data + MSG_EOR : constant := 8; -- Send end of record + MSG_WAITALL : constant := 64; -- Wait for full reception + MSG_NOSIGNAL : constant := -1; -- No SIGPIPE on send + MSG_Forced_Flags : constant := 0; + -- Flags set on all send(2) calls + + -------------------- + -- Socket options -- + -------------------- + + TCP_NODELAY : constant := 1; -- Do not coalesce packets + SO_SNDBUF : constant := 4097; -- Set/get send buffer size + SO_RCVBUF : constant := 4098; -- Set/get recv buffer size + SO_REUSEADDR : constant := 4; -- Bind reuse local address + SO_KEEPALIVE : constant := 8; -- Enable keep-alive msgs + SO_LINGER : constant := 128; -- Defer close to flush data + SO_ERROR : constant := 4103; -- Get/clear error status + SO_BROADCAST : constant := 32; -- Can send broadcast msgs + IP_ADD_MEMBERSHIP : constant := 12; -- Join a multicast group + IP_DROP_MEMBERSHIP : constant := 13; -- Leave a multicast group + IP_MULTICAST_TTL : constant := 10; -- Set/get multicast TTL + IP_MULTICAST_LOOP : constant := 11; -- Set/get mcast loopback + +end GNAT.Sockets.Constants; diff --git a/gcc/ada/gpr2make.adb b/gcc/ada/gpr2make.adb deleted file mode 100644 index eb93f345fc3..00000000000 --- a/gcc/ada/gpr2make.adb +++ /dev/null @@ -1,34 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- G P R 2 M A K E -- --- -- --- B o d y -- --- -- --- Copyright (C) 2002-2003 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - -with Bld; - -procedure Gpr2make is -begin - -- The real work is done in package Bld. - - Bld.Gpr2make; -end Gpr2make; diff --git a/gcc/ada/gpr2make.ads b/gcc/ada/gpr2make.ads deleted file mode 100644 index 0f05e9046d7..00000000000 --- a/gcc/ada/gpr2make.ads +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- G P R 2 M A K E -- --- -- --- S p e c -- --- -- --- Copyright (C) 2002 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - -procedure Gpr2make; --- The driver for the gpr2make tool. This utility is a Makefile generator --- to help building multi-language applications, using multi-language --- GNAT project files. diff --git a/gcc/ada/gprcmd.adb b/gcc/ada/gprcmd.adb deleted file mode 100644 index 143b62b1dea..00000000000 --- a/gcc/ada/gprcmd.adb +++ /dev/null @@ -1,612 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- GNAT COMPILER COMPONENTS -- --- -- --- G P R C M D -- --- -- --- B o d y -- --- -- --- Copyright (C) 2002-2004 Free Software Foundation, Inc. -- --- -- --- GNAT is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 2, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- --- for more details. You should have received a copy of the GNU General -- --- Public License distributed with GNAT; see file COPYING. If not, write -- --- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- --- MA 02111-1307, USA. -- --- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- --- -- ------------------------------------------------------------------------------- - --- A utility used by Makefile.generic to handle multi-language builds. --- gprcmd provides a set of commands so that the makefiles do not need --- to depend on unix utilities not available on all targets. - --- The list of commands recognized by gprcmd are: - --- pwd display current directory --- to_lower display next argument in lower case --- to_absolute convert pathnames to absolute directories when needed --- cat dump contents of a given file --- extend handle recursive directories ("/**" notation) --- deps post process dependency makefiles --- stamp copy file time stamp from file1 to file2 --- prefix get the prefix of the GNAT installation --- path convert a list of directories to a path list, inserting a --- path separator after each directory, including the last one --- ignore do nothing - -with Gnatvsn; -with Osint; use Osint; -with Namet; use Namet; - -with Ada.Characters.Handling; use Ada.Characters.Handling; -with Ada.Command_Line; use Ada.Command_Line; -with Ada.Text_IO; use Ada.Text_IO; -with GNAT.OS_Lib; use GNAT.OS_Lib; -with GNAT.Directory_Operations; use GNAT.Directory_Operations; -with GNAT.Regpat; use GNAT.Regpat; - -procedure Gprcmd is - - -- ??? comments are thin throughout this unit - - Gprdebug : constant String := To_Lower (Getenv ("GPRDEBUG").all); - Debug : constant Boolean := Gprdebug = "true"; - -- When Debug is True, gprcmd displays its arguments to Standard_Error. - -- This is to help to debug. - - procedure Cat (File : String); - -- Print the contents of file on standard output. - -- If the file cannot be read, exit the process with an error code. - - procedure Check_Args (Condition : Boolean); - -- If Condition is false, print command invoked, then the usage, - -- and exit the process. - - procedure Deps (Objext : String; File : String; GCC : Boolean); - -- Process $(CC) dependency file. If GCC is True, add a rule so that make - -- will not complain when a file is removed/added. If GCC is False, add a - -- rule to recompute the dependency file when needed - - procedure Extend (Dir : String); - -- If Dir ends with /**, Put all subdirs recursively on standard output, - -- otherwise put Dir. - - procedure Usage; - -- Display the command line options and exit the process. - - procedure Copy_Time_Stamp (From, To : String); - -- Copy file time stamp from file From to file To. - - procedure Display_Command; - -- Display the invoked command to Standard_Error - - --------- - -- Cat -- - --------- - - procedure Cat (File : String) is - FD : File_Descriptor; - Buffer : String_Access; - Length : Integer; - - begin - FD := Open_Read (File, Fmode => Binary); - - if FD = Invalid_FD then - OS_Exit (2); - end if; - - Length := Integer (File_Length (FD)); - Buffer := new String (1 .. Length); - Length := Read (FD, Buffer.all'Address, Length); - Close (FD); - Put (Buffer.all); - Free (Buffer); - end Cat; - - ---------------- - -- Check_Args -- - ---------------- - - procedure Check_Args (Condition : Boolean) is - begin - if not Condition then - Put_Line - (Standard_Error, - "bad call to gprcmd with" & Argument_Count'Img & " arguments."); - - for J in 0 .. Argument_Count loop - Put (Standard_Error, Argument (J) & " "); - end loop; - - New_Line (Standard_Error); - - Usage; - end if; - end Check_Args; - - --------------------- - -- Copy_Time_Stamp -- - --------------------- - - procedure Copy_Time_Stamp (From, To : String) is - function Copy_Attributes - (From, To : String; - Mode : Integer) return Integer; - pragma Import (C, Copy_Attributes, "__gnat_copy_attribs"); - -- Mode = 0 - copy only time stamps. - -- Mode = 1 - copy time stamps and read/write/execute attributes - - FD : File_Descriptor; - - begin - if not Is_Regular_File (From) then - return; - end if; - - FD := Create_File (To, Fmode => Binary); - - if FD = Invalid_FD then - OS_Exit (2); - end if; - - Close (FD); - - if Copy_Attributes (From & ASCII.NUL, To & ASCII.NUL, 0) /= 0 then - OS_Exit (2); - end if; - end Copy_Time_Stamp; - - ---------- - -- Deps -- - ---------- - - procedure Deps (Objext : String; File : String; GCC : Boolean) is - Colon : constant String := ':' & ASCII.LF; - NL : constant String := (1 => ASCII.LF); - Base : constant String := ' ' & Base_Name (File) & ": "; - FD : File_Descriptor; - Buffer : String_Access; - Length : Integer; - Obj_Regexp : constant Pattern_Matcher := - Compile ("^.*\" & Objext & ": "); - Matched : Match_Array (0 .. 0); - Start : Natural; - First : Natural; - Last : Natural; - - begin - FD := Open_Read_Write (File, Fmode => Binary); - - if FD = Invalid_FD then - return; - end if; - - Length := Integer (File_Length (FD)); - Buffer := new String (1 .. Length); - Length := Read (FD, Buffer.all'Address, Length); - - if GCC then - Lseek (FD, 0, Seek_End); - else - Close (FD); - FD := Create_File (File, Fmode => Binary); - end if; - - Start := Buffer'First; - - while Start <= Buffer'Last loop - - -- Parse Buffer line by line - - while Start < Buffer'Last - and then (Buffer (Start) = ASCII.CR - or else Buffer (Start) = ASCII.LF) - loop - Start := Start + 1; - end loop; - - Last := Start; - - while Last < Buffer'Last - and then Buffer (Last + 1) /= ASCII.CR - and then Buffer (Last + 1) /= ASCII.LF - loop - Last := Last + 1; - end loop; - - Match (Obj_Regexp, Buffer (Start .. Last), Matched); - - if GCC then - if Matched (0) = No_Match then - First := Start; - else - First := Matched (0).Last + 1; - end if; - - Length := Write (FD, Buffer (First)'Address, Last - First + 1); - - if Start = Last or else Buffer (Last) = '\' then - Length := Write (FD, NL (1)'Address, NL'Length); - else - Length := Write (FD, Colon (1)'Address, Colon'Length); - end if; - - else - if Matched (0) = No_Match then - First := Start; - else - Length := - Write (FD, Buffer (Start)'Address, - Matched (0).Last - Start - 1); - Length := Write (FD, Base (Base'First)'Address, Base'Length); - First := Matched (0).Last + 1; - end if; - - Length := Write (FD, Buffer (First)'Address, Last - First + 1); - Length := Write (FD, NL (1)'Address, NL'Length); - end if; - - Start := Last + 1; - end loop; - - Close (FD); - Free (Buffer); - end Deps; - - --------------------- - -- Display_Command -- - --------------------- - - procedure Display_Command is - begin - for J in 0 .. Argument_Count loop - Put (Standard_Error, Argument (J) & ' '); - end loop; - - New_Line (Standard_Error); - end Display_Command; - - ------------ - -- Extend -- - ------------ - - procedure Extend (Dir : String) is - - procedure Recursive_Extend (D : String); - -- Recursively display all subdirectories of D - - ---------------------- - -- Recursive_Extend -- - ---------------------- - - procedure Recursive_Extend (D : String) is - Iter : Dir_Type; - Buffer : String (1 .. 8192); - Last : Natural; - - begin - Open (Iter, D); - - loop - Read (Iter, Buffer, Last); - exit when Last = 0; - - if Buffer (1 .. Last) /= "." - and then Buffer (1 .. Last) /= ".." - then - declare - Abs_Dir : constant String := D & "/" & Buffer (1 .. Last); - begin - if Is_Directory (Abs_Dir) - and then not Is_Symbolic_Link (Abs_Dir) - then - Put (' ' & Abs_Dir); - Recursive_Extend (Abs_Dir); - end if; - end; - end if; - end loop; - - Close (Iter); - - exception - when Directory_Error => - null; - end Recursive_Extend; - - -- Start of processing for Extend - - begin - if Dir'Length < 3 - or else (Dir (Dir'Last - 2) /= '/' - and then Dir (Dir'Last - 2) /= Directory_Separator) - or else Dir (Dir'Last - 1 .. Dir'Last) /= "**" - then - Put (Dir); - return; - end if; - - declare - D : constant String := Dir (Dir'First .. Dir'Last - 3); - begin - Put (D); - Recursive_Extend (D); - end; - end Extend; - - ----------- - -- Usage -- - ----------- - - procedure Usage is - begin - Put_Line (Standard_Error, "usage: gprcmd cmd [arguments]"); - Put_Line (Standard_Error, "where cmd is one of the following commands:"); - Put_Line (Standard_Error, " pwd " & - "display current directory"); - Put_Line (Standard_Error, " to_lower " & - "display next argument in lower case"); - Put_Line (Standard_Error, " to_absolute " & - "convert pathnames to absolute " & - "directories when needed"); - Put_Line (Standard_Error, " cat " & - "dump contents of a given file"); - Put_Line (Standard_Error, " extend " & - "handle recursive directories " & - "(""/**"" notation)"); - Put_Line (Standard_Error, " deps " & - "post process dependency makefiles"); - Put_Line (Standard_Error, " stamp " & - "copy file time stamp from file1 to file2"); - Put_Line (Standard_Error, " prefix " & - "get the prefix of the GNAT installation"); - Put_Line (Standard_Error, " path_sep " & - "returns the path separator"); - Put_Line (Standard_Error, " linkopts " & - "process attribute Linker'Linker_Options"); - Put_Line (Standard_Error, " ignore " & - "do nothing"); - OS_Exit (1); - end Usage; - --- Start of processing for Gprcmd - -begin - if Debug then - Display_Command; - end if; - - Check_Args (Argument_Count > 0); - - declare - Cmd : constant String := Argument (1); - - begin - if Cmd = "-v" then - - -- Output on standard error, because only returned values should - -- go to standard output. - - Put (Standard_Error, "GPRCMD "); - Put_Line (Standard_Error, Gnatvsn.Gnat_Version_String); - Put_Line (Standard_Error, - "Copyright 2002-2004, Free Software Fundation, Inc."); - Usage; - - elsif Cmd = "pwd" then - declare - CD : constant String := Get_Current_Dir; - begin - Put (Format_Pathname (CD (CD'First .. CD'Last - 1), UNIX)); - end; - - elsif Cmd = "cat" then - Check_Args (Argument_Count = 2); - Cat (Argument (2)); - - elsif Cmd = "to_lower" then - Check_Args (Argument_Count >= 2); - - for J in 2 .. Argument_Count loop - Put (To_Lower (Argument (J))); - - if J < Argument_Count then - Put (' '); - end if; - end loop; - - elsif Cmd = "to_absolute" then - Check_Args (Argument_Count > 2); - - declare - Dir : constant String := Argument (2); - - begin - for J in 3 .. Argument_Count loop - if Is_Absolute_Path (Argument (J)) then - Put (Format_Pathname (Argument (J), UNIX)); - else - Put (Format_Pathname - (Normalize_Pathname - (Format_Pathname (Argument (J)), - Format_Pathname (Dir)), - UNIX)); - end if; - - if J < Argument_Count then - Put (' '); - end if; - end loop; - end; - - elsif Cmd = "extend" then - Check_Args (Argument_Count >= 2); - - declare - Dir : constant String := Argument (2); - - begin - -- Loop to remove quotes that may have been added around arguments - - for J in 3 .. Argument_Count loop - declare - Arg : constant String := Argument (J); - First : Natural := Arg'First; - Last : Natural := Arg'Last; - - begin - if Arg (First) = '"' and then Arg (Last) = '"' then - First := First + 1; - Last := Last - 1; - end if; - - if Is_Absolute_Path (Arg (First .. Last)) then - Extend (Format_Pathname (Arg (First .. Last), UNIX)); - else - Extend - (Format_Pathname - (Normalize_Pathname - (Format_Pathname (Arg (First .. Last)), - Format_Pathname (Dir)), - UNIX)); - end if; - - if J < Argument_Count then - Put (' '); - end if; - end; - end loop; - end; - - elsif Cmd = "deps" then - Check_Args (Argument_Count in 3 .. 4); - Deps (Argument (2), Argument (3), GCC => Argument_Count = 4); - - elsif Cmd = "stamp" then - Check_Args (Argument_Count = 3); - Copy_Time_Stamp (Argument (2), Argument (3)); - - elsif Cmd = "prefix" then - - -- Find the GNAT prefix. gprcmd is found in <prefix>/bin. - -- So we find the full path of gprcmd, verify that it is in a - -- subdirectory "bin", and return the <prefix> if it is the case. - -- Otherwise, nothing is returned. - - Find_Program_Name; - - declare - Path : constant String_Access := - Locate_Exec_On_Path (Name_Buffer (1 .. Name_Len)); - Index : Natural; - - begin - if Path /= null then - Index := Path'Last; - - while Index >= Path'First + 4 loop - exit when Path (Index) = Directory_Separator; - Index := Index - 1; - end loop; - - if Index > Path'First + 5 - and then Path (Index - 3 .. Index - 1) = "bin" - and then Path (Index - 4) = Directory_Separator - then - -- We have found the <prefix>, return it - - Put (Path (Path'First .. Index - 5)); - end if; - end if; - end; - - -- For "path" just add path separator after each directory argument - - elsif Cmd = "path_sep" then - Put (Path_Separator); - - -- Check the linker options for relative paths. Insert the project - -- base dir before relative paths. - - elsif Cmd = "linkopts" then - Check_Args (Argument_Count >= 2); - - -- First argument is the base directory of the project file - - declare - Base_Dir : constant String := Argument (2) & '/'; - begin - -- process the remainder of the arguments - - for J in 3 .. Argument_Count loop - declare - Arg : constant String := Argument (J); - begin - -- If it is a switch other than a -L switch, just send back - -- the argument. - - if Arg (Arg'First) = '-' and then - (Arg'Length <= 2 or else Arg (Arg'First + 1) /= 'L') - then - Put (Arg); - - else - -- If it is a file, check if its path is relative, and - -- if it is relative, add <project base dir>/ in front. - -- Otherwise just send back the argument. - - if Arg'Length <= 2 - or else Arg (Arg'First .. Arg'First + 1) /= "-L" - then - if not Is_Absolute_Path (Arg) then - Put (Base_Dir); - end if; - - Put (Arg); - - -- For -L switches, check if the path is relative and - -- proceed similarly. - - else - Put ("-L"); - - if - not Is_Absolute_Path (Arg (Arg'First + 2 .. Arg'Last)) - then - Put (Base_Dir); - end if; - - Put (Arg (Arg'First + 2 .. Arg'Last)); - end if; - end if; - end; - - -- Insert a space between each processed argument - - if J /= Argument_Count then - Put (' '); - end if; - end loop; - end; - - -- For "ignore" do nothing - - elsif Cmd = "ignore" then - null; - - -- Unknown command - - else - Check_Args (False); - end if; - end; -end Gprcmd; |