Skip to content
Snippets Groups Projects
Make-lang.in 9.01 KiB
Newer Older
# Top level -*- makefile -*- fragment for Cobol
#   Copyright (C) 2016 Free Software Foundation, Inc.

# This file is part of GCC.

# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.

# GCC is distributed in the hope that it will be useful,
# but WITHOUT 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
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# This file provides the language dependent support in the main Makefile.
# Each language makefile fragment must provide the following targets:
#
# foo.all.cross, foo.start.encap, foo.rest.encap,
# foo.install-common, foo.install-man, foo.install-info, foo.install-pdf,
# foo.install-html, foo.info, foo.dvi, foo.pdf, foo.html, foo.uninstall,
# foo.mostlyclean, foo.clean, foo.distclean,
# foo.maintainer-clean, foo.stage1, foo.stage2, foo.stage3, foo.stage4
#
# where `foo' is the name of the language.
#
# It should also provide rules for:
#
# - making any compiler driver (eg: g++)
# - the compiler proper (eg: cc1plus)
# - define the names for selecting the language in LANGUAGES.

ifeq ("$(USER)","bob")
	MAX_ERRORS := -fmax-errors=1
endif

gcobol_INSTALL_NAME := $(shell echo gcobol|sed '$(program_transform_name)')
gcobol_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcobol|sed '$(program_transform_name)')

cobol: cobol1$(exeext)

.PHONY: cobol

BINCLUDE ?= ./gcc
LIB_INCLUDE ?= $(srcdir)/../libgcobol

#
# At this point, as of 2022-10-21, CPPFLAGS is an empty string and can be
# altered.  CFLAGS and CXXFLAGS are being established upstream, and thus
# cannot, at this point, be changed.
#

CPPFLAGS =					\
 -std=c++17 					\
 $(MAX_ERRORS)					\
 -Iinclude					\
 -I$(BINCLUDE)					\
 -I$(LIB_INCLUDE)					\
 -Wno-cpp					\
 -Wno-missing-field-initializers		\
 -DEXEC_LIB=\"$(DESTDIR)$(libdir)\"
 $(END)

YACC = bison
YFLAGS = -Werror -Wmidrule-values -Wno-yacc \
	--debug --verbose

LEX = flex
LFLAGS = -d -Ca

#
# These are the object files for creating the cobol1.exe compiler:
#

cobol_one_OBJS =    \
 cobol/cdf.o        \
 cobol/cdf-copy.o   \
 cobol/cobol1.o     \
 cobol/convert.o    \
 cobol/except.o     \
 cobol/genutil.o    \
 cobol/genapi.o     \
 cobol/genmath.o    \
 cobol/gengen.o     \
 cobol/lexio.o      \
 cobol/parse.o      \
 cobol/scan.o       \
 cobol/structs.o    \
 cobol/symbols.o    \
 cobol/symfind.o    \
 cobol/util.o       \
 cobol/charmaps-copy.o   \
 cobol/valconv-copy.o    \
cobol_OBJS_FROM_LIBGCOBOL = \
 cobol/charmaps-copy.o           \
 cobol/valconv-copy.o            \
 $(END)

#
# There is source code in libgcobol/charmaps.cc and libgcobol/valconv.cc
# that needs to be compiled into both libgcobol and cobol1.  The following
# recipes make copies of those two source code files from libgcobol to here in
# the gcc/cobol build tree.  This avoids the nightmare of one file appearing in
# more than one place.
#
../../gcc/cobol/charmaps-copy.cc: ../libgcobol/charmaps.cc
	echo "// DO NOT EDIT THIS FILE.  It was copied from the libgcobol directory." > $@
	tail -n +2 $< >> $@
../../gcc/cobol/valconv-copy.cc: ../libgcobol/valconv.cc
	echo "// DO NOT EDIT THIS FILE.  It was copied from the libgcobol directory." > $@
	tail -n +2 $< >> $@
#
# These are the object files for creating the gcobol.exe "driver"
#
GCOBOL_D_OBJS = $(GCC_OBJS) cobol/gcobolspec.o

