-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile.win
163 lines (139 loc) · 3.9 KB
/
Makefile.win
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#
# Usage: NMAKE /f Makefile.win
# The command produces `libcdb2odbc.dll' and `libcdb2odbc.lib' under the current working directory.
# Please make sure that
# 1) protoc-c compiler is included in PATH;
# 2) libcdb2api, protobuf-c and OpenSSL headers are inclued in INCLUDE;
# 3) libcdb2api, protobuf-c and OpenSSL libraries are inclued in LIB;
#
# To produce a DEBUG build, use:
# NMAKE /f Makefile.win CONFIG=Debug
#
# To build without SSL support, use:
# NMAKE /f Makefile.win WITH_SSL=0
#
# To manually set compiler version, use:
# NMAKE /f Makefile.win _MSC_VER=version
#
# To clean the directory, use:
# NMAKE /f Makefile.win clean
#
#
############################ General config ##########################
# Build with optimization unless instructed otherwise.
!IFNDEF CONFIG
CONFIG=Release
!ENDIF
# Build with SSL support unless instructed otherwise.
!IFNDEF WITH_SSL
WITH_SSL=1
!ENDIF
# My dumb way of detecting MSVC version in NMAKE.
!IFNDEF _MSC_VER
!IF ([$(CC) /? 2>&1 | findstr /C:"Version 10" > nul] == 0)
_MSC_VER=1000
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 11" > nul] == 0)
_MSC_VER=1100
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 12" > nul] == 0)
_MSC_VER=1200
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 13" > nul] == 0)
_MSC_VER=1300
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 14" > nul] == 0)
_MSC_VER=1400
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 15" > nul] == 0)
_MSC_VER=1500
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 16" > nul] == 0)
_MSC_VER=1600
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 17" > nul] == 0)
_MSC_VER=1700
!ELSEIF ([$(CC) /? 2>&1 | findstr /C:"Version 18" > nul] == 0)
_MSC_VER=1800
!ELSE
_MSC_VER=1900
!ENDIF
!ENDIF
############################ CC config ##########################
CC=cl.exe
CFLAGS=/nologo $(CFLAG_CFG) $(CFLAGS_INC) $(CFLAGS_DEF) /c
CFLAGS_DEF=-D__UNICODE__ #-D__DEBUG__ -D__LOG__
!IF $(WITH_SSL) == 0
CFLAGS_DEF=$(CFLAGS_DEF) /DWITH_SSL=0
!ELSE
CFLAGS_DEF=$(CFLAGS_DEF) /DWITH_SSL=1
!ENDIF
!IFDEF CDB2API_INC
CFLAGS_INC=$(CFLAGS_INC) /I"$(CDB2API_INC)"
!ENDIF
!IFDEF OPENSSL_INC
CFLAGS_INC=$(CFLAGS_INC) /I"$(OPENSSL_INC)"
!ENDIF
!IFDEF PROTOC_INC
CFLAGS_INC=$(CFLAGS_INC) /I"$(PROTOC_INC)"
!ENDIF
!IF "$(CONFIG)" == "Release"
CFLAGS_CFG=/MT /O2 /W4 /wd4100 /wd4127 /wd4201
!ELSE
CFLAGS_CFG=/MTd /Zi /Od /W4 /wd4127 /wd4201 /Fd"libcdb2api_src" /FD
LDFLAGS_CFG=/debug
!ENDIF
############################ LD config ##########################
DLL=libcdb2odbc.dll
LD=link.exe /DLL /incremental:no
LDLIBS_3RD_PARTY=protobuf-c.lib
!IF $(WITH_SSL) != 0
LDLIBS_3RD_PARTY=$(LDLIBS_3RD_PARTY) libssl.lib libcrypto.lib
!ENDIF
LDLIBS_WIN_CORE=user32.lib gdi32.lib uuid.lib wsock32.lib ws2_32.lib libcmt.lib /nodefaultlib:msvcrt.lib odbc32.lib odbccp32.lib
LDLIBS=$(LDLIBS_3RD_PARTY) $(LDLIBS_WIN_CORE) libcdb2api.lib
!IFDEF CDB2API_LIB
LDLIBPATH=/LIBPATH:"$(CDB2API_LIB)"
!ENDIF
!IFDEF PROTOC_LIB
LDLIBPATH=$(LDLIBPATH) /LIBPATH:"$(PROTOC_LIB)"
!ENDIF
!IFDEF OPENSSL_LIB
LDLIBPATH=$(LDLIBPATH) /LIBPATH:"$(OPENSSL_LIB)"
!ENDIF
!IF $(_MSC_VER) >= 1900
DOWNLEVEL=WindowsApp_downlevel.lib OneCore_downlevel.lib
LDLIBS=$(LDLIBS) legacy_stdio_definitions.lib $(DOWNLEVEL)
!ENDIF
LDFLAGS=$(LDFLAGS) $(LDLIBS) $(LDLIBPATH) $(LDFLAGS_CFG)
LIBNAME=libcdb2odbc.a
AR=lib.exe
ARFLAGS=
OBJECTS=attr.obj \
connect.obj \
convert.obj \
error.obj \
execute.obj \
handle.obj \
meta.obj \
result.obj \
setup.obj \
util.obj \
env.obj \
wcs.obj
############################ TARGETS ##########################
.c.obj::
$(CC) @<<
$(CFLAGS) $<
<<
ALL: "$(DLL)" "$(LIBNAME)"
.PHONY: ALL CLEAN
"$(DLL)": $(OBJECTS)
$(LD) @<<
$(LDFLAGS) $(OBJECTS) /def:$*.def /implib:$*.lib /out:$@
<<
"$(LIBNAME)": $(OBJECTS)
$(AR) @<<
$(ARFLAGS) $(OBJECTS) /out:$@
<<
CLEAN:
-@ERASE /Q *.obj
-@ERASE /Q *.lib
-@ERASE /Q *.exp
-@ERASE /Q *.exe
-@ERASE /Q *.idb
-@ERASE /Q *.pdb
-@ERASE /Q *.a