From 2cda677d06c43b9405e42cc6cc96589941b1e210 Mon Sep 17 00:00:00 2001 From: Pablo Sanabria Date: Sat, 25 Mar 2017 16:31:22 -0300 Subject: [PATCH 1/2] Fix CMake Build process for MinGW and MSYS2 This fix includes some fixes for config.h.win32 that was generating some compiling errors on MinGW64 and also fix CMakeLists.txt in order to give better support to MinGW and MSYS2 --- CMakeLists.txt | 15 +++++++++++++++ config.h.win32 | 28 ++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ae09504b9..4cd9e2ed67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,21 @@ if(MSVC) file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/include/config.h.win32 ${CMAKE_CURRENT_BINARY_DIR}/include/config.h) file(COPY ./json_config.h.win32 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h.win32 ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h) +elseif(MINGW) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -D_GNU_SOURCE=1") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -D_GNU_SOURCE=1") + if (MSYS OR CMAKE_GENERATOR STREQUAL "Unix Makefiles") + execute_process(COMMAND echo ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + execute_process(COMMAND sh autogen.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + execute_process(COMMAND sh ./configure WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + file(COPY ./config.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) + file(COPY ./json_config.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) + else() + file(COPY ./config.h.win32 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) + file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/include/config.h.win32 ${CMAKE_CURRENT_BINARY_DIR}/include/config.h) + file(COPY ./json_config.h.win32 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) + file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h.win32 ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h) + endif() elseif(UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") diff --git a/config.h.win32 b/config.h.win32 index e721aaf7d7..2a70a9cc0d 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -8,24 +8,24 @@ /* Define to 1 if you have the declaration of `INFINITY', and to 0 if you don't. */ -#if defined(_MSC_VER) && _MSC_VER >= 1800 +#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__) #define HAVE_DECL_INFINITY 1 #endif /* Define to 1 if you have the declaration of `isinf', and to 0 if you don't. */ -#if defined(_MSC_VER) && _MSC_VER >= 1800 +#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__) #define HAVE_DECL_ISINF 1 #endif /* Define to 1 if you have the declaration of `isnan', and to 0 if you don't. */ -#if defined(_MSC_VER) && _MSC_VER >= 1800 +#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__) #define HAVE_DECL_ISNAN 1 #endif /* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */ -#if defined(_MSC_VER) && _MSC_VER >= 1800 +#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__) #define HAVE_DECL_NAN 1 #endif @@ -76,7 +76,11 @@ #define HAVE_SETLOCALE 1 /* Define to 1 if you have the `snprintf' function. */ +#if defined(__MINGW32__) +#define HAVE_SNPRINTF 1 +#else #undef HAVE_SNPRINTF +#endif /* Define to 1 if you have the header file. */ #define HAVE_STDARG_H 1 @@ -103,7 +107,11 @@ #define HAVE_STRING_H 1 /* Define to 1 if you have the `strncasecmp' function. */ +#if defined(__MINGW32__) +#define HAVE_STRNCASECMP 1 +#else #undef HAVE_STRNCASECMP +#endif /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H @@ -112,7 +120,11 @@ #define HAVE_SYS_CDEFS_H 1 /* Define to 1 if you have the header file. */ +#if defined(__MINGW32__) +#define HAVE_SYS_PARAM_H 1 +#else #undef HAVE_SYS_PARAM_H +#endif /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 @@ -121,10 +133,18 @@ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ +#if defined(__MINGW32__) +#define HAVE_UNISTD_H 1 +#else #undef HAVE_UNISTD_H +#endif /* Define to 1 if you have the `vasprintf' function. */ +#if defined(__MINGW32__) +#define HAVE_VASPRINTF 1 +#else #undef HAVE_VASPRINTF +#endif /* Define to 1 if you have the `vprintf' function. */ #define HAVE_VPRINTF 1 From d3f813a14e603dc53d1fac050ec07eda870fe081 Mon Sep 17 00:00:00 2001 From: Pablo Sanabria Date: Sat, 25 Mar 2017 19:18:29 -0300 Subject: [PATCH 2/2] Fixed linkhash.c for MinGW Added #ifdef conditions for MinGW because this compiler doesn't define gcc atomic builtins, so __sync_val_compare_and_swap was not found neither any of any __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* definition --- linkhash.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/linkhash.c b/linkhash.c index fd52fe34b2..830caa8357 100644 --- a/linkhash.c +++ b/linkhash.c @@ -23,7 +23,7 @@ # include /* attempt to define endianness */ #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(__MINGW32__) # define WIN32_LEAN_AND_MEAN # include /* Get InterlockedCompareExchange */ #endif @@ -452,7 +452,7 @@ static unsigned long lh_perllike_str_hash(const void *k) static unsigned long lh_char_hash(const void *k) { -#if defined _MSC_VER +#if defined _MSC_VER || defined __MINGW32__ #define RANDOM_SEED_TYPE LONG #else #define RANDOM_SEED_TYPE int @@ -474,7 +474,7 @@ static unsigned long lh_char_hash(const void *k) #endif #if defined USE_SYNC_COMPARE_AND_SWAP (void)__sync_val_compare_and_swap(&random_seed, -1, seed); -#elif defined _MSC_VER +#elif defined _MSC_VER || defined __MINGW32__ InterlockedCompareExchange(&random_seed, seed, -1); #else #warning "racy random seed initializtion if used by multiple threads"