#
# These get combined to provide a dependency relationship that ensures all
# of the "generated-files" are generated before we need them.  See the root
# Makefile.in code that looks like this:
#       ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS))
#

cobol_OBJS = \
   $(cobol_OBJS_FROM_LIBGCOBOL) \
   $(cobol_one_OBJS) \
   cobol/gcobolspec.o \
   $(END)

#
# Frankly, I can't figure out what this does:
#

CFLAGS-cobol/gcobolspec.o += $(DRIVER_DEFINES)

#
# This controls the build of the gcobol.exe "driver"
#

gcobol$(exeext): \
	 $(GCOBOL_D_OBJS) \
	 $(EXTRA_GCC_OBJS) \
     $(cobol_OBJS_FROM_LIBGCOBOL) \
     libcommon-target.a \
     $(LIBDEPS)
	+$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@		\
	 $(GCOBOL_D_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a	\
	 $(EXTRA_GCC_LIBS) $(LIBS)

#
# These control the build of the cobol1.exe source-to-GENERIC converter
#

# First, files needed for parsing:

# To establish prerequisites for parse.o, cdf.o, and scan.o,
#   1. capture the "make -n" output 
#   2. eliminate compiler options, leaving only preprocessor options (-D and -I)
#   3. add -E -MM
#
# The below lists of include files for the the generated files is
# postprocessed: the files are one per line, used "realpath
# --relative-to=$PWD" to rationalize them, and sorted.  We include
# parse.c in the list for scan.o because that's the one make(1) knows about.
cobol/parse.c: cobol/parse.y
	$(YACC) -o $@ $(YFLAGS)				\
		--defines=cobol/parse.h			\
		--report-file=cobol/parser.out $<

cobol/cdf.c: cobol/cdf.y
	$(YACC) -o $@ $(YFLAGS)						\
		--defines=cobol/cdf.h --report-file=cobol/cdf.out $<

# See "Trailing context is getting confused with trailing optional patterns"
# in Flex manual. We suppress those messages, as a convenience.
FLEX_WARNING = warning, dangerous trailing context

cobol/scan.c: cobol/scan.l
	$(LEX) -o$@ $(LFLAGS) $< >$@~ 2>&1
	awk  '! /$(FLEX_WARNING)/ {print > "/dev/stderr"; nerr++}	\
	     END {print "$(LEX):", NR, "messages" > "/dev/stderr";	\
		  exit nerr}' $@~
cobol/cdf.o: cobol/cdf.c			\
	$(srcdir)/cobol/cbldiag.h		\
	$(srcdir)/cobol/cdfval.h		\
	$(srcdir)/cobol/copybook.h		\
	$(srcdir)/cobol/symbols.h		\
	$(srcdir)/cobol/util.h			\
	$(srcdir)/../libgcobol/common-defs.h	\
	$(srcdir)/../libgcobol/ec.h
cobol/parse.o: cobol/parse.c			\
	$(srcdir)/cobol/cbldiag.h		\
	$(srcdir)/cobol/cdfval.h		\
	$(srcdir)/cobol/cobol-system.h		\
	$(srcdir)/cobol/exceptg.h		\
	$(srcdir)/cobol/genapi.h		\
	$(srcdir)/cobol/inspect.h		\
	$(srcdir)/cobol/parse_ante.h		\
	$(srcdir)/cobol/parse_util.h		\
	$(srcdir)/cobol/symbols.h		\
	$(srcdir)/cobol/util.h			\
	$(srcdir)/hwint.h			\
	$(srcdir)/system.h			\
	$(srcdir)/../include/ansidecl.h		\
	$(srcdir)/../include/filenames.h	\
	$(srcdir)/../include/hashtab.h		\
	$(srcdir)/../include/libiberty.h	\
	$(srcdir)/../include/safe-ctype.h	\
	$(srcdir)/../libgcobol/common-defs.h	\
	$(srcdir)/../libgcobol/ec.h		\
	$(srcdir)/../libgcobol/exceptl.h	\
	$(srcdir)/../libgcobol/io.h		\
	config.h 				\
	cobol/parse.h
cobol/scan.o: cobol/scan.c			\
	$(srcdir)/cobol/cbldiag.h		\
	$(srcdir)/cobol/cdfval.h		\
	$(srcdir)/cobol/cobol-system.h		\
	$(srcdir)/cobol/copybook.h		\
	$(srcdir)/cobol/dts.h			\
	$(srcdir)/cobol/inspect.h		\
	$(srcdir)/cobol/lexio.h			\
	$(srcdir)/cobol/scan_ante.h		\
	$(srcdir)/cobol/scan_post.h		\
	$(srcdir)/cobol/symbols.h		\
	$(srcdir)/cobol/util.h			\
	$(srcdir)/hwint.h			\
	$(srcdir)/system.h			\
	$(srcdir)/../include/ansidecl.h		\
	$(srcdir)/../include/filenames.h	\
	$(srcdir)/../include/hashtab.h		\
	$(srcdir)/../include/libiberty.h	\
	$(srcdir)/../include/safe-ctype.h	\
	$(srcdir)/../libgcobol/common-defs.h	\
	$(srcdir)/../libgcobol/ec.h		\
	$(srcdir)/../libgcobol/exceptl.h	\
	$(srcdir)/../libgcobol/io.h		\
	config.h 				\
	cobol/cdf.c				\
	cobol/parse.c
cobol1$(exeext): $(cobol_one_OBJS) $(cobol_OBJS_FROM_LIBGCOBOL) \
	$(BACKEND) $(LIBDEPS) attribs.o
	+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) attribs.o -o $@	\
	      $(cobol_one_OBJS) $(BACKEND) $(LIBS) $(BACKENDLIBS)

