Home | History | Annotate | Line # | Download | only in d
      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