1# Top level -*- makefile -*- fragment for libgccjit.so. 2# Copyright (C) 2013-2022 Free Software Foundation, Inc. 3 4#This file is part of GCC. 5 6#GCC is free software; you can redistribute it and/or modify 7#it under the terms of the GNU General Public License as published by 8#the Free Software Foundation; either version 3, or (at your option) 9#any later version. 10 11#GCC is distributed in the hope that it will be useful, 12#but WITHOUT ANY WARRANTY; without even the implied warranty of 13#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14#GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with GCC; see the file COPYING3. If not see 18# <http://www.gnu.org/licenses/>. 19 20# This file provides the language dependent support in the main Makefile. 21# Each language makefile fragment must provide the following targets: 22# 23# foo.all.cross, foo.start.encap, foo.rest.encap, 24# foo.install-common, foo.install-man, foo.install-info, foo.install-pdf, 25# foo.install-html, foo.info, foo.dvi, foo.pdf, foo.html, foo.uninstall, 26# foo.mostlyclean, foo.clean, foo.distclean, 27# foo.maintainer-clean, foo.stage1, foo.stage2, foo.stage3, foo.stage4 28# 29# where `foo' is the name of the language. 30# 31# It should also provide rules for: 32# 33# - making any compiler driver (eg: g++) 34# - the compiler proper (eg: cc1plus) 35# - define the names for selecting the language in LANGUAGES. 36 37# 38# Define the names for selecting jit in LANGUAGES. 39# Note that it would be nice to move the dependency on g++ 40# into the jit rule, but that needs a little bit of work 41# to do the right thing within all.cross. 42 43LIBGCCJIT_VERSION_NUM = 0 44LIBGCCJIT_MINOR_NUM = 0 45LIBGCCJIT_RELEASE_NUM = 1 46 47ifneq (,$(findstring mingw,$(target))) 48LIBGCCJIT_FILENAME = libgccjit-$(LIBGCCJIT_VERSION_NUM).dll 49LIBGCCJIT_IMPORT_LIB = libgccjit.dll.a 50 51jit: $(LIBGCCJIT_FILENAME) \ 52 $(FULL_DRIVER_NAME) 53 54else 55 56ifneq (,$(findstring darwin,$(host))) 57 58LIBGCCJIT_AGE = 1 59LIBGCCJIT_BASENAME = libgccjit 60 61LIBGCCJIT_SONAME = \ 62 ${libdir}/$(LIBGCCJIT_BASENAME).$(LIBGCCJIT_VERSION_NUM).dylib 63LIBGCCJIT_FILENAME = $(LIBGCCJIT_BASENAME).$(LIBGCCJIT_VERSION_NUM).dylib 64LIBGCCJIT_LINKER_NAME = $(LIBGCCJIT_BASENAME).dylib 65 66# Conditionalize the use of the LD_VERSION_SCRIPT_OPTION and 67# LD_SONAME_OPTION depending if configure found them, using $(if) 68# We have to define a COMMA here, otherwise the commas in the "true" 69# result are treated as separators by the $(if). 70COMMA := , 71LIBGCCJIT_VERSION_SCRIPT_OPTION = \ 72 $(if $(LD_VERSION_SCRIPT_OPTION),\ 73 -Wl$(COMMA)$(LD_VERSION_SCRIPT_OPTION)$(COMMA)$(srcdir)/jit/libgccjit.map) 74 75LIBGCCJIT_SONAME_OPTION = \ 76 $(if $(LD_SONAME_OPTION), \ 77 -Wl$(COMMA)$(LD_SONAME_OPTION)$(COMMA)$(LIBGCCJIT_SONAME)) 78 79LIBGCCJIT_SONAME_SYMLINK = $(LIBGCCJIT_FILENAME) 80LIBGCCJIT_LINKER_NAME_SYMLINK = $(LIBGCCJIT_LINKER_NAME) 81 82jit: $(LIBGCCJIT_FILENAME) \ 83 $(LIBGCCJIT_SYMLINK) \ 84 $(LIBGCCJIT_LINKER_NAME_SYMLINK) \ 85 $(FULL_DRIVER_NAME) 86 87else 88 89LIBGCCJIT_LINKER_NAME = libgccjit.so 90LIBGCCJIT_SONAME = $(LIBGCCJIT_LINKER_NAME).$(LIBGCCJIT_VERSION_NUM) 91LIBGCCJIT_FILENAME = \ 92 $(LIBGCCJIT_SONAME).$(LIBGCCJIT_MINOR_NUM).$(LIBGCCJIT_RELEASE_NUM) 93 94LIBGCCJIT_LINKER_NAME_SYMLINK = $(LIBGCCJIT_LINKER_NAME) 95LIBGCCJIT_SONAME_SYMLINK = $(LIBGCCJIT_SONAME) 96 97# Conditionalize the use of the LD_VERSION_SCRIPT_OPTION and 98# LD_SONAME_OPTION depending if configure found them, using $(if) 99# We have to define a COMMA here, otherwise the commas in the "true" 100# result are treated as separators by the $(if). 101COMMA := , 102LIBGCCJIT_VERSION_SCRIPT_OPTION = \ 103 $(if $(LD_VERSION_SCRIPT_OPTION),\ 104 -Wl$(COMMA)$(LD_VERSION_SCRIPT_OPTION)$(COMMA)$(srcdir)/jit/libgccjit.map) 105 106LIBGCCJIT_SONAME_OPTION = \ 107 $(if $(LD_SONAME_OPTION), \ 108 -Wl$(COMMA)$(LD_SONAME_OPTION)$(COMMA)$(LIBGCCJIT_SONAME)) 109 110jit: $(LIBGCCJIT_FILENAME) \ 111 $(LIBGCCJIT_SYMLINK) \ 112 $(LIBGCCJIT_LINKER_NAME_SYMLINK) \ 113 $(FULL_DRIVER_NAME) 114 115endif 116endif 117 118jit.serial = $(LIBGCCJIT_FILENAME) 119 120# Tell GNU make to ignore these if they exist. 121.PHONY: jit 122 123jit_OBJS = attribs.o \ 124 jit/dummy-frontend.o \ 125 jit/libgccjit.o \ 126 jit/jit-logging.o \ 127 jit/jit-recording.o \ 128 jit/jit-playback.o \ 129 jit/jit-result.o \ 130 jit/jit-tempdir.o \ 131 jit/jit-builtins.o \ 132 jit/jit-spec.o \ 133 gcc.o 134 135ifneq (,$(findstring mingw,$(target))) 136jit_OBJS += jit/jit-w32.o 137endif 138 139# Use strict warnings for this front end. 140jit-warn = $(STRICT_WARN) 141 142ifneq (,$(findstring mingw,$(target))) 143# Create import library 144LIBGCCJIT_EXTRA_OPTS = -Wl,--out-implib,$(LIBGCCJIT_IMPORT_LIB) 145else 146 147ifneq (,$(findstring darwin,$(host))) 148# TODO : Construct a Darwin-style symbol export file. 149LIBGCCJIT_EXTRA_OPTS = -Wl,-compatibility_version,$(LIBGCCJIT_VERSION_NUM) \ 150 -Wl,-current_version,$(LIBGCCJIT_VERSION_NUM).$(LIBGCCJIT_MINOR_NUM).$(LIBGCCJIT_AGE) \ 151 $(LIBGCCJIT_VERSION_SCRIPT_OPTION) \ 152 $(LIBGCCJIT_SONAME_OPTION) 153else 154 155LIBGCCJIT_EXTRA_OPTS = $(LIBGCCJIT_VERSION_SCRIPT_OPTION) \ 156 $(LIBGCCJIT_SONAME_OPTION) 157endif 158endif 159 160# We avoid using $(BACKEND) from Makefile.in in order to avoid pulling 161# in main.o 162$(LIBGCCJIT_FILENAME): $(jit_OBJS) \ 163 libbackend.a libcommon-target.a libcommon.a \ 164 $(CPPLIB) $(LIBDECNUMBER) \ 165 $(LIBDEPS) $(srcdir)/jit/libgccjit.map \ 166 $(EXTRA_GCC_OBJS) $(jit.prev) 167 @$(call LINK_PROGRESS,$(INDEX.jit),start) 168 +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ -shared \ 169 $(jit_OBJS) libbackend.a libcommon-target.a libcommon.a \ 170 $(CPPLIB) $(LIBDECNUMBER) $(EXTRA_GCC_LIBS) $(LIBS) $(BACKENDLIBS) \ 171 $(EXTRA_GCC_OBJS) \ 172 $(LIBGCCJIT_EXTRA_OPTS) 173 @$(call LINK_PROGRESS,$(INDEX.jit),end) 174 175# Create symlinks when not building for Windows 176ifeq (,$(findstring mingw,$(target))) 177 178ifeq (,$(findstring darwin,$(host))) 179# but only one level for Darwin, version info is embedded. 180$(LIBGCCJIT_SONAME_SYMLINK): $(LIBGCCJIT_FILENAME) 181 ln -sf $(LIBGCCJIT_FILENAME) $(LIBGCCJIT_SONAME_SYMLINK) 182endif 183 184$(LIBGCCJIT_LINKER_NAME_SYMLINK): $(LIBGCCJIT_SONAME_SYMLINK) 185 ln -sf $(LIBGCCJIT_SONAME_SYMLINK) $(LIBGCCJIT_LINKER_NAME_SYMLINK) 186endif 187 188# 189# Build hooks: 190 191jit.all.cross: 192jit.start.encap: 193jit.rest.encap: 194 195# Documentation build hooks. 196# 197# The documentation can be built using the texinfo toolchain, or 198# the sphinx toolchain 199# 200# The jit documentation is authored using Sphinx, which has numerous 201# advantages over Texinfo, including: 202# 203# * much faster 204# 205# * use of CSS and JS to provide less of a 1990s feel in the generated 206# HTML. 207# 208# * sane, stable HTML page and anchor names 209# 210# * sane HTML navigation: ability to move forward and back in the HTML 211# at every node to read the HTML like a book 212# 213# * syntax-coloring of examples 214# 215# * the ability to "include" fragments of code inline. This is used 216# heavily by the jit docs, so that the example code is shared by both 217# the test suite and the documentation to ensure that the examples 218# appearing in the docs actually compile and work 219# 220# Sphinx is not a "blessed" dependency, and so a prebuilt libgccjit.texinfo 221# file built by Sphinx is checked into the source tree to avoid requiring 222# everyone to have Sphinx installed. 223# 224# This prebuilt libgccjit.texinfo has the "include" fragments "baked in", 225# and so contains the content from the sphinx toolchain, but lacks the 226# syntax-coloring, and the generated HTML is (IMHO) greatly inferior to 227# that generated by Sphinx. 228 229# These targets redirect HTML creation and installation to either 230# jit.sphinx.(install-)html or jit.texinfo.(install-)html. 231jit.html: jit.$(doc_build_sys).html 232jit.install-html: jit.$(doc_build_sys).install-html 233 234# For now, use texinfo for pdf, since the sphinx latex toolchain currently 235# fails for me deep inside pdflatex (see notes below) 236jit.pdf: jit.texinfo.pdf 237jit.install-pdf: jit.texinfo.install-pdf 238 239# Hooks for building docs using texinfo 240JIT_TEXI_FILES = $(srcdir)/jit/docs/_build/texinfo/libgccjit.texi 241 242jit.info: doc/libgccjit.info 243doc/libgccjit.info: $(JIT_TEXI_FILES) 244 if test "x$(BUILD_INFO)" = xinfo; then \ 245 rm -f doc/libgccjit.info*; \ 246 $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ 247 -I $(gcc_docdir)/include -o $@ $<; \ 248 else true; fi 249 250jit.install-info: $(DESTDIR)$(infodir)/libgccjit.info 251 252jit.dvi: doc/libgccjit.dvi 253doc/libgccjit.dvi: $(JIT_TEXI_FILES) 254 $(TEXI2DVI) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 255 256jit.texinfo.html: $(build_htmldir)/jit/index.html 257 258$(build_htmldir)/jit/index.html: $(srcdir)/jit/docs/_build/texinfo/libgccjit.texi 259 $(mkinstalldirs) $(@D) 260 rm -f $(@D)/* 261 $(TEXI2HTML) -I $(gcc_docdir)/include -I $(srcdir)/jit -o $(@D) $< 262 263jit.texinfo.install-html: jit.texinfo.html 264 @$(NORMAL_INSTALL) 265 test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)" 266 @for p in $(build_htmldir)/jit; do \ 267 if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \ 268 f=$(html__strip_dir) \ 269 if test -d "$$d$$p"; then \ 270 echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \ 271 $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ 272 echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ 273 $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ 274 else \ 275 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ 276 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ 277 fi; \ 278 done 279 280jit.texinfo.pdf: doc/libgccjit.pdf 281 282doc/libgccjit.pdf: $(JIT_TEXI_FILES) 283 $(TEXI2PDF) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $< 284 285jit.texinfo.install-pdf: doc/libgccjit.pdf 286 @$(NORMAL_INSTALL) 287 test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc" 288 @for p in doc/libgccjit.pdf; do \ 289 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 290 f=$(pdf__strip_dir) \ 291 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \ 292 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \ 293 done 294 295# Hooks for building docs using the Sphinx toolchain: 296 297SPHINX_BUILD_DIR=jit/sphinx-build 298 299jit.sphinx.html: 300 $(mkinstalldirs) $(SPHINX_BUILD_DIR) 301 (cd $(srcdir)/jit/docs && \ 302 make html BUILDDIR=$(PWD)/$(SPHINX_BUILD_DIR) ) 303 304jit_htmldir=$(htmldir)/jit 305 306jit.sphinx.install-html: jit.sphinx.html 307 @$(NORMAL_INSTALL) 308 test -z "$(jit_htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(jit_htmldir)" 309 @for f in $(shell cd $(SPHINX_BUILD_DIR)/html && find) ; do \ 310 if test -f $(SPHINX_BUILD_DIR)/html/"$$f"; then \ 311 $(INSTALL_DATA) $(SPHINX_BUILD_DIR)/html/"$$f" $(DESTDIR)$(jit_htmldir)/"$$f"; \ 312 else \ 313 mkdir $(DESTDIR)$(jit_htmldir)/"$$f"; \ 314 fi; \ 315 done 316 317# (This one is currently failing deep inside pdflatex for me; 318# see https://bugzilla.redhat.com/show_bug.cgi?id=1148845 ) 319jit.sphinx.pdf: $(SPHINX_BUILD_DIR)/latex/libgccjit.pdf 320$(SPHINX_BUILD_DIR)/latex/libgccjit.pdf: 321 $(mkinstalldirs) $(SPHINX_BUILD_DIR) 322 (cd $(srcdir)/jit/docs && \ 323 make latexpdf BUILDDIR=$(PWD)/$(SPHINX_BUILD_DIR) ) 324 325jit.sphinx.install-pdf: $(SPHINX_BUILD_DIR)/latex/libgccjit.pdf 326 @$(NORMAL_INSTALL) 327 test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc" 328 @for p in $(SPHINX_BUILD_DIR)/latex/libgccjit.pdf; do \ 329 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 330 f=$(pdf__strip_dir) \ 331 echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \ 332 $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \ 333 done 334 335jit.srcinfo: 336jit.srcextra: 337 338jit.tags: 339 340jit.man: 341 342jit.srcman: 343 344lang_checks += check-jit 345lang_checks_parallelized += check-jit 346# This number is somewhat arbitrary. Two tests are much slower 347# than all the others (test-combination.c and test-threads.c) so 348# we want them to be placed in different "buckets". 349check_jit_parallelize = 10 350 351# No jit-specific selftests 352selftest-jit: 353 354# 355# Install hooks: 356jit.install-headers: installdirs 357 $(INSTALL_DATA) $(srcdir)/jit/libgccjit.h \ 358 $(DESTDIR)$(includedir)/libgccjit.h 359 $(INSTALL_DATA) $(srcdir)/jit/libgccjit++.h \ 360 $(DESTDIR)$(includedir)/libgccjit++.h 361 362ifneq (,$(findstring mingw,$(target))) 363jit.install-common: installdirs jit.install-headers 364# Install import library 365 $(INSTALL_PROGRAM) $(LIBGCCJIT_IMPORT_LIB) \ 366 $(DESTDIR)$(libdir)/$(LIBGCCJIT_IMPORT_LIB) 367# Install DLL file 368 $(INSTALL_PROGRAM) $(LIBGCCJIT_FILENAME) \ 369 $(DESTDIR)$(bindir)/$(LIBGCCJIT_FILENAME) 370 371else 372ifneq (,$(findstring darwin,$(host))) 373# but only one level for Darwin 374 375jit.install-common: installdirs jit.install-headers 376 $(INSTALL_PROGRAM) $(LIBGCCJIT_FILENAME) \ 377 $(DESTDIR)$(libdir)/$(LIBGCCJIT_FILENAME) 378 ln -sf \ 379 $(LIBGCCJIT_SONAME_SYMLINK)\ 380 $(DESTDIR)$(libdir)/$(LIBGCCJIT_LINKER_NAME_SYMLINK) 381 382else 383jit.install-common: installdirs jit.install-headers 384 $(INSTALL_PROGRAM) $(LIBGCCJIT_FILENAME) \ 385 $(DESTDIR)$(libdir)/$(LIBGCCJIT_FILENAME) 386 ln -sf \ 387 $(LIBGCCJIT_FILENAME) \ 388 $(DESTDIR)$(libdir)/$(LIBGCCJIT_SONAME_SYMLINK) 389 ln -sf \ 390 $(LIBGCCJIT_SONAME_SYMLINK)\ 391 $(DESTDIR)$(libdir)/$(LIBGCCJIT_LINKER_NAME_SYMLINK) 392endif 393endif 394 395jit.install-man: 396 397jit.install-plugin: 398 399jit.uninstall: 400 401# 402# Clean hooks: 403# A lot of the ancillary files are deleted by the main makefile. 404# We just have to delete files specific to us. 405 406jit.mostlyclean: 407 -rm -f $(LIBGCCJIT_FILENAME) $(LIBGCCJIT_SYMLINK) 408 -rm -f $(LIBGCCJIT_LINKER_NAME_SYMLINK) $(FULL_DRIVER_NAME) 409 -rm -f $(LIBGCCJIT_SONAME) 410 -rm -f $(jit_OBJS) 411 412jit.clean: 413 414jit.distclean: 415 416jit.maintainer-clean: 417 418# 419# Stage hooks: 420# The main makefile has already created stage?/jit. 421 422jit.stage1: stage1-start 423 -mv jit/*$(objext) stage1/jit 424jit.stage2: stage2-start 425 -mv jit/*$(objext) stage2/jit 426jit.stage3: stage3-start 427 -mv jit/*$(objext) stage3/jit 428jit.stage4: stage4-start 429 -mv jit/*$(objext) stage4/jit 430jit.stageprofile: stageprofile-start 431 -mv jit/*$(objext) stageprofile/jit 432jit.stagefeedback: stagefeedback-start 433 -mv jit/*$(objext) stagefeedback/jit 434