1 # Make-lang.in -- Top level -*- makefile -*- fragment for the D frontend. 2 # Copyright (C) 2006-2022 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 22 D_INSTALL_NAME = $(shell echo gdc|sed '$(program_transform_name)') 23 D_TARGET_INSTALL_NAME = $(target_noncanonical)-$(shell echo gdc|sed '$(program_transform_name)') 24 25 # Name of phobos library 26 D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos\" 27 28 # The name for selecting d in LANGUAGES. 29 d: d21$(exeext) 30 d.serial = d21$(exeext) 31 32 # Tell GNU make to ignore these if they exist. 33 .PHONY: d 34 35 # Create the compiler driver for D. 36 CFLAGS-d/d-spec.o += $(DRIVER_DEFINES) $(D_LIBPHOBOS) 37 38 GDC_OBJS = $(GCC_OBJS) d/d-spec.o 39 gdc$(exeext): $(GDC_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a $(LIBDEPS) 40 +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ 41 $(GDC_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \ 42 $(EXTRA_GCC_LIBS) $(LIBS) 43 44 # Create a version of the gdc driver which calls the cross-compiler. 45 gdc-cross$(exeext): gdc$(exeext) 46 -rm -f gdc-cross$(exeext) 47 cp gdc$(exeext) gdc-cross$(exeext) 48 49 # Use strict warnings. 50 d-warn = $(STRICT_WARN) 51 52 # D compiler and flags for building the front-end. 53 ifeq ($(TREECHECKING),) 54 CHECKING_DFLAGS = -frelease 55 else 56 CHECKING_DFLAGS = 57 endif 58 WARN_DFLAGS = -Wall -Wdeprecated $(NOCOMMON_FLAG) 59 60 ALL_DFLAGS = $(DFLAGS-$@) $(GDCFLAGS) -fversion=IN_GCC $(CHECKING_DFLAGS) \ 61 $(PICFLAG) $(ALIASING_FLAGS) $(COVERAGE_FLAGS) $(WARN_DFLAGS) 62 63 DCOMPILE.base = $(GDC) $(NO_PIE_CFLAGS) -c $(ALL_DFLAGS) -o $@ 64 DCOMPILE = $(DCOMPILE.base) -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(basename $(@F)).TPo 65 DPOSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(basename $(@F)).TPo $(@D)/$(DEPDIR)/$(basename $(@F)).Po 66 DLINKER = $(GDC) $(NO_PIE_FLAG) -lstdc++ 67 68 # Like LINKER, but use a mutex for serializing front end links. 69 ifeq (@DO_LINK_MUTEX@,true) 70 DLLINKER = $(SHELL) $(srcdir)/lock-and-run.sh linkfe.lck $(DLINKER) 71 else 72 DLLINKER = $(DLINKER) 73 endif 74 75 # D Frontend object files. 76 D_FRONTEND_OBJS = \ 77 d/access.o \ 78 d/aggregate.o \ 79 d/aliasthis.o \ 80 d/apply.o \ 81 d/arrayop.o \ 82 d/arraytypes.o \ 83 d/attrib.o \ 84 d/ast_node.o \ 85 d/astcodegen.o \ 86 d/astenums.o \ 87 d/blockexit.o \ 88 d/builtin.o \ 89 d/canthrow.o \ 90 d/chkformat.o \ 91 d/clone.o \ 92 d/common-bitfields.o \ 93 d/common-file.o \ 94 d/common-outbuffer.o \ 95 d/common-string.o \ 96 d/compiler.o \ 97 d/cond.o \ 98 d/constfold.o \ 99 d/cparse.o \ 100 d/cppmangle.o \ 101 d/ctfeexpr.o \ 102 d/ctorflow.o \ 103 d/dcast.o \ 104 d/dclass.o \ 105 d/declaration.o \ 106 d/delegatize.o \ 107 d/denum.o \ 108 d/dimport.o \ 109 d/dinterpret.o \ 110 d/dmacro.o \ 111 d/dmangle.o \ 112 d/dmodule.o \ 113 d/doc.o \ 114 d/dscope.o \ 115 d/dstruct.o \ 116 d/dsymbol.o \ 117 d/dsymbolsem.o \ 118 d/dtemplate.o \ 119 d/dtoh.o \ 120 d/dversion.o \ 121 d/entity.o \ 122 d/errors.o \ 123 d/escape.o \ 124 d/expression.o \ 125 d/expressionsem.o \ 126 d/file_manager.o \ 127 d/foreachvar.o \ 128 d/func.o \ 129 d/globals.o \ 130 d/gluelayer.o \ 131 d/hdrgen.o \ 132 d/iasm.o \ 133 d/iasmgcc.o \ 134 d/id.o \ 135 d/identifier.o \ 136 d/impcnvtab.o \ 137 d/imphint.o \ 138 d/importc.o \ 139 d/init.o \ 140 d/initsem.o \ 141 d/inline.o \ 142 d/intrange.o \ 143 d/json.o \ 144 d/lambdacomp.o \ 145 d/lexer.o \ 146 d/mtype.o \ 147 d/mustuse.o \ 148 d/nogc.o \ 149 d/nspace.o \ 150 d/ob.o \ 151 d/objc.o \ 152 d/opover.o \ 153 d/optimize.o \ 154 d/parse.o \ 155 d/parsetimevisitor.o \ 156 d/permissivevisitor.o \ 157 d/printast.o \ 158 d/root-aav.o \ 159 d/root-array.o \ 160 d/root-bitarray.o \ 161 d/root-complex.o \ 162 d/root-ctfloat.o \ 163 d/root-file.o \ 164 d/root-filename.o \ 165 d/root-hash.o \ 166 d/root-longdouble.o \ 167 d/root-optional.o \ 168 d/root-port.o \ 169 d/root-region.o \ 170 d/root-rmem.o \ 171 d/root-rootobject.o \ 172 d/root-speller.o \ 173 d/root-string.o \ 174 d/root-stringtable.o \ 175 d/root-utf.o \ 176 d/safe.o \ 177 d/sapply.o \ 178 d/semantic2.o \ 179 d/semantic3.o \ 180 d/sideeffect.o \ 181 d/statement.o \ 182 d/statement_rewrite_walker.o \ 183 d/statementsem.o \ 184 d/staticassert.o \ 185 d/staticcond.o \ 186 d/stmtstate.o \ 187 d/target.o \ 188 d/templateparamsem.o \ 189 d/tokens.o \ 190 d/traits.o \ 191 d/transitivevisitor.o \ 192 d/typesem.o \ 193 d/typinf.o \ 194 d/utils.o \ 195 d/visitor.o 196 197 # Language-specific object files for D. 198 D_OBJS = \ 199 d/d-attribs.o \ 200 d/d-builtins.o \ 201 d/d-codegen.o \ 202 d/d-compiler.o \ 203 d/d-convert.o \ 204 d/d-ctfloat.o \ 205 d/d-diagnostic.o \ 206 d/d-frontend.o \ 207 d/d-gimplify.o \ 208 d/d-incpath.o \ 209 d/d-lang.o \ 210 d/d-longdouble.o \ 211 d/d-port.o \ 212 d/d-target.o \ 213 d/decl.o \ 214 d/expr.o \ 215 d/imports.o \ 216 d/intrinsics.o \ 217 d/modules.o \ 218 d/runtime.o \ 219 d/toir.o \ 220 d/typeinfo.o \ 221 d/types.o 222 223 # All language-specific object files for D. 224 D_ALL_OBJS = $(D_FRONTEND_OBJS) $(D_OBJS) $(D_TARGET_OBJS) 225 226 d_OBJS = $(D_ALL_OBJS) d/d-spec.o 227 228 d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) $(d.prev) 229 @$(call LINK_PROGRESS,$(INDEX.d),start) 230 +$(DLLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -static-libphobos -o $@ \ 231 $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) 232 @$(call LINK_PROGRESS,$(INDEX.d),end) 233 234 # Documentation. 235 236 D_TEXI_FILES = \ 237 d/gdc.texi \ 238 $(gcc_docdir)/include/fdl.texi \ 239 $(gcc_docdir)/include/gpl_v3.texi \ 240 $(gcc_docdir)/include/gcc-common.texi \ 241 gcc-vers.texi 242 243 doc/gdc.info: $(D_TEXI_FILES) 244 if test "x$(BUILD_INFO)" = xinfo; then \ 245 rm -f doc/gdc.info*; \ 246 $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ 247 -I $(gcc_docdir)/include -o $@ $<; \ 248 else true; fi 249 250 doc/gdc.dvi: $(D_TEXI_FILES) 251 $(TEXI2DVI) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 252 253 doc/gdc.pdf: $(D_TEXI_FILES) 254 $(TEXI2PDF) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 255 256 $(build_htmldir)/d/index.html: $(D_TEXI_FILES) 257 $(mkinstalldirs) $(@D) 258 rm -f $(@D)/* 259 $(TEXI2HTML) -I $(gcc_docdir) -I $(gcc_docdir)/include \ 260 -I $(srcdir)/d -o $(@D) $< 261 262 .INTERMEDIATE: gdc.pod 263 264 gdc.pod: d/gdc.texi 265 -$(TEXI2POD) -D gdc < $< > $@ 266 267 # Build hooks. 268 269 d.all.cross: gdc-cross$(exeext) 270 d.start.encap: gdc$(exeext) 271 d.rest.encap: 272 d.info: doc/gdc.info 273 d.dvi: doc/gdc.dvi 274 d.pdf: doc/gdc.pdf 275 d.html: $(build_htmldir)/d/index.html 276 d.srcinfo: doc/gdc.info 277 -cp -p $^ $(srcdir)/doc 278 d.srcextra: 279 280 d.tags: force 281 cd $(srcdir)/d; \ 282 $(ETAGS) -o TAGS.sub *.c *.cc *.h dmd/*.h dmd/root/*.h; \ 283 $(ETAGS) --include TAGS.sub --include ../TAGS.sub 284 285 d.man: doc/gdc.1 286 d.srcman: doc/gdc.1 287 -cp -p $^ $(srcdir)/doc 288 289 # 'make check' in gcc/ looks for check-d, as do all toplevel D-related 290 # check targets. However, our DejaGNU framework requires 'check-gdc' as its 291 # entry point. We feed the former to the latter here. 292 check-d: check-gdc 293 lang_checks += check-gdc 294 lang_checks_parallelized += check-gdc 295 check_gdc_parallelize = 10 296 297 # No D-specific selftests. 298 selftest-d: 299 300 # Install hooks. 301 302 d.install-common: installdirs 303 -rm -f $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 304 $(INSTALL_PROGRAM) gdc$(exeext) $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 305 -if test -f d21$(exeext); then \ 306 if test -f gdc-cross$(exeext); then \ 307 :; \ 308 else \ 309 rm -f $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext); \ 310 ( cd $(DESTDIR)$(bindir) && \ 311 $(LN) $(D_INSTALL_NAME)$(exeext) $(D_TARGET_INSTALL_NAME)$(exeext) ); \ 312 fi; \ 313 fi 314 315 d.install-plugin: 316 317 d.install-info: $(DESTDIR)$(infodir)/gdc.info 318 319 d.install-pdf: doc/gdc.pdf 320 @$(NORMAL_INSTALL) 321 test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc" 322 @for p in doc/gdc.pdf; do \ 323 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 324 f=$(pdf__strip_dir) \ 325 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \ 326 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \ 327 done 328 329 d.install-dvi: doc/gdc.dvi 330 @$(NORMAL_INSTALL) 331 test -z "$(dvidir)" || $(mkinstalldirs) "$(DESTDIR)$(dvidir)/gcc" 332 @for p in doc/gdc.dvi; do \ 333 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 334 f=$(dvi__strip_dir) \ 335 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(dvidir)/gcc/$$f'"; \ 336 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(dvidir)/gcc/$$f"; \ 337 done 338 339 d.install-html: $(build_htmldir)/d 340 @$(NORMAL_INSTALL) 341 test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)" 342 @for p in $(build_htmldir)/d; do \ 343 if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \ 344 f=$(html__strip_dir) \ 345 if test -d "$$d$$p"; then \ 346 echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \ 347 $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ 348 echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ 349 $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ 350 else \ 351 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ 352 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ 353 fi; \ 354 done 355 356 d.install-man: $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) 357 358 $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext): doc/gdc.1 installdirs 359 -rm -f $@ 360 -$(INSTALL_DATA) $< $@ 361 -chmod a-x $@ 362 363 d.uninstall: 364 -rm -rf $(DESTDIR)$(bindir)/$(D_INSTALL_NAME)$(exeext) 365 -rm -rf $(DESTDIR)$(man1dir)/$(D_INSTALL_NAME)$(man1ext) 366 -rm -rf $(DESTDIR)$(bindir)/$(D_TARGET_INSTALL_NAME)$(exeext) 367 -rm -rf $(DESTDIR)$(infodir)/gdc.info* 368 369 # Clean hooks. 370 371 d.mostlyclean: 372 -rm -f d/*$(objext) 373 -rm -f d/*$(coverageexts) 374 -rm -f gdc$(exeext) gdc-cross$(exeext) d21$(exeext) 375 d.clean: 376 d.distclean: 377 d.maintainer-clean: 378 -rm -f $(docobjdir)/gdc.1 379 380 # Stage hooks. 381 382 d.stage1: stage1-start 383 -mv d/*$(objext) stage1/d 384 d.stage2: stage2-start 385 -mv d/*$(objext) stage2/d 386 d.stage3: stage3-start 387 -mv d/*$(objext) stage3/d 388 d.stage4: stage4-start 389 -mv d/*$(objext) stage4/d 390 d.stageprofile: stageprofile-start 391 -mv d/*$(objext) stageprofile/d 392 d.stagefeedback: stagefeedback-start 393 -mv d/*$(objext) stagefeedback/d 394 395 # Include the dfrontend and build directories for headers. 396 D_INCLUDES = -I$(srcdir)/d -J$(srcdir)/d/dmd -J$(srcdir)/d/dmd/res 397 398 # Override build rules for D frontend. 399 d/%.o: d/dmd/%.d 400 $(DCOMPILE) $(D_INCLUDES) $< 401 $(DPOSTCOMPILE) 402 403 d/common-%.o: d/dmd/common/%.d 404 $(DCOMPILE) $(D_INCLUDES) $< 405 $(DPOSTCOMPILE) 406 407 d/root-%.o: d/dmd/root/%.d 408 $(DCOMPILE) $(D_INCLUDES) $< 409 $(DPOSTCOMPILE) 410