1# Make-lang.in -- Top level -*- makefile -*- fragment for the D frontend. 2# Copyright (C) 2006-2019 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/argtypes.o \ 63 d/arrayop.o \ 64 d/attrib.o \ 65 d/blockexit.o \ 66 d/canthrow.o \ 67 d/checkedint.o \ 68 d/clone.o \ 69 d/cond.o \ 70 d/constfold.o \ 71 d/cppmangle.o \ 72 d/ctfeexpr.o \ 73 d/dcast.o \ 74 d/dclass.o \ 75 d/declaration.o \ 76 d/delegatize.o \ 77 d/denum.o \ 78 d/dimport.o \ 79 d/dinterpret.o \ 80 d/dmacro.o \ 81 d/dmangle.o \ 82 d/dmodule.o \ 83 d/doc.o \ 84 d/dscope.o \ 85 d/dstruct.o \ 86 d/dsymbol.o \ 87 d/dtemplate.o \ 88 d/dversion.o \ 89 d/entity.o \ 90 d/escape.o \ 91 d/expression.o \ 92 d/expressionsem.o \ 93 d/file.o \ 94 d/filename.o \ 95 d/func.o \ 96 d/hdrgen.o \ 97 d/iasm.o \ 98 d/iasmgcc.o \ 99 d/identifier.o \ 100 d/imphint.o \ 101 d/init.o \ 102 d/initsem.o \ 103 d/intrange.o \ 104 d/json.o \ 105 d/lexer.o \ 106 d/mtype.o \ 107 d/nogc.o \ 108 d/nspace.o \ 109 d/objc.o \ 110 d/opover.o \ 111 d/optimize.o \ 112 d/outbuffer.o \ 113 d/parse.o \ 114 d/rmem.o \ 115 d/rootobject.o \ 116 d/safe.o \ 117 d/sapply.o \ 118 d/sideeffect.o \ 119 d/speller.o \ 120 d/statement.o \ 121 d/statementsem.o \ 122 d/staticassert.o \ 123 d/staticcond.o \ 124 d/stringtable.o \ 125 d/tokens.o \ 126 d/traits.o \ 127 d/typesem.o \ 128 d/utf.o \ 129 d/utils.o 130 131# D Frontend generated files. 132D_GENERATED_SRCS = d/id.c d/id.h d/impcnvtab.c 133D_GENERATED_OBJS = d/id.o d/impcnvtab.o 134 135# Language-specific object files for D. 136D_OBJS = \ 137 d/d-attribs.o d/d-builtins.o d/d-codegen.o d/d-convert.o \ 138 d/d-diagnostic.o d/d-frontend.o d/d-incpath.o d/d-lang.o \ 139 d/d-longdouble.o d/d-target.o d/decl.o d/expr.o d/imports.o \ 140 d/intrinsics.o d/modules.o d/runtime.o d/toir.o d/typeinfo.o d/types.o 141 142# All language-specific object files for D. 143D_ALL_OBJS = $(D_FRONTEND_OBJS) $(D_GENERATED_OBJS) $(D_OBJS) $(D_TARGET_OBJS) 144 145d_OBJS = $(D_ALL_OBJS) d/d-spec.o 146 147d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) 148 +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ 149 $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) 150 151# Documentation. 152 153D_TEXI_FILES = \ 154 d/gdc.texi \ 155 $(gcc_docdir)/include/fdl.texi \ 156 $(gcc_docdir)/include/gpl_v3.texi \ 157 $(gcc_docdir)/include/gcc-common.texi \ 158 gcc-vers.texi 159 160doc/gdc.info: $(D_TEXI_FILES) 161 if test "x$(BUILD_INFO)" = xinfo; then \ 162 rm -f doc/gdc.info*; \ 163 $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ 164 -I $(gcc_docdir)/include -o $@ $<; \ 165 else true; fi 166 167doc/gdc.dvi: $(D_TEXI_FILES) 168 $(TEXI2DVI) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 169 170doc/gdc.pdf: $(D_TEXI_FILES) 171 $(TEXI2PDF) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 172 173$(build_htmldir)/d/index.html: $(D_TEXI_FILES) 174 $(mkinstalldirs) $(@D) 175 rm -f $(@D)/* 176 $(TEXI2HTML) -I $(gcc_docdir) -I $(gcc_docdir)/include \ 177 -I $(srcdir)/d -o $(@D) $< 178 179.INTERMEDIATE: gdc.pod 180 181gdc.pod: d/gdc.texi 182 -$(TEXI2POD) -D gdc < $< > $@ 183 184# Build hooks. 185 186d.all.cross: gdc-cross$(exeext) 187d.start.encap: gdc$(exeext) 188d.rest.encap: 189d.info: doc/gdc.info 190d.dvi: doc/gdc.dvi 191d.pdf: doc/gdc.pdf 192d.html: $(build_htmldir)/d/index.html 193d.srcinfo: doc/gdc.info 194 -cp -p $^ $(srcdir)/doc 195d.srcextra: 196 197d.tags: force 198 cd $(srcdir)/d; \ 199 etags -o TAGS.sub *.c *.cc *.h dmd/*.c dmd/*.h dmd/root/*.h dmd/root/*.c; \ 200 etags --include TAGS.sub --include ../TAGS.sub 201 202d.man: doc/gdc.1 203d.srcman: doc/gdc.1 204 -cp -p $^ $(srcdir)/doc 205 206# 'make check' in gcc/ looks for check-d, as do all toplevel D-related 207# check targets. However, our DejaGNU framework requires 'check-gdc' as its 208# entry point. We feed the former to the latter here. 209check-d: check-gdc 210lang_checks += check-gdc 211lang_checks_parallelized += check-gdc 212check_gdc_parallelize = 10 213 214# No D-specific selftests. 215selftest-d: 216 217# Install hooks. 218 219d.install-common: installdirs 220 -rm -f $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 221 $(INSTALL_PROGRAM) gdc$(exeext) $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 222 -if test -f d21$(exeext); then \ 223 if test -f gdc-cross$(exeext); then \ 224 :; \ 225 else \ 226 rm -f $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext); \ 227 ( cd $(DESTDIR)$(bindir) && \ 228 $(LN) $(D_INSTALL_NAME)$(exeext) $(D_TARGET_INSTALL_NAME)$(exeext) ); \ 229 fi; \ 230 fi 231 232d.install-plugin: 233 234d.install-info: $(DESTDIR)$(infodir)/gdc.info 235 236d.install-pdf: doc/gdc.pdf 237 @$(NORMAL_INSTALL) 238 test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc" 239 @for p in doc/gdc.pdf; do \ 240 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 241 f=$(pdf__strip_dir) \ 242 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \ 243 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \ 244 done 245 246d.install-html: $(build_htmldir)/d 247 @$(NORMAL_INSTALL) 248 test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)" 249 @for p in $(build_htmldir)/d; do \ 250 if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \ 251 f=$(html__strip_dir) \ 252 if test -d "$$d$$p"; then \ 253 echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \ 254 $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ 255 echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ 256 $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ 257 else \ 258 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ 259 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ 260 fi; \ 261 done 262 263d.install-man: $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) 264 265$(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext): doc/gdc.1 installdirs 266 -rm -f $@ 267 -$(INSTALL_DATA) $< $@ 268 -chmod a-x $@ 269 270d.uninstall: 271 -rm -rf $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 272 -rm -rf $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) 273 -rm -rf $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext) 274 -rm -rf $(DESTDIR)$(infodir)/gdc.info* 275 276# Clean hooks. 277 278d.mostlyclean: 279 -rm -f d/*$(objext) 280 -rm -f d/*$(coverageexts) 281 -rm -f $(D_GENERATED_SRCS) 282 -rm -f d/idgen$(build_exeext) d/impcnvgen$(build_exeext) 283 -rm -f gdc$(exeext) gdc-cross$(exeext) d21$(exeext) 284d.clean: 285d.distclean: 286d.maintainer-clean: 287 -rm -f $(docobjdir)/gdc.1 288 289# Stage hooks. 290 291d.stage1: stage1-start 292 -mv d/*$(objext) stage1/d 293d.stage2: stage2-start 294 -mv d/*$(objext) stage2/d 295d.stage3: stage3-start 296 -mv d/*$(objext) stage3/d 297d.stage4: stage4-start 298 -mv d/*$(objext) stage4/d 299d.stageprofile: stageprofile-start 300 -mv d/*$(objext) stageprofile/d 301d.stagefeedback: stagefeedback-start 302 -mv d/*$(objext) stagefeedback/d 303 304# Include the dfrontend and build directories for headers. 305D_INCLUDES = -I$(srcdir)/d -I$(srcdir)/d/dmd -Id 306 307CFLAGS-d/id.o += $(D_INCLUDES) 308CFLAGS-d/impcnvtab.o += $(D_INCLUDES) 309 310# Override build rules for D frontend. 311d/%.o: d/dmd/%.c $(D_GENERATED_SRCS) 312 $(DMD_COMPILE) $(D_INCLUDES) $< 313 $(POSTCOMPILE) 314 315d/%.o: d/dmd/root/%.c $(D_GENERATED_SRCS) 316 $(DMD_COMPILE) $(D_INCLUDES) $< 317 $(POSTCOMPILE) 318 319# Generated programs. 320d/idgen$(build_exeext): d/idgen.dmdgen.o $(BUILD_LIBDEPS) 321 +$(LINKER_FOR_BUILD) $(BUILD_LINKERFLAGS) $(BUILD_LDFLAGS) -o $@ \ 322 $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS) 323 324d/impcnvgen$(build_exeext): d/impcnvgen.dmdgen.o $(BUILD_LIBDEPS) 325 +$(LINKER_FOR_BUILD) $(BUILD_LINKERFLAGS) $(BUILD_LDFLAGS) -o $@ \ 326 $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS) 327 328# Generated sources. 329d/id.c: d/idgen$(build_exeext) 330 cd d && ./idgen$(build_exeext) 331 332# idgen also generates id.h; just verify it exists. 333d/id.h: d/id.c 334 335d/impcnvtab.c: d/impcnvgen$(build_exeext) 336 cd d && ./impcnvgen$(build_exeext) 337 338d/%.dmdgen.o: $(srcdir)/d/dmd/%.c 339 $(DMDGEN_COMPILE) $(D_INCLUDES) $< 340 $(POSTCOMPILE) 341