# Top level -*- makefile -*- fragment for Cobol
# Copyright (C) 2021-2025 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
# .
# 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.
GCOBOL_INSTALL_NAME := $(shell echo gcobol|sed '$(program_transform_name)')
GCOBOL_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcobol|sed '$(program_transform_name)')
GCOBC_INSTALL_NAME := $(shell echo gcobc|sed '$(program_transform_name)')
GCOBC_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcobc|sed '$(program_transform_name)')
cobol: cobol1$(exeext)
cobol.serial = cobol1$(exeext)
.PHONY: cobol
LIB_SOURCE ?= $(srcdir)/../libgcobol
YFLAGS = -Werror -Wmidrule-values -Wno-yacc \
--debug --verbose
LFLAGS = -d -Ca
#
# These are the object files for creating the cobol1 compiler:
#
cobol1_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.o \
cobol/valconv.o \
$(END)
#
# There is source code in libgcobol/charmaps.cc and
# libgcobol/valconv.cc that needs to be compiled into both libgcobol
# and cobol1. We copy those two source code files from libgcobol to
# build/gcc/cobol to avoid the nightmare of one file appearing in more
# than one place. For simplicity, we make those compilations dependent
# on all of the libgcobol/*.h files, which might lead to the occasional
# unnecessary compilation. The impact of that is negligible.
#
# Various #includes in the files copied from gcc/libgcobol need to be modified
# so that the .h files can be found.
cobol/charmaps.cc: $(LIB_SOURCE)/charmaps.cc
cp $^ $@
sed -i "s|\"ec[.]h\"|\"$(LIB_SOURCE)/ec.h\"|g" $@
sed -i "s|\"common-defs[.]h\"|\"$(LIB_SOURCE)/common-defs.h\"|g" $@
sed -i "s|\"io[.]h\"|\"$(LIB_SOURCE)/io.h\"|g" $@
sed -i "s|\"gcobolio[.]h\"|\"$(LIB_SOURCE)/gcobolio.h\"|g" $@
sed -i "s|\"libgcobol[.]h\"|\"$(LIB_SOURCE)/libgcobol.h\"|g" $@
sed -i "s|\"gfileio[.]h\"|\"$(LIB_SOURCE)/gfileio.h\"|g" $@
sed -i "s|\"charmaps[.]h\"|\"$(LIB_SOURCE)/charmaps.h\"|g" $@
sed -i "s|\"valconv[.]h\"|\"$(LIB_SOURCE)/valconv.h\"|g" $@
sed -i "s|\"exceptl[.]h\"|\"$(LIB_SOURCE)/exceptl.h\"|g" $@
cobol/valconv.cc: $(LIB_SOURCE)/valconv.cc
cp $^ $@
sed -i "s|\"ec[.]h\"|\"$(LIB_SOURCE)/ec.h\"|g" $@
sed -i "s|\"common-defs[.]h\"|\"$(LIB_SOURCE)/common-defs.h\"|g" $@
sed -i "s|\"io[.]h\"|\"$(LIB_SOURCE)/io.h\"|g" $@
sed -i "s|\"gcobolio[.]h\"|\"$(LIB_SOURCE)/gcobolio.h\"|g" $@
sed -i "s|\"libgcobol[.]h\"|\"$(LIB_SOURCE)/libgcobol.h\"|g" $@
sed -i "s|\"gfileio[.]h\"|\"$(LIB_SOURCE)/gfileio.h\"|g" $@
sed -i "s|\"charmaps[.]h\"|\"$(LIB_SOURCE)/charmaps.h\"|g" $@
sed -i "s|\"valconv[.]h\"|\"$(LIB_SOURCE)/valconv.h\"|g" $@
sed -i "s|\"exceptl[.]h\"|\"$(LIB_SOURCE)/exceptl.h\"|g" $@
LIB_SOURCE_H=$(wildcard $(LIB_SOURCE)/*.h)
cobol/charmaps.o: cobol/charmaps.cc $(LIB_SOURCE_H)
cobol/valconv.o: cobol/valconv.cc $(LIB_SOURCE_H)
#
# These are the object files for creating the gcobol "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 = \
$(cobol1_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 "driver"
#
gcobol$(exeext): \
$(GCOBOL_D_OBJS) \
$(EXTRA_GCC_OBJS) \
libcommon-target.a \
$(LIBDEPS)
+$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
$(GCOBOL_D_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \
$(EXTRA_GCC_LIBS) $(LIBS)
# Create a version of the gcobol driver which calls the cross-compiler.
gcobol-cross$(exeext): gcobol$(exeext)
-rm -f gcobol-cross$(exeext)
cp gcobol$(exeext) gcobol-cross$(exeext)
#
# These control the build of the cobol1 source-to-GENERIC converter
#
# First, files needed for parsing:
cobol/parse.cc: cobol/parse.y
$(BISON) -o $@ $(YFLAGS) \
--defines=cobol/parse.h \
--report-file=cobol/parser.out $<
cobol/cdf.cc: cobol/cdf.y
$(BISON) -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.cc: cobol/scan.l
$(FLEX) -o$@ $(LFLAGS) $< >$@~ 2>&1
awk '! /$(FLEX_WARNING)/ {print > "/dev/stderr"; nerr++} \
END {print "$(FLEX):", NR, "messages" > "/dev/stderr"; \
exit nerr}' $@~
@rm $@~
# 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.cc in the list for scan.o because that's the one make(1) knows about.
cobol/cdf.o: cobol/cdf.cc \
$(srcdir)/cobol/cbldiag.h \
$(srcdir)/cobol/cdfval.h \
$(srcdir)/cobol/copybook.h \
$(srcdir)/cobol/exceptg.h \
$(srcdir)/cobol/symbols.h \
$(srcdir)/cobol/util.h \
$(srcdir)/../libgcobol/common-defs.h \
$(srcdir)/../libgcobol/ec.h \
$(srcdir)/../libgcobol/exceptl.h
cobol/parse.o: cobol/parse.cc \
$(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 \
auto-host.h \
config.h
cobol/scan.o: cobol/scan.cc \
$(srcdir)/cobol/cbldiag.h \
$(srcdir)/cobol/cdfval.h \
$(srcdir)/cobol/cobol-system.h \
$(srcdir)/cobol/copybook.h \
$(srcdir)/cobol/dts.h \
$(srcdir)/cobol/exceptg.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 \
auto-host.h \
config.h \
cobol/cdf.cc \
cobol/parse.cc
#
# The src targets are executed if
# ‘--enable-generated-files-in-srcdir’ was specified as a configure
# option.
#
# srcextra copies generated dependencies into the source
# directory. This is used for files such as Flex/Bison output: files
# that are not version-controlled but should be included in any
# release tarballs.
#
# Although versioned snapshots require Flex to be installed, they do
# not require Bison. Release tarballs always include Flex/Bison
# output, and do not require those tools to be installed.
#
cobol.srcextra: cobol/parse.cc cobol/cdf.cc cobol/scan.cc
ln -f $^ cobol/parse.h cobol/cdf.h $(srcdir)/cobol/
# And the cobol1 front end
cobol1$(exeext): $(cobol1_OBJS) $(BACKEND) $(LIBDEPS) attribs.o $(cobol.prev)
@$(call LINK_PROGRESS,$(INDEX.cobol),start)
+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) attribs.o -o $@ \
$(cobol1_OBJS) $(BACKEND) $(LIBS) $(BACKENDLIBS)
@$(call LINK_PROGRESS,$(INDEX.cobol),end)
cobol.all.cross: gcobol-cross$(exeext)
cobol.start.encap: gcobol$(exeext)
cobol.rest.encap:
cobol.install-common: installdirs
-rm -f $(DESTDIR)$(bindir)/$(GCOBOL_INSTALL_NAME)$(exeext)
-rm -f $(DESTDIR)$(bindir)/$(GCOBC_INSTALL_NAME)$(exeext)
$(INSTALL_PROGRAM) gcobol$(exeext) $(DESTDIR)$(bindir)/$(GCOBOL_INSTALL_NAME)$(exeext)
$(INSTALL_PROGRAM) cobol1$(exeext) $(DESTDIR)$(libexecsubdir)/
$(INSTALL) -m 755 $(srcdir)/cobol/gcobc $(DESTDIR)$(bindir)/$(GCOBC_INSTALL_NAME)$(exeext)
-if test -f cobol1$(exeext); then \
if test -f gcobol-cross$(exeext); then \
:; \
else \
rm -f $(DESTDIR)$(bindir)/$(GCOBOL_TARGET_INSTALL_NAME)$(exeext); \
rm -f $(DESTDIR)$(bindir)/$(GCOBC_TARGET_INSTALL_NAME)$(exeext); \
( cd $(DESTDIR)$(bindir) && \
$(LN) $(GCOBOL_INSTALL_NAME)$(exeext) $(GCOBOL_TARGET_INSTALL_NAME)$(exeext) ); \
$(LN) $(GCOBC_INSTALL_NAME)$(exeext) $(GCOBC_TARGET_INSTALL_NAME)$(exeext) ); \
fi; \
fi
mkdir -p $(DESTDIR)$(datadir)/gcobol/udf
$(INSTALL_DATA) $(srcdir)/cobol/udf/* $(DESTDIR)$(datadir)/gcobol/udf/
cobol.install-man: installdirs
$(INSTALL_DATA) $(srcdir)/cobol/gcobol.1 $(DESTDIR)$(man1dir)/$(GCOBOL_INSTALL_NAME)$(man1ext)
$(INSTALL_DATA) $(srcdir)/cobol/gcobol.3 $(DESTDIR)$(man3dir)/
cobol.install-info:
cobol.install-pdf: installdirs gcobol.pdf gcobol-io.pdf
mkdir -p $(DESTDIR)$(datadir)/gcobol/pdf
$(INSTALL_DATA) gcobol.pdf gcobol-io.pdf $(DESTDIR)$(pdfdir)/
cobol.install-plugin:
cobol.install-html: installdirs gcobol.html gcobol-io.html
$(INSTALL_DATA) gcobol.html gcobol-io.html $(DESTDIR)$(htmldir)/
cobol.info:
cobol.srcinfo:
cobol.dvi:
cobol.srcdvi:
cobol.pdf: gcobol.pdf gcobol-io.pdf
cobol.srcpdf: gcobol.pdf gcobol-io.pdf
ln $^ $(srcdir)/cobol/
gcobol.pdf: $(srcdir)/cobol/gcobol.1
groff -mdoc -T pdf $^ > $@~
@mv $@~ $@
gcobol-io.pdf: $(srcdir)/cobol/gcobol.3
groff -mdoc -T pdf $^ > $@~
@mv $@~ $@
cobol.html: gcobol.html gcobol-io.html
cobol.srchtml: gcobol.html gcobol-io.html
ln $^ $(srcdir)/cobol/
gcobol.html: $(srcdir)/cobol/gcobol.1
mandoc -T html $^ > $@~
@mv $@~ $@
gcobol-io.html: $(srcdir)/cobol/gcobol.3
mandoc -T html $^ > $@~
@mv $@~ $@
# "make uninstall" is not expected to work. It's not clear how to name
# the installed location of the cobol1 compiler.
cobol.uninstall:
rm -rf $(DESTDIR)$(bindir)/$(GCOBOL_INSTALL_NAME)$(exeext) \
$(DESTDIR)$(bindir)/$(GCOBC_INSTALL_NAME) \
$(DESTDIR)$(datadir)/gcobol/ \
$(DESTDIR)$(man1dir)/$(GCOBOL_INSTALL_NAME).1 \
$(DESTDIR)$(man3dir)/gcobol.3
cobol.man:
cobol.srcman:
cobol.mostlyclean:
cobol.clean:
rm -fr gcobol cobol1 cobol/* \
../*/libgcobol/*
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:
lang_checks += check-cobol