diff options
-rw-r--r-- | compilerplugins/Makefile-clang.mk | 70 | ||||
-rw-r--r-- | compilerplugins/clang/pluginhandler.cxx | 2 | ||||
-rw-r--r-- | compilerplugins/clang/unusedfieldsremove.cxx | 4 | ||||
-rw-r--r-- | compilerplugins/clang/unusedmethodsremove.cxx | 4 | ||||
-rw-r--r-- | config_host.mk.in | 2 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_class.mk | 8 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_defs.mk | 24 |
8 files changed, 104 insertions, 12 deletions
diff --git a/compilerplugins/Makefile-clang.mk b/compilerplugins/Makefile-clang.mk index 4839fdef2feb..89a798ebd34a 100644 --- a/compilerplugins/Makefile-clang.mk +++ b/compilerplugins/Makefile-clang.mk @@ -10,6 +10,14 @@ CLANG_COMMA :=, +ifeq ($(OS),WNT) +CLANG_DL_EXT = .dll +CLANG_EXE_EXT = .exe +else +CLANG_DL_EXT = .so +CLANG_EXE_EXT = +endif + ifeq ($(COMPILER_PLUGINS_CXX),) CLANGCXX=$(filter-out -m32 -m64 -fsanitize%,$(CXX)) else @@ -18,15 +26,32 @@ endif # Compile flags ('make CLANGCXXFLAGS=-g' if you need to debug the plugin); 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 /O2 /Oi /EHs-c- /GR- +else CLANGCXXFLAGS=-O2 -Wall -Wextra -Wundef -g +endif # The uninteresting rest. # Clang headers require these. -CLANGDEFS=-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fno-rtti +CLANGDEFS=-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +ifneq ($(OS),WNT) +CLANGDEFS += -fno-rtti +endif # All include locations needed (using -isystem silences various warnings when # including those files): +ifeq ($(OS),WNT) +CLANGINCLUDES=-I$(CLANGDIR)/include +else CLANGINCLUDES=$(if $(filter /usr,$(CLANGDIR)),,-isystem $(CLANGDIR)/include) +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 @@ -40,8 +65,13 @@ CLANGOUTDIR=$(BUILDDIR)/compilerplugins/obj QUIET=$(if $(verbose),,@) ifneq ($(ENABLE_WERROR),) +ifeq ($(OS),WNT) +CLANGWERROR := +#TODO: /WX +else CLANGWERROR := -Werror endif +endif compilerplugins: compilerplugins-build @@ -61,14 +91,14 @@ CLANGSRCCHANGED= \ ifeq ($(CLANGSRCCHANGED),1) .PHONY: CLANGFORCE CLANGFORCE: -$(CLANGOUTDIR)/plugin.so: 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.so: $(CLANGOUTDIR)/sources.txt +$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): $(CLANGOUTDIR)/sources.txt $(CLANGOUTDIR)/sources.txt: touch $@ -compilerplugins-build: $(CLANGOUTDIR) $(CLANGOUTDIR)/plugin.so +compilerplugins-build: $(CLANGOUTDIR) $(CLANGOUTDIR)/plugin$(CLANG_DL_EXT) compilerplugins-clean: rm -rf $(CLANGOUTDIR) @@ -78,6 +108,23 @@ $(CLANGOUTDIR): CLANGOBJS= +ifeq ($(OS),WNT) + +define clangbuildsrc +$(3): $(2) $(SRCDIR)/compilerplugins/Makefile-clang.mk $(CLANGOUTDIR)/clang-timestamp + @echo [build CXX] $(subst $(SRCDIR)/,,$(2)) + $(QUIET)$(CLANGCXX) $(CLANGCXXFLAGS) $(CLANGWERROR) $(CLANGDEFS) \ + $(CLANGINCLUDES) /I$(BUILDDIR)/config_host $(2) $(CXXFLAGS_CXX11) /MD \ + /c /Fo: $(3) + +-include $(CLANGOUTDIR)/$(1).d #TODO + +$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): $(3) +$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): CLANGOBJS += $(3) +endef + +else + define clangbuildsrc $(3): $(2) $(SRCDIR)/compilerplugins/Makefile-clang.mk $(CLANGOUTDIR)/clang-timestamp @echo [build CXX] $(subst $(SRCDIR)/,,$(2)) @@ -85,20 +132,27 @@ $(3): $(2) $(SRCDIR)/compilerplugins/Makefile-clang.mk $(CLANGOUTDIR)/clang-time -include $(CLANGOUTDIR)/$(1).d -$(CLANGOUTDIR)/plugin.so: $(3) -$(CLANGOUTDIR)/plugin.so: CLANGOBJS += $(3) +$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): $(3) +$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): CLANGOBJS += $(3) endef +endif + $(foreach src, $(CLANGSRC), $(eval $(call clangbuildsrc,$(src),$(CLANGINDIR)/$(src),$(CLANGOUTDIR)/$(src:.cxx=.o)))) -$(CLANGOUTDIR)/plugin.so: $(CLANGOBJS) +$(CLANGOUTDIR)/plugin$(CLANG_DL_EXT): $(CLANGOBJS) @echo [build LNK] $(subst $(BUILDDIR)/,,$@) +ifeq ($(OS),WNT) + $(QUIET)$(CLANGCXX) /LD $(CLANGOBJS) /Fe: $@ $(CLANGLIBDIR)/clang.lib \ + mincore.lib version.lib /link $(COMPILER_PLUGINS_CXX_LINKFLAGS) +else $(QUIET)$(CLANGCXX) -shared $(CLANGOBJS) -o $@ \ $(if $(filter MACOSX,$(OS)),-Wl$(CLANG_COMMA)-flat_namespace \ -Wl$(CLANG_COMMA)-undefined -Wl$(CLANG_COMMA)suppress) +endif # Clang most probably doesn't maintain binary compatibility, so rebuild when clang changes. -$(CLANGOUTDIR)/clang-timestamp: $(CLANGDIR)/bin/clang +$(CLANGOUTDIR)/clang-timestamp: $(CLANGDIR)/bin/clang$(CLANG_EXE_EXT) $(QUIET)touch $@ # vim: set noet sw=4 ts=4: diff --git a/compilerplugins/clang/pluginhandler.cxx b/compilerplugins/clang/pluginhandler.cxx index c61477594395..5712f02dcc3a 100644 --- a/compilerplugins/clang/pluginhandler.cxx +++ b/compilerplugins/clang/pluginhandler.cxx @@ -96,9 +96,11 @@ void PluginHandler::handleOption( const std::string& option ) ; // ok else { +#if !defined _WIN32 //TODO, S_ISDIR struct stat st; if( stat(( SRCDIR "/" + scope ).c_str(), &st ) != 0 || !S_ISDIR( st.st_mode )) report( DiagnosticsEngine::Fatal, "unknown scope %0 (no such module directory)" ) << scope; +#endif } } else if( option.substr( 0, 14 ) == "warnings-only=" ) diff --git a/compilerplugins/clang/unusedfieldsremove.cxx b/compilerplugins/clang/unusedfieldsremove.cxx index ab2359e430a4..eebc2bcfb51e 100644 --- a/compilerplugins/clang/unusedfieldsremove.cxx +++ b/compilerplugins/clang/unusedfieldsremove.cxx @@ -7,6 +7,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#if !defined _WIN32 //TODO, #include <sys/mman.h> + #include <cassert> #include <string> #include <iostream> @@ -128,4 +130,6 @@ loplugin::Plugin::Registration< UnusedFieldsRemove > X("unusedfieldsremove", fal } +#endif + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/compilerplugins/clang/unusedmethodsremove.cxx b/compilerplugins/clang/unusedmethodsremove.cxx index 09187edfc7c0..5452b51f42a2 100644 --- a/compilerplugins/clang/unusedmethodsremove.cxx +++ b/compilerplugins/clang/unusedmethodsremove.cxx @@ -7,6 +7,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#if !defined _WIN32 //TODO, #include <sys/mman.h> + #include <cassert> #include <string> #include <iostream> @@ -145,4 +147,6 @@ loplugin::Plugin::Registration< UnusedMethodsRemove > X("unusedmethodsremove", f } +#endif + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/config_host.mk.in b/config_host.mk.in index 1903d31c898c..eae6050bc262 100644 --- a/config_host.mk.in +++ b/config_host.mk.in @@ -60,6 +60,7 @@ export CDR_CFLAGS=$(gb_SPACE)@CDR_CFLAGS@ export CDR_LIBS=$(gb_SPACE)@CDR_LIBS@ @x_CFLAGS@ export CFLAGS=@CFLAGS@ export CLANGDIR=@CLANGDIR@ +export CLANGLIBDIR=@CLANGLIBDIR@ export CLUCENE_CFLAGS=$(gb_SPACE)@CLUCENE_CFLAGS@ export CLUCENE_LIBS=$(gb_SPACE)@CLUCENE_LIBS@ export LIBCMIS_CFLAGS=$(gb_SPACE)@LIBCMIS_CFLAGS@ @@ -72,6 +73,7 @@ export COMMONS_LOGGING_VERSION=@COMMONS_LOGGING_VERSION@ export COMPATH=@COMPATH@ export COMPILER_PLUGINS=@COMPILER_PLUGINS@ export COMPILER_PLUGINS_CXX=@COMPILER_PLUGINS_CXX@ +export COMPILER_PLUGINS_CXX_LINKFLAGS=@COMPILER_PLUGINS_CXX_LINKFLAGS@ export COM_IS_CLANG=@COM_IS_CLANG@ export CPPUNIT_CFLAGS=$(gb_SPACE)@CPPUNIT_CFLAGS@ export CPPUNIT_LIBS=$(gb_SPACE)@CPPUNIT_LIBS@ diff --git a/configure.ac b/configure.ac index c0414f8452af..0b184164e43a 100644 --- a/configure.ac +++ b/configure.ac @@ -6450,7 +6450,9 @@ else fi AC_SUBST(COMPILER_PLUGINS) AC_SUBST(COMPILER_PLUGINS_CXX) +AC_SUBST(COMPILER_PLUGINS_CXX_LINKFLAGS) AC_SUBST(CLANGDIR) +AC_SUBST(CLANGLIBDIR) # Plugin to help linker. # Add something like LD_PLUGIN=/usr/lib64/LLVMgold.so to your autogen.input. diff --git a/solenv/gbuild/platform/com_MSC_class.mk b/solenv/gbuild/platform/com_MSC_class.mk index 79107f926760..660ba83d73ef 100644 --- a/solenv/gbuild/platform/com_MSC_class.mk +++ b/solenv/gbuild/platform/com_MSC_class.mk @@ -49,16 +49,18 @@ $(call gb_Helper_abbreviate_dirs,\ $(if $(EXTERNAL_CODE), \ $(if $(filter -clr,$(2)),,$(if $(COM_IS_CLANG),-Wno-undef)), \ $(gb_DEFS_INTERNAL)) \ - $(if $(WARNINGS_NOT_ERRORS),,$(gb_CFLAGS_WERROR)) \ + $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \ + $(if $(filter -clr,$(2)),,$(if $(5),$(gb_COMPILER_PLUGINS))) \ + $(if $(COMPILER_TEST),-fsyntax-only -ferror-limit=0 -Xclang -verify) \ -Fd$(PDBFILE) \ $(PCHFLAGS) \ - $(gb_COMPILERDEPFLAGS) \ + $(if $(COMPILER_TEST),,$(gb_COMPILERDEPFLAGS)) \ -I$(dir $(3)) \ $(INCLUDE) \ $(if $(filter YES,$(CXXOBJECT_X64)), -U_X86_ -D_AMD64_,) \ -c $(3) \ -Fo$(1)) $(if $(filter $(true),$(gb_SYMBOL)),/link /DEBUG:FASTLINK) \ - $(call gb_create_deps,$(4),$(1),$(3)) + $(if $(COMPILER_TEST),,$(call gb_create_deps,$(4),$(1),$(3))) endef # PrecompiledHeader class diff --git a/solenv/gbuild/platform/com_MSC_defs.mk b/solenv/gbuild/platform/com_MSC_defs.mk index 9aa1435a5a94..dd3e31952ed8 100644 --- a/solenv/gbuild/platform/com_MSC_defs.mk +++ b/solenv/gbuild/platform/com_MSC_defs.mk @@ -224,7 +224,7 @@ gb_PCHWARNINGS = \ gb_STDLIBS := \ advapi32.lib \ -gb_CFLAGS_WERROR := $(if $(ENABLE_WERROR),-WX) +gb_CFLAGS_WERROR = $(if $(ENABLE_WERROR),-WX) # there does not seem to be a way to force C++03 with MSVC gb_CXX03FLAGS := @@ -301,6 +301,28 @@ gb_CXXFLAGS += \ endif +ifeq ($(COM_IS_CLANG),TRUE) +gb_COMPILER_TEST_FLAGS := -Xclang -plugin-arg-loplugin -Xclang --unit-test-mode +ifeq ($(COMPILER_PLUGIN_TOOL),) +gb_COMPILER_PLUGINS := -Xclang -load -Xclang $(BUILDDIR)/compilerplugins/obj/plugin.dll -Xclang -add-plugin -Xclang loplugin +ifneq ($(COMPILER_PLUGIN_WARNINGS_ONLY),) +gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang \ + --warnings-only='$(COMPILER_PLUGIN_WARNINGS_ONLY)' +endif +else +gb_COMPILER_PLUGINS := -Xclang -load -Xclang $(BUILDDIR)/compilerplugins/obj/plugin.dll -Xclang -plugin -Xclang loplugin $(foreach plugin,$(COMPILER_PLUGIN_TOOL), -Xclang -plugin-arg-loplugin -Xclang $(plugin)) +ifneq ($(UPDATE_FILES),) +gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang --scope=$(UPDATE_FILES) +endif +endif +gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS := \ + -Xclang -plugin-arg-loplugin -Xclang --warnings-as-errors +else +gb_COMPILER_TEST_FLAGS := +gb_COMPILER_PLUGINS := +gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS := +endif + # Helper class ifeq ($(GNUMAKE_WIN_NATIVE),TRUE) |