# # This file is part of the LibreOffice project. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #
# Make sure variables in this Makefile do not conflict with other variables (e.g. from gbuild).
# Set to 1 if you need to debug the plugin).
CLANGDEBUG=
# Compile flags, you may occasionally want to override these: ifeq ($(OS),WNT) # See LLVM's cmake/modules/AddLLVM.cmake and LLVM build's # tools/llvm-config/BuildVariables.inc: # * Ignore "warning C4141: 'inline': used more than once" as emitted upon # "LLVM_ATTRIBUTE_ALWAYS_INLINE inline" in various LLVM include files. # * Ignore "warning C4577: 'noexcept' used with no exception handling mode # specified; termination on exception is not guaranteed. Specify /EHsc".
CLANGCXXFLAGS=/nologo /D_HAS_EXCEPTIONS=0 /wd4141 /wd4577 /EHs-c- /GR- ifeq ($(CLANGDEBUG),)
CLANGCXXFLAGS+=/O2 /Oi else
CLANGCXXFLAGS+=/DEBUG /Od endif else# WNT
CLANGCXXFLAGS=-Wall -Wextra -Wundef -fvisibility-inlines-hidden ifeq ($(CLANGDEBUG),)
CLANGCXXFLAGS+=-O2 else
CLANGCXXFLAGS+=-g -O0 -UNDEBUG endif endif
# Whether to make plugins use one shared ASTRecursiveVisitor (plugins run faster). # By default enabled, disable if you work on an affected plugin (re-generating takes time).
LO_CLANG_SHARED_PLUGINS=1 #TODO: Windows doesn't use LO_CLANG_SHARED_PLUGINS for now, see corresponding TODO comment in # configure.ac: ifeq ($(OS),WNT)
LO_CLANG_SHARED_PLUGINS= endif
# Whether to use precompiled headers for the sources. This is actually controlled # by gb_ENABLE_PCH like everywhere else, but unsetting this disables PCH.
LO_CLANG_USE_PCH=1
# The uninteresting rest.
include $(SRCDIR)/solenv/gbuild/gbuild.mk include $(SRCDIR)/solenv/gbuild/Output.mk
# Clang headers require these.
CLANGDEFS:=$(COMPILER_PLUGINS_CXXFLAGS) # All include locations needed (using -isystem silences various warnings when # including those files): ifneq ($(OS),WNT)
CLANGDEFS:=$(filter-out -isystem/usr/include,$(foreach opt,$(CLANGDEFS),$(patsubst -I%,-isystem%,$(opt)))) endif
# Clang/LLVM libraries are intentionally not linked in, they are usually built as static libraries, which means the resulting # plugin would be big (even though the clang binary already includes it all) and it'd be necessary to explicitly specify # also all the dependency libraries.
CLANGINDIR=$(SRCDIR)/compilerplugins/clang # Cannot use $(WORKDIR), the plugin should survive even 'make clean', otherwise the rebuilt # plugin will cause cache misses with ccache.
CLANGOUTDIR=$(BUILDDIR)/compilerplugins/clang
CLANGOBJDIR=$(CLANGOUTDIR)/obj
ifneq ($(ENABLE_WERROR),) ifeq ($(OS),WNT)
CLANGWERROR := #TODO: /WX else
CLANGWERROR := -Werror # When COMPILER_PLUGINS_CXXFLAGS (obtained via `llvm-config --cxxflags`) contains options like # -Wno-maybe-uninitialized that are targeting GCC (when LLVM was actually built with GCC), and # COMPILER_PLUGINS_CXX (defaulting to CXX) denotes a Clang that does not understand those options, # it fails with -Werror,-Wunknown-warning-option, so we need -Wno-unknown-warning-option (but which # GCC does not understand) at least with -Werror: ifeq ($(COMPILER_PLUGINS_COM_IS_CLANG),TRUE)
CLANGWERROR += -Wno-unknown-warning-option endif endif endif
ifneq ($(LO_CLANG_USE_PCH),) # Reset and enable only if actually supported and enabled.
LO_CLANG_USE_PCH= ifneq ($(gb_ENABLE_PCH),) ifneq ($(OS),WNT) # Currently only Clang PCH is supported (which should usually be the case, as Clang is usually self-built). ifneq ($(findstring clang,$(COMPILER_PLUGINS_CXX)),)
LO_CLANG_USE_PCH=1
LO_CLANG_PCH_FLAGS:=-Xclang -fno-pch-timestamp endif endif endif endif
compilerplugins: compilerplugins-build
ifdef LO_CLANG_SHARED_PLUGINS # The shared source, intentionally put first in the list because it takes the longest to build.
CLANGSRCOUTDIR=$(CLANGOUTDIR)/sharedvisitor/sharedvisitor.cxx
CLANGSRC+=$(CLANGSRCOUTDIR) endif # The list of source files, generated automatically (all files in clang/, but not subdirs).
CLANGSRCINDIR=$(sort $(foreach src,$(wildcard $(CLANGINDIR)/*.cxx), $(notdir $(src))))
CLANGSRC+=$(CLANGSRCINDIR)
# Remember the sources and if they have changed, force plugin relinking.
CLANGSRCCHANGED= \
$(shell mkdir -p $(CLANGOUTDIR) ; \ echo $(CLANGSRC) | sort > $(CLANGOUTDIR)/sources-new.txt; \ if diff $(CLANGOUTDIR)/sources.txt $(CLANGOUTDIR)/sources-new.txt >/dev/null 2>/dev/null; then \ echo 0; \ else \
mv $(CLANGOUTDIR)/sources-new.txt $(CLANGOUTDIR)/sources.txt; \ echo 1; \ fi; \
) ifeq ($(CLANGSRCCHANGED),1)
.PHONY: CLANGFORCE
CLANGFORCE:
$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): CLANGFORCE endif # Make the .so also explicitly depend on the sources list, to force update in case CLANGSRCCHANGED was e.g. during 'make clean'.
$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): $(CLANGOUTDIR)/sources.txt
$(CLANGOUTDIR)/sources.txt:
touch $@
# Clang most probably doesn't maintain binary compatibility, so rebuild when clang changes # (either the binary can change if it's a local build, or config_clang.h will change if configure detects # a new version of a newly installed system clang).
$(CLANGOUTDIR)/clang-timestamp: $(CLANGDIR)/bin/clang$(CLANG_EXE_EXT) $(BUILDDIR)/config_host/config_clang.h
$(QUIET)touch $@
# Flags used internally in analyzer. # Older versions of Clang have a problem to find their own internal headers, so add it. # Also filter out the c++ library, it's not necessary to be specific about it in this case # and it can also cause trouble with finding the proper headers.
CLANGTOOLDEFS = $(filter-out -stdlib=%,$(CLANGDEFS) -I$(CLANGSYSINCLUDE))
CLANGTOOLDEFS += -w ifneq ($(filter MACOSX,$(OS)),)
CLANGTOOLLIBS += -Wl,-rpath,$(CLANGLIBDIR) elseifneq ($(filter-out WNT,$(OS)),) ifneq ($(CLANGDIR),/usr) # Help the generator find Clang shared libs, if Clang is built so and installed in a non-standard prefix.
CLANGTOOLLIBS += -Wl,--rpath,$(CLANGLIBDIR) endif endif
-include $(CLANGOUTDIR)/sharedvisitor/analyzer.d
-include $(CLANGOUTDIR)/sharedvisitor/generator.d # TODO WNT version
# Remember the sources that are shared and if they have changed, force sharedvisitor.cxx generating. # Duplicated from CLANGSRCCHANGED above.
CLANGSRCSHAREDCHANGED= \
$(shell mkdir -p $(CLANGOUTDIR) ; \ echo $(SHARED_SOURCES) | sort > $(CLANGOUTDIR)/sources-shared-new.txt; \ if diff $(CLANGOUTDIR)/sources-shared.txt $(CLANGOUTDIR)/sources-shared-new.txt >/dev/null 2>/dev/null; then \ echo 0; \ else \
mv $(CLANGOUTDIR)/sources-shared-new.txt $(CLANGOUTDIR)/sources-shared.txt; \ echo 1; \ fi; \
) ifeq ($(CLANGSRCSHAREDCHANGED),1)
.PHONY: CLANGFORCE
CLANGFORCE:
$(CLANGOUTDIR)/sharedvisitor/sharedvisitor.cxx: CLANGFORCE endif # Make sharedvisitor.cxx also explicitly depend on the sources list, to force update in case CLANGSRCSHAREDCHANGED was e.g. during 'make clean'.
$(CLANGOUTDIR)/sharedvisitor/sharedvisitor.cxx: $(CLANGOUTDIR)/sources-shared.txt
$(CLANGOUTDIR)/sources-shared.txt:
touch $@ endif
ifneq ($(LO_CLANG_USE_PCH),) # the PCH for plugin sources themselves
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.0Bemerkung:
(vorverarbeitet am 2026-05-04)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.