summaryrefslogtreecommitdiff
path: root/compilerplugins/Makefile-clang.mk
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/Makefile-clang.mk')
-rw-r--r--compilerplugins/Makefile-clang.mk70
1 files changed, 62 insertions, 8 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: