# Make-lang.in -- Top level -*- makefile -*- fragment for the D frontend. # Copyright (C) 2006-2023 Free Software Foundation, Inc. # 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. # Installation name. D_INSTALL_NAME = $(shell echo gdc|sed '$(program_transform_name)') D_TARGET_INSTALL_NAME = $(target_noncanonical)-$(shell echo gdc|sed '$(program_transform_name)') # Name of phobos library D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos\" # The name for selecting d in LANGUAGES. d: d21$(exeext) d.serial = d21$(exeext) # Tell GNU make to ignore these if they exist. .PHONY: d # Create the compiler driver for D. CFLAGS-d/d-spec.o += $(DRIVER_DEFINES) $(D_LIBPHOBOS) GDC_OBJS = $(GCC_OBJS) d/d-spec.o gdc$(exeext): $(GDC_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a $(LIBDEPS) +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(GDC_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \ $(EXTRA_GCC_LIBS) $(LIBS) # Create a version of the gdc driver which calls the cross-compiler. gdc-cross$(exeext): gdc$(exeext) -rm -f gdc-cross$(exeext) cp gdc$(exeext) gdc-cross$(exeext) # Use strict warnings. d-warn = $(STRICT_WARN) # D compiler and flags for building the front-end. ifeq ($(TREECHECKING),) CHECKING_DFLAGS = -frelease else CHECKING_DFLAGS = endif WARN_DFLAGS = -Wall -Wdeprecated $(NOCOMMON_FLAG) # D front-end doesn't use exceptions, but it does require RTTI. NOEXCEPTION_DFLAGS = $(filter-out -fno-rtti, $(NOEXCEPTION_FLAGS)) ALL_DFLAGS = $(DFLAGS-$@) $(GDCFLAGS) -fversion=IN_GCC $(CHECKING_DFLAGS) \ $(PICFLAG) $(ALIASING_FLAGS) $(NOEXCEPTION_DFLAGS) $(COVERAGE_FLAGS) \ $(WARN_DFLAGS) DCOMPILE.base = $(GDC) $(NO_PIE_CFLAGS) -c $(ALL_DFLAGS) -o $@ DCOMPILE = $(DCOMPILE.base) -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(*F).TPo DPOSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(*F).TPo $(@D)/$(DEPDIR)/$(*F).Po DLINKER = $(GDC) $(NO_PIE_FLAG) -lstdc++ # Like LINKER, but use a mutex for serializing front end links. ifeq ($(DO_LINK_MUTEX),true) DLLINKER = $(SHELL) $(srcdir)/lock-and-run.sh linkfe.lck $(DLINKER) else DLLINKER = $(DLINKER) endif # D Frontend object files. D_FRONTEND_OBJS = \ d/access.o \ d/aggregate.o \ d/aliasthis.o \ d/apply.o \ d/arrayop.o \ d/arraytypes.o \ d/attrib.o \ d/ast_node.o \ d/astcodegen.o \ d/astenums.o \ d/blockexit.o \ d/builtin.o \ d/canthrow.o \ d/chkformat.o \ d/clone.o \ d/common-bitfields.o \ d/common-file.o \ d/common-outbuffer.o \ d/common-string.o \ d/compiler.o \ d/cond.o \ d/constfold.o \ d/cparse.o \ d/cppmangle.o \ d/ctfeexpr.o \ d/ctorflow.o \ d/dcast.o \ d/dclass.o \ d/declaration.o \ d/delegatize.o \ d/denum.o \ d/dimport.o \ d/dinterpret.o \ d/dmacro.o \ d/dmangle.o \ d/dmodule.o \ d/doc.o \ d/dscope.o \ d/dstruct.o \ d/dsymbol.o \ d/dsymbolsem.o \ d/dtemplate.o \ d/dtoh.o \ d/dversion.o \ d/entity.o \ d/errors.o \ d/errorsink.o \ d/escape.o \ d/expression.o \ d/expressionsem.o \ d/file_manager.o \ d/foreachvar.o \ d/func.o \ d/globals.o \ d/gluelayer.o \ d/hdrgen.o \ d/iasm.o \ d/iasmgcc.o \ d/id.o \ d/identifier.o \ d/impcnvtab.o \ d/imphint.o \ d/importc.o \ d/init.o \ d/initsem.o \ d/inline.o \ d/intrange.o \ d/json.o \ d/lambdacomp.o \ d/lexer.o \ d/location.o \ d/mtype.o \ d/mustuse.o \ d/nogc.o \ d/nspace.o \ d/ob.o \ d/objc.o \ d/opover.o \ d/optimize.o \ d/parse.o \ d/parsetimevisitor.o \ d/permissivevisitor.o \ d/printast.o \ d/root-aav.o \ d/root-array.o \ d/root-bitarray.o \ d/root-complex.o \ d/root-ctfloat.o \ d/root-file.o \ d/root-filename.o \ d/root-hash.o \ d/root-longdouble.o \ d/root-optional.o \ d/root-port.o \ d/root-region.o \ d/root-rmem.o \ d/root-rootobject.o \ d/root-speller.o \ d/root-string.o \ d/root-stringtable.o \ d/root-utf.o \ d/safe.o \ d/sapply.o \ d/semantic2.o \ d/semantic3.o \ d/sideeffect.o \ d/statement.o \ d/statement_rewrite_walker.o \ d/statementsem.o \ d/staticassert.o \ d/staticcond.o \ d/stmtstate.o \ d/target.o \ d/templateparamsem.o \ d/tokens.o \ d/traits.o \ d/transitivevisitor.o \ d/typesem.o \ d/typinf.o \ d/utils.o \ d/visitor.o # Language-specific object files for D. D_OBJS = \ d/d-attribs.o \ d/d-builtins.o \ d/d-codegen.o \ d/d-compiler.o \ d/d-convert.o \ d/d-ctfloat.o \ d/d-diagnostic.o \ d/d-frontend.o \ d/d-gimplify.o \ d/d-incpath.o \ d/d-lang.o \ d/d-longdouble.o \ d/d-port.o \ d/d-target.o \ d/decl.o \ d/expr.o \ d/imports.o \ d/intrinsics.o \ d/modules.o \ d/runtime.o \ d/toir.o \ d/typeinfo.o \ d/types.o # All language-specific object files for D. D_ALL_OBJS = $(D_FRONTEND_OBJS) $(D_OBJS) $(D_TARGET_OBJS) d_OBJS = $(D_ALL_OBJS) d/d-spec.o d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) $(d.prev) @$(call LINK_PROGRESS,$(INDEX.d),start) +$(DLLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -static-libphobos -o $@ \ $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) @$(call LINK_PROGRESS,$(INDEX.d),end) # Documentation. D_TEXI_FILES = \ d/gdc.texi \ d/implement-d.texi \ $(gcc_docdir)/include/fdl.texi \ $(gcc_docdir)/include/gpl_v3.texi \ $(gcc_docdir)/include/gcc-common.texi \ gcc-vers.texi doc/gdc.info: $(D_TEXI_FILES) if test "x$(BUILD_INFO)" = xinfo; then \ rm -f doc/gdc.info*; \ $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ -I $(gcc_docdir)/include -o $@ $<; \ else true; fi doc/gdc.dvi: $(D_TEXI_FILES) $(TEXI2DVI) -I $(abs_docdir)/include -o $@ $< doc/gdc.pdf: $(D_TEXI_FILES) $(TEXI2PDF) -I $(abs_docdir)/include -o $@ $< $(build_htmldir)/gdc/index.html: $(D_TEXI_FILES) $(mkinstalldirs) $(@D) rm -f $(@D)/* $(TEXI2HTML) -I $(gcc_docdir)/include -I $(srcdir)/d -o $(@D) $< .INTERMEDIATE: gdc.pod gdc.pod: d/gdc.texi -$(TEXI2POD) -D gdc < $< > $@ # Build hooks. d.all.cross: gdc-cross$(exeext) d.start.encap: gdc$(exeext) d.rest.encap: d.info: doc/gdc.info d.dvi: doc/gdc.dvi d.pdf: doc/gdc.pdf d.html: $(build_htmldir)/gdc/index.html d.srcinfo: doc/gdc.info -cp -p $^ $(srcdir)/doc d.srcextra: d.tags: force cd $(srcdir)/d; \ $(ETAGS) -o TAGS.sub *.cc *.h dmd/*.h dmd/root/*.h; \ $(ETAGS) --include TAGS.sub --include ../TAGS.sub d.man: doc/gdc.1 d.srcman: doc/gdc.1 -cp -p $^ $(srcdir)/doc # 'make check' in gcc/ looks for check-d, as do all toplevel D-related # check targets. However, our DejaGNU framework requires 'check-gdc' as its # entry point. We feed the former to the latter here. check-d: check-gdc lang_checks += check-gdc lang_checks_parallelized += check-gdc check_gdc_parallelize = 10 # No D-specific selftests. selftest-d: # Install hooks. d.install-common: installdirs -rm -f $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) $(INSTALL_PROGRAM) gdc$(exeext) $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) -if test -f d21$(exeext); then \ if test -f gdc-cross$(exeext); then \ :; \ else \ rm -f $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext); \ ( cd $(DESTDIR)$(bindir) && \ $(LN) $(D_INSTALL_NAME)$(exeext) $(D_TARGET_INSTALL_NAME)$(exeext) ); \ fi; \ fi d.install-plugin: d.install-info: $(DESTDIR)$(infodir)/gdc.info d.install-pdf: doc/gdc.pdf @$(NORMAL_INSTALL) test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc" @for p in doc/gdc.pdf; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(pdf__strip_dir) \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \ done d.install-dvi: doc/gdc.dvi @$(NORMAL_INSTALL) test -z "$(dvidir)" || $(mkinstalldirs) "$(DESTDIR)$(dvidir)/gcc" @for p in doc/gdc.dvi; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(dvi__strip_dir) \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(dvidir)/gcc/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(dvidir)/gcc/$$f"; \ done d.install-html: $(build_htmldir)/gdc @$(NORMAL_INSTALL) test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)" @for p in $(build_htmldir)/gdc; do \ if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \ f=$(html__strip_dir) \ if test -d "$$d$$p"; then \ echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \ $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ else \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ fi; \ done d.install-man: $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext): doc/gdc.1 installdirs -rm -f $@ -$(INSTALL_DATA) $< $@ -chmod a-x $@ d.uninstall: -rm -rf $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) -rm -rf $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) -rm -rf $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext) -rm -rf $(DESTDIR)$(infodir)/gdc.info* # Clean hooks. d.mostlyclean: -rm -f d/*$(objext) -rm -f d/*$(coverageexts) -rm -f gdc$(exeext) gdc-cross$(exeext) d21$(exeext) d.clean: d.distclean: d.maintainer-clean: -rm -f $(docobjdir)/gdc.1 # Stage hooks. d.stage1: stage1-start -mv d/*$(objext) stage1/d d.stage2: stage2-start -mv d/*$(objext) stage2/d d.stage3: stage3-start -mv d/*$(objext) stage3/d d.stage4: stage4-start -mv d/*$(objext) stage4/d d.stageprofile: stageprofile-start -mv d/*$(objext) stageprofile/d d.stagefeedback: stagefeedback-start -mv d/*$(objext) stagefeedback/d # Include the dfrontend and build directories for headers. D_INCLUDES = -I$(srcdir)/d -J$(srcdir)/d/dmd -J$(srcdir)/d/dmd/res # Override build rules for D frontend. d/%.o: d/dmd/%.d $(DCOMPILE) $(D_INCLUDES) $< $(DPOSTCOMPILE) d/common-%.o: d/dmd/common/%.d $(DCOMPILE) $(D_INCLUDES) $< $(DPOSTCOMPILE) d/root-%.o: d/dmd/root/%.d $(DCOMPILE) $(D_INCLUDES) $< $(DPOSTCOMPILE)