preparation for clang build support on Windows
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 22 Jan 2017 18:40:04 +0000 (20:40 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 22 Jan 2017 18:40:33 +0000 (20:40 +0200)
12 files changed:
Makefile.inc.w32 [new file with mode: 0644]
include/nms_agent.h
include/nms_common.h
include/nms_util.h
src/Makefile.w32 [new file with mode: 0644]
src/libexpat/Makefile.w32 [new file with mode: 0644]
src/libexpat/libexpat/Makefile.w32 [new file with mode: 0644]
src/libnetxms/Makefile.w32 [new file with mode: 0644]
src/libnetxms/StackWalker.cpp
src/libnetxms/dload.cpp
src/libnetxms/strptime.c
src/libnetxms/tools.cpp

diff --git a/Makefile.inc.w32 b/Makefile.inc.w32
new file mode 100644 (file)
index 0000000..d516f1e
--- /dev/null
@@ -0,0 +1,89 @@
+# Common settings for Win32 builds
+
+CC=clang
+CXX=clang++
+LD=lld-link
+MAKE=make
+
+# Source base path
+BASE_PATH := $(dir $(lastword $(MAKEFILE_LIST)))
+
+# Architecture
+ifndef ARCH
+       ARCH = x64
+endif
+ifeq (${ARCH},x64)
+       WINDDK_ARCH = amd64
+       WINSDK_LIB = Lib\x64
+       WINSDK_BIN = Bin\x64
+endif
+ifeq ({$ARCH},x86)
+       WINDDK_ARCH = i386
+       WINSDK_LIB = Lib
+       WINSDK_BIN = Bin
+endif
+
+# SDK locations
+-include ${BASE_PATH}winsdk.inc
+
+ifndef WINSDK_BASE
+       WINSDK_BASE := C:\SDK\Windows 7 SDK
+endif
+ifndef WINDDK_BASE
+       WINDDK_BASE := C:\SDK\WinDDK
+endif
+ifndef OPENSSL_BASE
+       OPENSSL_BASE := C:\SDK\OpenSSL
+endif
+
+export Path := ${WINSDK_BASE}\${WINSDK_BIN};$(Path)
+
+# Common C/C++ compiler flags
+CPPFLAGS += -fms-compatibility -Wno-microsoft-enum-value -Wno-comment -Wno-microsoft-anon-tag -Wno-nonportable-include-path \
+       -Wno-ignored-attributes -Wno-int-to-void-pointer-cast -Wno-unused-value -Wno-inconsistent-dllimport -Wno-invalid-token-paste \
+       -Wno-reserved-user-defined-literal -Wno-expansion-to-defined \
+       -I${BASE_PATH}include -I "${WINSDK_BASE}\include" -I "${WINDDK_BASE}\inc\crt" \
+       -I "${OPENSSL_BASE}\${ARCH}\include" \
+       -D_MT -DUNICODE
+CXXFLAGS += -fno-cxx-exceptions
+       
+# Common linker flags
+ifeq (${TYPE},dll)
+       IMPLIB := $(TARGET:.dll=.lib)
+       LDFLAGS += -dll -implib:${IMPLIB}
+endif
+MANIFEST := $(TARGET).intermediate.manifest
+LDFLAGS += -subsystem:windows -machine:${ARCH} -manifestfile:${MANIFEST} -libpath:"${OPENSSL_BASE}\${ARCH}\lib" -libpath:"${WINDDK_BASE}\lib\wnet\${WINDDK_ARCH}" -libpath:"${WINSDK_BASE}\${WINSDK_LIB}"
+
+# Common libraries
+LIBS += ssleay32.lib libeay32.lib uuid.lib kernel32.lib user32.lib advapi32.lib shell32.lib msvcrt.lib 
+
+# Prepare list of object files 
+__sources = $(SOURCES:.c=.obj)
+OBJ = $(__sources:.cpp=.obj)
+
+all: subdirs ${GENERATED} ${TARGET}
+
+${TARGET}: ${OBJ}
+       ${LD} ${LDFLAGS} /out:${TARGET} ${OBJ} ${LIBS}
+       rm -f ${MANIFEST}
+
+%.obj: %.c
+       ${CC} ${CPPFLAGS} ${CFLAGS} -c $< -o $@
+
+%.obj: %.cpp
+       ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c $< -o $@
+
+messages.cpp: messages.mc
+       ${MC} $< -cpp
+
+clean:
+       rm -f ${OBJ} ${TARGET} ${GENERATED} ${EXTRA_CLEAN}
+
+# Sub-directories building rules
+.PHONY: subdirs $(SUBDIRS)
+
+subdirs: $(SUBDIRS)
+
+$(SUBDIRS):
+       $(MAKE) -C $@ -f Makefile.w32
index 9edafac..d92335b 100644 (file)
@@ -640,7 +640,7 @@ inline void ret_mbstring(TCHAR *rbuf, const char *value)
 
 inline void ret_int(TCHAR *rbuf, LONG value)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1300)
