patch 8.2.5087: cannot build with clang on MS-Windows v8.2.5087
authorYegappan Lakshmanan <yegappan@yahoo.com>
Tue, 14 Jun 2022 11:30:25 +0000 (12:30 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 14 Jun 2022 11:30:25 +0000 (12:30 +0100)
Problem:    Cannot build with clang on MS-Windows.
Solution:   Add support for building with clang. (Yegappan Lakshmanan,
            closes #10557)

src/GvimExt/Make_ming.mak
src/INSTALLpc.txt
src/Make_cyg_ming.mak
src/version.c

index 8d1714281765e8858087a4df88cc36b8b8cf03fb..5cde1847f53e60e3392e597820e9f0616b4603a2 100644 (file)
@@ -53,7 +53,9 @@ WINDRES := $(CROSS_COMPILE)windres
 WINDRES_FLAGS =
 LIBS :=  -luuid -lgdi32
 RES  := gvimext.res
+ifeq ($(findstring clang++,$(CXX)),)
 DEFFILE = gvimext_ming.def
+endif
 OBJ  := gvimext.o
 
 DLL  := gvimext.dll
index 51b315b234c5070276f30c7c03545e04bd762b3d..1c50dd183ce026080cc665f0b3ab8ecee118eab9 100644 (file)
@@ -282,6 +282,29 @@ This command is in msys32.bat.  Or for the 64 bit compiler use msys64.bat:
 If you have msys64 in another location you will need to adjust the paths for
 that.
 
+2.5. Build Vim with Clang
+
+The following package group is required for building Vim with Clang:
+
+* mingw-w64-clang-x86_64-clang
+
+Use the following command to install it:
+
+    $ pacman -S mingw-w64-clang-x86_64-clang
+
+Go to the source directory of Vim, then execute the make command.  E.g.:
+
+    CC=clang
+    CXX=clang++
+    make -f Make_ming.mak
+    make -f Make_ming.mak GUI=no
+    make -f Make_ming.mak GUI=yes
+
+To build Vim with the address sanitizer (ASAN), execute the following command:
+
+    CC=clang
+    CXX=clang++
+    make -f Make_ming.mak DEBUG=yes ASAN=yes
 
 3. MinGW
 ========
index a2d8f3b1e58ea62c9b1e4ede1a505959c98e9444..61df9a74615d94b5e1cc2e0f406685134d3830f7 100644 (file)
@@ -217,8 +217,12 @@ MKDIR = mkdir
 DIRSLASH = \\
  endif
 endif
+ifeq ($(CC),)
 CC := $(CROSS_COMPILE)gcc
+endif
+ifeq ($(CXX),)
 CXX := $(CROSS_COMPILE)g++
+endif
 ifeq ($(UNDER_CYGWIN),yes)
 WINDRES := $(CROSS_COMPILE)windres
 else
@@ -520,6 +524,8 @@ endif
 ###########################################################################
 
 CFLAGS = -I. -Iproto $(DEFINES) -pipe -march=$(ARCH) -Wall
+# To get additional compiler warnings
+#CFLAGS += -Wextra -pedantic
 CXXFLAGS = -std=gnu++11
 # This used to have --preprocessor, but it's no longer supported
 WINDRES_FLAGS =
@@ -722,7 +728,11 @@ else
 CFLAGS += -Os
  else ifeq ($(OPTIMIZE), MAXSPEED)
 CFLAGS += -O3
-CFLAGS += -fomit-frame-pointer -freg-struct-return
+CFLAGS += -fomit-frame-pointer
+  ifeq ($(findstring clang,$(CC)),)
+# Only GCC supports the "reg-struct-return" option. Clang doesn't support this.
+CFLAGS += -freg-struct-return
+  endif
  else  # SPEED
 CFLAGS += -O2
  endif
@@ -734,6 +744,17 @@ CFLAGS += --coverage
 LFLAGS += --coverage
 endif
 
+# If the ASAN=yes argument is supplied, then compile Vim with the address
+# sanitizer (asan).  Only supported by MingW64 clang compiler.
+# May make Vim twice as slow.  Errors are reported on stderr.
+# More at: https://code.google.com/p/address-sanitizer/
+# Useful environment variable:
+#     set ASAN_OPTIONS=print_stacktrace=1 log_path=asan
+ifeq ($(ASAN),yes)
+#CFLAGS += -g -O0  -fsanitize-recover=all -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer
+CFLAGS += -g -O0  -fsanitize-recover=all -fsanitize=address -fno-omit-frame-pointer
+endif
+
 LIB = -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomdlg32 -lcomctl32 -lnetapi32 -lversion
 GUIOBJ =  $(OUTDIR)/gui.o $(OUTDIR)/gui_w32.o $(OUTDIR)/gui_beval.o
 CUIOBJ = $(OUTDIR)/iscygpty.o
@@ -1076,6 +1097,13 @@ ifeq (yes, $(MAP))
 LFLAGS += -Wl,-Map=$(TARGET).map
 endif
 
+# The default stack size on Windows is 2 MB.  With the default stack size, the
+# following tests fail with the clang address sanitizer:
+#   Test_listdict_compare, Test_listdict_compare_complex, Test_deep_recursion,
+#   Test_map_error, Test_recursive_define, Test_recursive_addstate
+# To increase the stack size to 16MB, uncomment the following line:
+#LFLAGS += -Wl,-stack -Wl,0x1000000
+
 all: $(MAIN_TARGET) vimrun.exe xxd/xxd.exe tee/tee.exe install.exe uninstall.exe GvimExt/gvimext.dll
 
 vimrun.exe: vimrun.c
index dd3a8a7957b7dcc47352b0fb4d218bca310bab8d..47b5382feac412e5d7653114b40ad40d8e106f2d 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    5087,
 /**/
     5086,
 /**/