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?