# FIXME
cobol.all.cross:

cobol.start.encap: gcobol$(exeext)

cobol.rest.encap:

cobol.install-common: installdirs
James K. Lowden's avatar
James K. Lowden committed
	$(INSTALL_PROGRAM) -v gcobol$(exeext)				\
		$(DESTDIR)$(bindir)/$(gcobol_INSTALL_NAME)$(exeext)
James K. Lowden's avatar
James K. Lowden committed
	$(INSTALL_PROGRAM) -v $(srcdir)/cobol/gcobc $(DESTDIR)$(bindir)/
	$(INSTALL_DATA) -v $(srcdir)/cobol/udf/* $(udfdir)/
James K. Lowden's avatar
James K. Lowden committed
	$(INSTALL_DATA) -v $(srcdir)/cobol/gcobol.1 $(DESTDIR)$(man1dir)/
	$(INSTALL_DATA) -v $(srcdir)/cobol/gcobol.3 $(DESTDIR)$(man3dir)/

cobol.install-info:

cobol.install-pdf:

cobol.install-plugin:
James K. Lowden's avatar
James K. Lowden committed

cobol.install-html:

cobol.info:

cobol.dvi:

cobol.pdf:

cobol.html:

cobol.uninstall:
	-rm -f gcobol$(exeext) cobol1$(exeext)
	-rm -f $(cobol_OBJS)

cobol.man:

cobol.mostlyclean:

cobol.clean:
	rm -fr cobol1 cobol/*              \
	../*/libgcobol/*                   \
	../../gcc/cobol/charmaps-copy.cc   \
	../../gcc/cobol/valconv-copy.cc    \

cobol.distclean:

cobol.maintainer-clean:

# The main makefile has already created stage?/cobol.
cobol.stage1: stage1-start
	-mv cobol/*$(objext) stage1/cobol
cobol.stage2: stage2-start
	-mv cobol/*$(objext) stage2/cobol
cobol.stage3: stage3-start
	-mv cobol/*$(objext) stage3/cobol
cobol.stage4: stage4-start
	-mv cobol/*$(objext) stage4/cobol
cobol.stageprofile: stageprofile-start
	-mv cobol/*$(objext) stageprofile/cobol
cobol.stagefeedback: stagefeedback-start
	-mv cobol/*$(objext) stagefeedback/cobol

selftest-cobol: