1# Make-lang.in -- Top level -*- makefile -*- fragment for the D frontend. 2# Copyright (C) 2006-2020 Free Software Foundation, Inc. 3 4# GCC is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 3, or (at your option) 7# any later version. 8 9# GCC is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13 14# You should have received a copy of the GNU General Public License 15# along with GCC; see the file COPYING3. If not see 16# <http://www.gnu.org/licenses/>. 17 18# This file provides the language dependent support in the main Makefile. 19 20# Installation name. 21 22D_INSTALL_NAME = $(shell echo gdc|sed '$(program_transform_name)') 23D_TARGET_INSTALL_NAME = $(target_noncanonical)-$(shell echo gdc|sed '$(program_transform_name)') 24 25# Name of phobos library 26D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos\" 27 28# The name for selecting d in LANGUAGES. 29d: d21$(exeext) 30 31# Tell GNU make to ignore these if they exist. 32.PHONY: d 33 34# Create the compiler driver for D. 35CFLAGS-d/d-spec.o += $(DRIVER_DEFINES) $(D_LIBPHOBOS) 36 37GDC_OBJS = $(GCC_OBJS) d/d-spec.o 38gdc$(exeext): $(GDC_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a $(LIBDEPS) 39 +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ 40 $(GDC_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \ 41 $(EXTRA_GCC_LIBS) $(LIBS) 42 43# Create a version of the gdc driver which calls the cross-compiler. 44gdc-cross$(exeext): gdc$(exeext) 45 -rm -f gdc-cross$(exeext) 46 cp gdc$(exeext) gdc-cross$(exeext) 47 48# Filter out pedantic and virtual overload warnings. 49d-warn = $(filter-out -pedantic -Woverloaded-virtual, $(STRICT_WARN)) 50 51# Also filter out warnings for missing format attributes in the D Frontend. 52DMD_WARN_CXXFLAGS = $(filter-out -Wmissing-format-attribute, $(WARN_CXXFLAGS)) 53DMD_COMPILE = $(subst $(WARN_CXXFLAGS), $(DMD_WARN_CXXFLAGS), $(COMPILE)) 54DMDGEN_COMPILE = $(subst $(COMPILER), $(COMPILER_FOR_BUILD), $(DMD_COMPILE)) 55 56# D Frontend object files. 57D_FRONTEND_OBJS = \ 58 d/aav.o \ 59 d/access.o \ 60 d/aliasthis.o \ 61 d/apply.o \ 62 d/arrayop.o \ 63 d/attrib.o \ 64 d/blockexit.o \ 65 d/canthrow.o \ 66 d/checkedint.o \ 67 d/clone.o \ 68 d/cond.o \ 69 d/constfold.o \ 70 d/cppmangle.o \ 71 d/ctfeexpr.o \ 72 d/dcast.o \ 73 d/dclass.o \ 74 d/declaration.o \ 75 d/delegatize.o \ 76 d/denum.o \ 77 d/dimport.o \ 78 d/dinterpret.o \ 79 d/dmacro.o \ 80 d/dmangle.o \ 81 d/dmodule.o \ 82 d/doc.o \ 83 d/dscope.o \ 84 d/dstruct.o \ 85 d/dsymbol.o \ 86 d/dtemplate.o \ 87 d/dversion.o \ 88 d/entity.o \ 89 d/escape.o \ 90 d/expression.o \ 91 d/expressionsem.o \ 92 d/file.o \ 93 d/filename.o \ 94 d/func.o \ 95 d/hdrgen.o \ 96 d/iasm.o \ 97 d/iasmgcc.o \ 98 d/identifier.o \ 99 d/imphint.o \ 100 d/init.o \ 101 d/initsem.o \ 102 d/intrange.o \ 103 d/json.o \ 104 d/lexer.o \ 105 d/mtype.o \ 106 d/nogc.o \ 107 d/nspace.o \ 108 d/objc.o \ 109 d/opover.o \ 110 d/optimize.o \ 111 d/outbuffer.o \ 112 d/parse.o \ 113 d/rmem.o \ 114 d/rootobject.o \ 115 d/safe.o \ 116 d/sapply.o \ 117 d/sideeffect.o \ 118 d/speller.o \ 119 d/statement.o \ 120 d/statementsem.o \ 121 d/staticassert.o \ 122 d/staticcond.o \ 123 d/stringtable.o \ 124 d/tokens.o \ 125 d/traits.o \ 126 d/typesem.o \ 127 d/utf.o \ 128 d/utils.o 129 130# D Frontend generated files. 131D_GENERATED_SRCS = d/id.c d/id.h d/impcnvtab.c 132D_GENERATED_OBJS = d/id.o d/impcnvtab.o 133 134# Language-specific object files for D. 135D_OBJS = \ 136 d/d-attribs.o d/d-builtins.o d/d-codegen.o d/d-convert.o \ 137 d/d-diagnostic.o d/d-frontend.o d/d-incpath.o d/d-lang.o \ 138 d/d-longdouble.o d/d-target.o d/decl.o d/expr.o d/imports.o \ 139 d/intrinsics.o d/modules.o d/runtime.o d/toir.o d/typeinfo.o d/types.o 140 141# All language-specific object files for D. 142D_ALL_OBJS = $(D_FRONTEND_OBJS) $(D_GENERATED_OBJS) $(D_OBJS) $(D_TARGET_OBJS) 143 144d_OBJS = $(D_ALL_OBJS) d/d-spec.o 145 146d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) 147 +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ 148 $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) 149 150# Documentation. 151 152D_TEXI_FILES = \ 153 d/gdc.texi \ 154 $(gcc_docdir)/include/fdl.texi \ 155 $(gcc_docdir)/include/gpl_v3.texi \ 156 $(gcc_docdir)/include/gcc-common.texi \ 157 gcc-vers.texi 158 159doc/gdc.info: $(D_TEXI_FILES) 160 if test "x$(BUILD_INFO)" = xinfo; then \ 161 rm -f doc/gdc.info*; \ 162 $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ 163 -I $(gcc_docdir)/include -o $@ $<; \ 164 else true; fi 165 166doc/gdc.dvi: $(D_TEXI_FILES) 167 $(TEXI2DVI) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 168 169doc/gdc.pdf: $(D_TEXI_FILES) 170 $(TEXI2PDF) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 171 172$(build_htmldir)/d/index.html: $(D_TEXI_FILES) 173 $(mkinstalldirs) $(@D) 174 rm -f $(@D)/* 175 $(TEXI2HTML) -I $(gcc_docdir) -I $(gcc_docdir)/include \ 176 -I $(srcdir)/d -o $(@D) $< 177 178.INTERMEDIATE: gdc.pod 179 180gdc.pod: d/gdc.texi 181 -$(TEXI2POD) -D gdc < $< > $@ 182 183# Build hooks. 184 185d.all.cross: gdc-cross$(exeext) 186d.start.encap: gdc$(exeext) 187d.rest.encap: 188d.info: doc/gdc.info 189d.dvi: doc/gdc.dvi 190d.pdf: doc/gdc.pdf 191d.html: $(build_htmldir)/d/index.html 192d.srcinfo: doc/gdc.info 193 -cp -p $^ $(srcdir)/doc 194d.srcextra: 195 196d.tags: force 197 cd $(srcdir)/d; \ 198 etags -o TAGS.sub *.c *.cc *.h dmd/*.c dmd/*.h dmd/root/*.h dmd/root/*.c; \ 199 etags --include TAGS.sub --include ../TAGS.sub 200 201d.man: doc/gdc.1 202d.srcman: doc/gdc.1 203 -cp -p $^ $(srcdir)/doc 204 205# 'make check' in gcc/ looks for check-d, as do all toplevel D-related 206# check targets. However, our DejaGNU framework requires 'check-gdc' as its 207# entry point. We feed the former to the latter here. 208check-d: check-gdc 209lang_checks += check-gdc 210lang_checks_parallelized += check-gdc 211check_gdc_parallelize = 10 212 213# No D-specific selftests. 214selftest-d: 215 216# Install hooks. 217 218d.install-common: installdirs 219 -rm -f $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 220 $(INSTALL_PROGRAM) gdc$(exeext) $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 221 -if test -f d21$(exeext); then \ 222 if test -f gdc-cross$(exeext); then \ 223 :; \ 224 else \ 225 rm -f $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext); \ 226 ( cd $(DESTDIR)$(bindir) && \ 227 $(LN) $(D_INSTALL_NAME)$(exeext) $(D_TARGET_INSTALL_NAME)$(exeext) ); \ 228 fi; \ 229 fi 230 231d.install-plugin: 232 233d.install-info: $(DESTDIR)$(infodir)/gdc.info 234 235d.install-pdf: doc/gdc.pdf 236 @$(NORMAL_INSTALL) 237 test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc" 238 @for p in doc/gdc.pdf; do \ 239 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 240 f=$(pdf__strip_dir) \ 241 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \ 242 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \ 243 done 244 245d.install-html: $(build_htmldir)/d 246 @$(NORMAL_INSTALL) 247 test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)" 248 @for p in $(build_htmldir)/d; do \ 249 if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \ 250 f=$(html__strip_dir) \ 251 if test -d "$$d$$p"; then \ 252 echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \ 253 $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ 254 echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ 255 $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ 256 else \ 257 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ 258 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ 259 fi; \ 260 done 261 262d.install-man: $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) 263 264$(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext): doc/gdc.1 installdirs 265 -rm -f $@ 266 -$(INSTALL_DATA) $< $@ 267 -chmod a-x $@ 268 269d.uninstall: 270 -rm -rf $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 271 -rm -rf $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) 272 -rm -rf $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext) 273 -rm -rf $(DESTDIR)$(infodir)/gdc.info* 274 275# Clean hooks. 276 277d.mostlyclean: 278 -rm -f d/*$(objext) 279 -rm -f d/*$(coverageexts) 280 -rm -f $(D_GENERATED_SRCS) 281 -rm -f d/idgen$(build_exeext) d/impcnvgen$(build_exeext) 282 -rm -f gdc$(exeext) gdc-cross$(exeext) d21$(exeext) 283d.clean: 284d.distclean: 285d.maintainer-clean: 286 -rm -f $(docobjdir)/gdc.1 287 288# Stage hooks. 289 290d.stage1: stage1-start 291 -mv d/*$(objext) stage1/d 292d.stage2: stage2-start 293 -mv d/*$(objext) stage2/d 294d.stage3: stage3-start 295 -mv d/*$(objext) stage3/d 296d.stage4: stage4-start 297 -mv d/*$(objext) stage4/d 298d.stageprofile: stageprofile-start 299 -mv d/*$(objext) stageprofile/d 300d.stagefeedback: stagefeedback-start 301 -mv d/*$(objext) stagefeedback/d 302 303# Include the dfrontend and build directories for headers. 304D_INCLUDES = -I$(srcdir)/d -I$(srcdir)/d/dmd -Id 305 306CFLAGS-d/id.o += $(D_INCLUDES) 307CFLAGS-d/impcnvtab.o += $(D_INCLUDES) 308 309# Override build rules for D frontend. 310d/%.o: d/dmd/%.c $(D_GENERATED_SRCS) 311 $(DMD_COMPILE) $(D_INCLUDES) $< 312 $(POSTCOMPILE) 313 314d/%.o: d/dmd/root/%.c $(D_GENERATED_SRCS) 315 $(DMD_COMPILE) $(D_INCLUDES) $< 316 $(POSTCOMPILE) 317 318# Generated programs. 319d/idgen$(build_exeext): d/idgen.dmdgen.o $(BUILD_LIBDEPS) 320 +$(LINKER_FOR_BUILD) $(BUILD_LINKERFLAGS) $(BUILD_LDFLAGS) -o $@ \ 321 $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS) 322 323d/impcnvgen$(build_exeext): d/impcnvgen.dmdgen.o $(BUILD_LIBDEPS) 324 +$(LINKER_FOR_BUILD) $(BUILD_LINKERFLAGS) $(BUILD_LDFLAGS) -o $@ \ 325 $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS) 326 327# Generated sources. 328d/id.c: d/idgen$(build_exeext) 329 cd d && ./idgen$(build_exeext) 330 331# idgen also generates id.h; just verify it exists. 332d/id.h: d/id.c 333 334d/impcnvtab.c: d/impcnvgen$(build_exeext) 335 cd d && ./impcnvgen$(build_exeext) 336 337d/%.dmdgen.o: $(srcdir)/d/dmd/%.c 338 $(DMDGEN_COMPILE) $(D_INCLUDES) $< 339 $(POSTCOMPILE) 340