+#if defined(_WIN32) && (_MSC_VER >= 1300) && !defined(__clang__)
    _sntprintf_s(rbuf, MAX_RESULT_LENGTH, _TRUNCATE, _T("%ld"), (long)value);
 #else
    _sntprintf(rbuf, MAX_RESULT_LENGTH, _T("%ld"), (long)value);
@@ -649,7 +649,7 @@ inline void ret_int(TCHAR *rbuf, LONG value)
 
 inline void ret_uint(TCHAR *rbuf, UINT32 value)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1300)
+#if defined(_WIN32) && (_MSC_VER >= 1300) && !defined(__clang__)
    _sntprintf_s(rbuf, MAX_RESULT_LENGTH, _TRUNCATE, _T("%lu"), (unsigned long)value);
 #else
    _sntprintf(rbuf, MAX_RESULT_LENGTH, _T("%lu"), (unsigned long)value);
@@ -658,7 +658,7 @@ inline void ret_uint(TCHAR *rbuf, UINT32 value)
 
 inline void ret_double(TCHAR *rbuf, double value, int digits = 6)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1300)
+#if defined(_WIN32) && (_MSC_VER >= 1300) && !defined(__clang__)
    _sntprintf_s(rbuf, MAX_RESULT_LENGTH, _TRUNCATE, _T("%1.*f"), digits, value);
 #else
    _sntprintf(rbuf, MAX_RESULT_LENGTH, _T("%1.*f"), digits, value);
@@ -667,7 +667,7 @@ inline void ret_double(TCHAR *rbuf, double value, int digits = 6)
 
 inline void ret_int64(TCHAR *rbuf, INT64 value)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1300)
+#if defined(_WIN32) && (_MSC_VER >= 1300) && !defined(__clang__)
    _sntprintf_s(rbuf, MAX_RESULT_LENGTH, _TRUNCATE, _T("%I64d"), value);
 #else    /* _WIN32 */
    _sntprintf(rbuf, MAX_RESULT_LENGTH, INT64_FMT, value);
@@ -676,7 +676,7 @@ inline void ret_int64(TCHAR *rbuf, INT64 value)
 
 inline void ret_uint64(TCHAR *rbuf, QWORD value)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1300)
+#if defined(_WIN32) && (_MSC_VER >= 1300) && !defined(__clang__)
    _sntprintf_s(rbuf, MAX_RESULT_LENGTH, _TRUNCATE, _T("%I64u"), value);
 #else    /* _WIN32 */
    _sntprintf(rbuf, MAX_RESULT_LENGTH, UINT64_FMT, value);
index 2960f1d..b16e95f 100644 (file)
@@ -301,6 +301,8 @@ typedef unsigned __int64 uint64_t;
 #define TIME_T_FCAST(x) ((UINT32)(x))
 #endif
 
+#ifndef __clang__
+
 #define HAVE_DECL_BSWAP_16 1
 #define HAVE_DECL_BSWAP_32 1
 #define HAVE_DECL_BSWAP_64 1
@@ -309,6 +311,8 @@ typedef unsigned __int64 uint64_t;
 #define bswap_32(n)  _byteswap_ulong(n)
 #define bswap_64(n)  _byteswap_uint64(n)
 
+#endif
+
 // Socket compatibility
 #define SHUT_RD      0
 #define SHUT_WR      1
index 63a750f..da4f5a1 100644 (file)
@@ -1681,7 +1681,7 @@ typedef struct _dir_struc_w
 
 inline TCHAR *nx_strncpy(TCHAR *pszDest, const TCHAR *pszSrc, size_t nLen)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1400)
+#if defined(_WIN32) && (_MSC_VER >= 1400) && !defined(__clang__)
        _tcsncpy_s(pszDest, nLen, pszSrc, _TRUNCATE);
 #else
    _tcsncpy(pszDest, pszSrc, nLen - 1);
