summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compilerplugins/Makefile-clang.mk70
-rw-r--r--compilerplugins/clang/pluginhandler.cxx2
-rw-r--r--compilerplugins/clang/unusedfieldsremove.cxx4
-rw-r--r--compilerplugins/clang/unusedmethodsremove.cxx4
-rw-r--r--config_host.mk.in2
-rw-r--r--configure.ac2
-rw-r--r--solenv/gbuild/platform/com_MSC_class.mk8
-rw-r--r--solenv/gbuild/platform/com_MSC_defs.mk24
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)