Skip to content

DATADIR macro clash when build using MingGW64

When I build Wget2 using MinGW64 and embedding other library (Libmicrohttpd), DATADIR macro from Wget2 clash with MinGW64 Header. To reproduce, on Ubuntu 16.04 64 bit with MinGW64:

Install Libmicrohttpd from source

$ export PREFIX=x86_64-w64-mingw32                                                                                                                                                                
$ export CC=$PREFIX-gcc                                                                                                                                                                           
$ export CPP=$PREFIX-cpp                                                                                                                                                                          
$ export RANLIB=$PREFIX-ranlib                                                                                                                                                                    
$ export PATH="/usr/$PREFIX/bin:$PATH"                                                                                                                                                            
$ export CFLAGS="-O2 -Wall -Wno-format -lpthread"                                                                                                                                                 
$ wget http://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.55.tar.gz                                                                                                                           
$ tar zxf libmicrohttpd-0.9.55.tar.gz && cd libmicrohttpd-0.9.55/                                                                                                                                 
$ ./configure --build=x86_64-pc-linux-gnu --host=$PREFIX --enable-shared --enable-static --prefix=/usr/$PREFIX                                                                                    
$ make clean                                                                                                                                                                                      
$ make -j$(nproc)                                                                                                                                                                                 
$ sudo make install

Clone my branch which utilize Libmicrohttpd as Wget2 HTTP server test suite:
https://gitlab.com/gnuwget/wget2/tree/tmp-use-mhd
Build Wget2:

$ ./bootstrap                                                                                                                                                                                     
$ export CXX=$PREFIX-g++                                                                                                                                                                          
$ export CFLAGS="-O2 -Wall -Wno-format --save-temps"                                                                                                                                                           
$ export WINEPATH="/usr/$PREFIX/bin;/usr/$PREFIX/lib;$PWD/libwget/.libs"                                                                                                                          
$ ./configure --build=x86_64-pc-linux-gnu --host=$PREFIX --enable-shared --enable-static --disable-silent-rules                                                                                                          
$ make clean                                                                                                                                                                                      
$ make -j$(nproc)                                                                                                                                                                                 
$ make check -j$(nproc) LOG_COMPILER=wine                   

I get this error messages:

Making all in tests                                                                                                                                                                               
make[2]: Entering directory '/home/didik/wget2/tests'                                                                                                                                             
/bin/bash ../libtool  --tag=CC   --mode=compile x86_64-w64-mingw32-gcc -DHAVE_CONFIG_H -DDATADIR=\"/home/didik/wget2/data\" -DSRCDIR=\"/home/didik/wget2/tests\" -DEXEEXT=\".exe\" -I. -I..  -I. -I../include/wget -I../lib -I../lib -fvisibility=hidden -DBUILDING_LIBWGET -DWGETVER_FILE=\"../include/wget/wgetver.h\"   -O2 -Wall -Wno-format --save-temps -Wno-attributes -fno-PIC -Wall -Wextra -Wformat=2 -fdiagnostics-color=always -Wno-format -I/usr/x86_64-w64-mingw32/include -I/usr/x86_64-w64-mingw32/include -DNDEBUG -O2 -Wall -Wno-format --save-temps -Wno-attributes -fno-PIC -MT libtest_la-libtest.lo -MD -MP -MF .deps/libtest_la-libtest.Tpo -c -o libtest_la-libtest.lo `test -f 'libtest.c' || echo './'`libtest.c                                                              
libtool: compile:  x86_64-w64-mingw32-gcc -DHAVE_CONFIG_H -DDATADIR=\"/home/didik/wget2/data\" -DSRCDIR=\"/home/didik/wget2/tests\" -DEXEEXT=\".exe\" -I. -I.. -I. -I../include/wget -I../lib -I../lib -fvisibility=hidden -DBUILDING_LIBWGET -DWGETVER_FILE=\"../include/wget/wgetver.h\" -O2 -Wall -Wno-format --save-temps -Wno-attributes -fno-PIC -Wall -Wextra -Wformat=2 -fdiagnostics-color=always -Wno-format -I/usr/x86_64-w64-mingw32/include -I/usr/x86_64-w64-mingw32/include -DNDEBUG -O2 -Wall -Wno-format --save-temps -Wno-attributes -fno-PIC -MT libtest_la-libtest.lo -MD -MP -MF .deps/libtest_la-libtest.Tpo -c libtest.c  -DDLL_EXPORT -DPIC -o .libs/libtest_la-libtest.o                                                                                                       
In file included from /usr/share/mingw-w64/include/objbase.h:66:0,                                                                                                                                
                 from /usr/share/mingw-w64/include/ole2.h:17,                                                                                                                                     
                 from /usr/share/mingw-w64/include/wtypes.h:12,                                                                                                                                   
                 from /usr/share/mingw-w64/include/winscard.h:10,                                                                                                                                 
                 from /usr/share/mingw-w64/include/windows.h:97,                                                                                                                                  
                 from /usr/share/mingw-w64/include/winsock2.h:23,                                                                                                                                 
                 from /usr/share/mingw-w64/include/ws2tcpip.h:17,                                                                                                                                 
                 from /usr/x86_64-w64-mingw32/include/microhttpd.h:108,                                                                                                                           
                 from libtest.c:48:                                                                                                                                                               
/usr/share/mingw-w64/include/objidl.h:12275:2: error: expected identifier or '(' before string constant                                                                                           
 } DATADIR;                  

This lead me to /usr/share/mingw-64/include/objidl.h:

line  | contents                                                                                                                                                                                  
------|------------------------------------                                                                                                                                                       
12271 | typedef IDataObject *LPDATAOBJECT;                                                                                                                                                        
12272 | typedef enum tagDATADIR {                                                                                                                                                                 
12273 |     DATADIR_GET = 1,                                                                                                                                                                      
12274 |     DATADIR_SET = 2                                                                                                                                                                       
12275 | } DATADIR;        

Based on discussion with Evgeny Grin, this is caused of Wget2 DATADIR macro with MinGW64 header.
I propose to change the DATADIR macro on Wget2 with other names like MYDATADIR. When I tried using other name, my build then successfully run. Is this appropriate solution?