@@ -1693,7 +1693,7 @@ inline TCHAR *nx_strncpy(TCHAR *pszDest, const TCHAR *pszSrc, size_t nLen)
 #ifdef UNICODE
 inline char *nx_strncpy_mb(char *pszDest, const char *pszSrc, size_t nLen)
 {
-#if defined(_WIN32) && (_MSC_VER >= 1400)
+#if defined(_WIN32) && (_MSC_VER >= 1400) && !defined(__clang__)
        strncpy_s(pszDest, nLen, pszSrc, _TRUNCATE);
 #else
    strncpy(pszDest, pszSrc, nLen - 1);
diff --git a/src/Makefile.w32 b/src/Makefile.w32
new file mode 100644 (file)
index 0000000..15880d5
--- /dev/null
@@ -0,0 +1,3 @@
+SUBDIRS = libexpat libnetxms
+
+include ../Makefile.inc.w32
diff --git a/src/libexpat/Makefile.w32 b/src/libexpat/Makefile.w32
new file mode 100644 (file)
index 0000000..158091e
--- /dev/null
@@ -0,0 +1,3 @@
+SUBDIRS = libexpat
+
+include ../../Makefile.inc.w32
diff --git a/src/libexpat/libexpat/Makefile.w32 b/src/libexpat/libexpat/Makefile.w32
new file mode 100644 (file)
index 0000000..ce936f4
--- /dev/null
@@ -0,0 +1,8 @@
+TARGET = libexpat.dll
+TYPE = dll
+SOURCES = libexpat.cpp xmlparse.c xmlrole.c xmltok.c xmltok_impl.c xmltok_ns.c
+
+CPPFLAGS = -DCOMPILED_FROM_DSP -DHAVE_EXPAT_CONFIG_H -I..
+LDFLAGS = -def:libexpat.def
+
+include ../../../Makefile.inc.w32
diff --git a/src/libnetxms/Makefile.w32 b/src/libnetxms/Makefile.w32
new file mode 100644 (file)
index 0000000..f9e6af9
--- /dev/null
@@ -0,0 +1,19 @@
+TARGET = libnetxms.dll
+TYPE = dll
+SOURCES = array.cpp base64.cpp bytestream.cpp cc_mb.cpp cc_ucs2.cpp \
+       cc_ucs4.cpp cc_utf8.cpp config.cpp crypto.cpp dir.c \
+       dirw.c dload.cpp geolocation.cpp getopt.c hash.cpp \
+       hashmapbase.cpp ice.c icmp.cpp \
+       inetaddr.cpp log.cpp lz4.c main.cpp md5.cpp message.cpp \
+       msgrecv.cpp msgwq.cpp net.cpp nxcp.cpp pa.cpp \
+       qsort.c queue.cpp rwlock.cpp scandir.c seh.cpp serial.cpp sha1.cpp sha2.cpp \
+       spoll.cpp StackWalker.cpp streamcomp.cpp string.cpp \
+       stringlist.cpp strmap.cpp strmapbase.cpp strptime.c strset.cpp \
+       strtoll.c strtoull.c table.cpp threads.cpp timegm.c tools.cpp \
+       tp.cpp unicode.cpp uuid.cpp wcstoll.c wcstoull.c xml.cpp
+
+CPPFLAGS = -I../libexpat/libexpat -I../zlib -DLIBNETXMS_EXPORTS
+LDFLAGS = -libpath:../libexpat/libexpat
+LIBS = libexpat.lib ws2_32.lib dbghelp.lib psapi.lib rpcrt4.lib iphlpapi.lib crypt32.lib
+         
+include ../../Makefile.inc.w32
index 406adfd..0dc63b8 100644 (file)
@@ -416,7 +416,7 @@ private:
       return FALSE;
     }
 
-    hMods = (HMODULE*) malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof HMODULE));
+    hMods = (HMODULE*) malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof(HMODULE)));
     tt = (char*) malloc(sizeof(char) * TTBUFLEN);
     tt2 = (char*) malloc(sizeof(char) * TTBUFLEN);
 
index 0b2c19a..2996658 100644 (file)
@@ -149,7 +149,7 @@ void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule, const char *pszSymbo
    void *pAddr;
 
 #if defined(_WIN32)
-   pAddr = GetProcAddress(hModule, pszSymbol);
+   pAddr = (void *)GetProcAddress(hModule, pszSymbol);
    if ((pAddr == NULL) && (pszErrorText != NULL))
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
index 76de18f..62d25b1 100644 (file)
 #define TM_YEAR_BASE 1900
 #endif
 
+#ifdef _WIN32
+#define tzname _tzname
+#endif
+
 /*
  * We do not implement alternate representations. However, we always
  * check whether a given modifier is allowed for a certain conversion.
index f7e5318..9a1dc3f 100644 (file)
@@ -1925,17 +1925,17 @@ static BYTE *LoadFileContent(int fd, UINT32 *pdwFileSize)
 {
    int iBufPos, iNumBytes, iBytesRead;
    BYTE *pBuffer = NULL;
-   struct stat fs;
+   NX_STAT_STRUCT fs;
 
-   if (fstat(fd, &fs) != -1)
+   if (NX_FSTAT(fd, &fs) != -1)
    {
       pBuffer = (BYTE *)malloc(fs.st_size + 1);
       if (pBuffer != NULL)
       {
-         *pdwFileSize = fs.st_size;
+         *pdwFileSize = (UINT32)fs.st_size;
          for(iBufPos = 0; iBufPos < fs.st_size; iBufPos += iBytesRead)
          {
-            iNumBytes = min(16384, fs.st_size - iBufPos);
+            iNumBytes = min(16384, (int)fs.st_size - iBufPos);
             if ((iBytesRead = read(fd, &pBuffer[iBufPos], iNumBytes)) < 0)
             {
                free(pBuffer);