Skip to content

Commit 9cc7c34

Browse files
authored
Merge pull request #4 from jimklimov/fix-mingw-build-only
Fix mingw build (only)
2 parents 0f10ae4 + 103b920 commit 9cc7c34

File tree

5 files changed

+365
-11
lines changed

5 files changed

+365
-11
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Makefile.in
3535
src/modbus-config.h
3636
src/modbus-version.h
3737
src/win32/modbus.dll.manifest
38+
src/stamp-h3
3839
tests/unit-test.h
3940

4041
# mkdocs

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ You will only need to install automake, autoconf, libtool and a C compiler (gcc
2828
or clang) to compile the library and asciidoc and xmlto to generate the
2929
documentation (optional).
3030

31-
To install, just run the usual dance, `./configure && make install`. Run
32-
`./autogen.sh` first to generate the `configure` script if required.
31+
To install, just run the usual dance, `./configure && make install`.
32+
Run `./autogen.sh` first to generate the `configure` script if required.
33+
You may be required to use `gmake` on platforms where default `make` is
34+
different (BSD make, Sun make, etc.)
3335

3436
You can change installation directory with prefix option, eg. `./configure
3537
--prefix=/usr/local/`. You have to check that the installation library path is

configure.ac

Lines changed: 131 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ AC_INIT([libmodbus],
3030
AC_CONFIG_SRCDIR([src/modbus.c])
3131
AC_CONFIG_AUX_DIR([build-aux])
3232
AM_INIT_AUTOMAKE([check-news foreign 1.11 silent-rules tar-pax subdir-objects])
33+
AM_PROG_CC_C_O
34+
AC_PROG_CPP
3335
AC_PROG_CC
3436
AC_USE_SYSTEM_EXTENSIONS
3537
AC_SYS_LARGEFILE
@@ -89,7 +91,6 @@ AC_CHECK_HEADERS([ \
8991
linux/serial.h \
9092
netdb.h \
9193
netinet/in.h \
92-
netinet/ip.h \
9394
netinet/tcp.h \
9495
sys/ioctl.h \
9596
sys/params.h \
@@ -101,6 +102,17 @@ AC_CHECK_HEADERS([ \
101102
unistd.h \
102103
])
103104

105+
dnl On some platforms like FreeBSD and OpenIndiana (illumos) the
106+
dnl netinet/ip.h requires netinet/in.h explicitly included first:
107+
AC_CHECK_HEADERS([ \
108+
netinet/ip.h \
109+
], [], [], [
110+
AC_INCLUDES_DEFAULT
111+
#if HAVE_NETINET_IN_H
112+
# include <netinet/in.h>
113+
#endif
114+
])
115+
104116
# Cygwin defines IPTOS_LOWDELAY but can't handle that flag so it's necessary to
105117
# workaround that problem and Cygwin doesn't define MSG_DONTWAIT.
106118
AC_CHECK_DECLS([__CYGWIN__])
@@ -109,7 +121,7 @@ AC_CHECK_DECLS([__CYGWIN__])
109121
AC_SEARCH_LIBS(accept, network socket)
110122

111123
# Checks for library functions.
112-
AC_CHECK_FUNCS([accept4 gai_strerror getaddrinfo gettimeofday inet_pton inet_ntop select socket strerror strlcpy])
124+
AC_CHECK_FUNCS([accept4 gai_strerror getaddrinfo gettimeofday select socket strerror strlcpy])
113125

114126
# Required for MinGW with GCC v4.8.1 on Win7
115127
AC_DEFINE(WINVER, 0x0501, _)
@@ -129,12 +141,19 @@ AC_TYPE_UINT32_T
129141
AC_TYPE_UINT8_T
130142

131143
if test "$os_cygwin" = "false"; then
144+
AC_CHECK_HEADERS([windows.h], HAVE_WINDOWS_H=yes)
145+
132146
# Required for getaddrinfo (TCP IP - IPv6)
133147
AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes)
134148
if test "x$HAVE_WINSOCK2_H" = "xyes"; then
135149
LIBS="$LIBS -lws2_32"
136-
AC_SUBST(LIBS)
150+
AC_SUBST(LIBS)
137151
fi
152+
153+
dnl Can bring inet_ntop()/inet_pton()... or not, depending on distro
154+
dnl (e.g. mingw "native" with MSYS2 or cross-built from Linux); that
155+
dnl is further checked below:
156+
AC_CHECK_HEADERS([ws2tcpip.h], HAVE_WS2TCPIP_H=yes)
138157
fi
139158

140159
if test "$os_sunos" = "true"; then
@@ -153,7 +172,99 @@ WARNING_CFLAGS="-Wall \
153172
-Wsign-compare -Wchar-subscripts \
154173
-Wstrict-prototypes -Wshadow \
155174
-Wformat-security"
156-
AC_SUBST([WARNING_CFLAGS])
175+
176+
dnl FIXME: define more thoroughly if C++ code ever appears here
177+
WARNING_CXXFLAGS="$WARNING_CFLAGS"
178+
179+
dnl Adapted from NUT v2.8.2 configure.ac :
180+
myCFLAGS="$CFLAGS"
181+
AS_IF([test "${GCC}" = "yes"],
182+
[CFLAGS="$myCFLAGS -Werror -Werror=implicit-function-declaration"],
183+
[dnl # Don't know what to complain about for unknown compilers
184+
dnl # FIXME: We presume here they have at least a "-Werror" option
185+
CFLAGS="$myCFLAGS -Werror"
186+
])
187+
188+
AC_CACHE_CHECK([for inet_ntop() with IPv4 and IPv6 support],
189+
[ac_cv_func_inet_ntop],
190+
[AC_LANG_PUSH([C])
191+
AC_LINK_IFELSE(
192+
[AC_LANG_PROGRAM([[
193+
#if HAVE_WINDOWS_H
194+
# undef inline
195+
# ifndef WIN32_LEAN_AND_MEAN
196+
# define WIN32_LEAN_AND_MEAN
197+
# endif
198+
# include <windows.h>
199+
# if HAVE_WINSOCK2_H
200+
# include <winsock2.h>
201+
# endif
202+
# if HAVE_WS2TCPIP_H
203+
# include <ws2tcpip.h>
204+
# endif
205+
#else
206+
# include <arpa/inet.h>
207+
#endif
208+
#include <stdio.h>
209+
]],
210+
[[/* const char* inet_ntop(int af, const void* src, char* dst, size_t cnt); */
211+
char buf[128];
212+
printf("%s", inet_ntop(AF_INET, "1.2.3.4", buf, 10));
213+
printf("%s", inet_ntop(AF_INET6, "::1", buf, 10))
214+
/* autoconf adds ";return 0;" */
215+
]])],
216+
[ac_cv_func_inet_ntop=yes], [ac_cv_func_inet_ntop=no]
217+
)
218+
AC_LANG_POP([C])
219+
])
220+
AS_IF([test x"${ac_cv_func_inet_ntop}" = xyes],
221+
[AC_DEFINE([HAVE_INET_NTOP], 1, [defined if system has the inet_ntop() method])],
222+
[AC_MSG_WARN([Required C library routine inet_ntop() not found])
223+
AS_IF([test "${os_win32}" = "true"], [AC_MSG_WARN([Windows antivirus might block this test])])
224+
]
225+
)
226+
227+
AC_CACHE_CHECK([for inet_pton() with IPv4 and IPv6 support],
228+
[ac_cv_func_inet_pton],
229+
[AC_LANG_PUSH([C])
230+
AC_LINK_IFELSE(
231+
[AC_LANG_PROGRAM([[
232+
#if HAVE_WINDOWS_H
233+
# undef inline
234+
# ifndef WIN32_LEAN_AND_MEAN
235+
# define WIN32_LEAN_AND_MEAN
236+
# endif
237+
# include <windows.h>
238+
# if HAVE_WINSOCK2_H
239+
# include <winsock2.h>
240+
# endif
241+
# if HAVE_WS2TCPIP_H
242+
# include <ws2tcpip.h>
243+
# endif
244+
#else
245+
# include <arpa/inet.h>
246+
#endif
247+
#include <stdio.h>
248+
]],
249+
[[/* int inet_pton(int af, const char *src, char *dst); */
250+
struct in_addr ipv4;
251+
struct in6_addr ipv6;
252+
printf("%i ", inet_pton(AF_INET, "1.2.3.4", &ipv4));
253+
printf("%i ", inet_pton(AF_INET6, "::1", &ipv6))
254+
/* autoconf adds ";return 0;" */
255+
]])],
256+
[ac_cv_func_inet_pton=yes], [ac_cv_func_inet_pton=no]
257+
)
258+
AC_LANG_POP([C])
259+
])
260+
AS_IF([test x"${ac_cv_func_inet_pton}" = xyes],
261+
[AC_DEFINE([HAVE_INET_PTON], 1, [defined if system has the inet_pton() method])],
262+
[AC_MSG_WARN([Required C library routine inet_pton() not found])
263+
AS_IF([test "${os_win32}" = "true"], [AC_MSG_WARN([Windows antivirus might block this test])])
264+
]
265+
)
266+
CFLAGS="$myCFLAGS"
267+
157268

158269
# Check for libusb-1.0
159270
AC_ARG_WITH([libusb],
@@ -221,6 +332,22 @@ AS_IF([test "x$enable_debug" = "xyes"], [
221332
CXXFLAGS="-O2"
222333
])
223334

335+
dnl NOTE: Do not pass these among C(XX)FLAGS to the configure script itself,
336+
dnl they can break common tests unexpectedly. Variants below should work for
337+
dnl GCC and CLANG, and other compilers that emulate them in terms of CLI API.
338+
AC_ARG_ENABLE([Werror],
339+
[AS_HELP_STRING([--enable-Werror],
340+
[Enable compilation failure on warnings (default is no)])],
341+
[enable_Werror=$enableval],
342+
[enable_Werror=no])
343+
AS_IF([test "x$enable_Werror" = "xyes"], [
344+
WARNING_CFLAGS="$WARNING_CFLAGS -Werror"
345+
WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Werror"
346+
])
347+
348+
AC_SUBST([WARNING_CFLAGS])
349+
AC_SUBST([WARNING_CXXFLAGS])
350+
224351
AC_OUTPUT
225352
AC_MSG_RESULT([
226353
$PACKAGE $VERSION

0 commit comments

Comments
 (0)