1#########################################################################
2#
3## Makefile for building libssh2 samples (Win32 version - gnu make)
4## Use: make -f GNUmakefile [help]
5##
6## Hacked by: Guenter Knauf
7#
8#########################################################################
9
10# Edit the path below to point to the base of your Zlib sources.
11ifndef ZLIB_PATH
12ZLIB_PATH = ../../../zlib-1.2.8
13endif
14
15# Edit the path below to point to the base of your OpenSSL package.
16ifndef OPENSSL_PATH
17OPENSSL_PATH = ../../../openssl-0.9.8zc
18endif
19
20# Project root
21PROOT	= ../..
22
23# Edit the var below to enable static linking of libssh2 and libz
24LINK_STATIC = 1
25
26# Edit the vars below to change target settings.
27SAMPLES	= $(PROOT)/example
28TARGETS := $(filter-out x11.exe,$(patsubst $(SAMPLES)/%.c,%.exe,$(strip $(wildcard $(SAMPLES)/*.c))))
29WWWURL	= https://www.libssh2.org/
30DESCR	= libssh2 $(subst .rc,,$(notdir $@)) $(LIBSSH2_VERSION_STR)
31#STACK	= 64000
32
33# must be equal to DEBUG or NDEBUG
34ifndef DB
35	DB	= NDEBUG
36	# DB	= DEBUG
37endif
38# Optimization: -O<n> or debugging: -g
39ifeq ($(DB),NDEBUG)
40	OPT	= -O2
41	OBJDIR	= release
42else
43	OPT	= -g
44	OBJDIR	= debug
45endif
46
47# Here you can find a native Win32 binary of the original awk:
48# http://www.gknw.net/development/prgtools/awk-20100523.zip
49AWK     = awk
50ZIP     = zip -qzr9
51
52# Platform-dependent helper tool macros
53ifeq ($(findstring /sh,$(SHELL)),/sh)
54DEL	= rm -f $1
55RMDIR	= rm -fr $1
56MKDIR	= mkdir -p $1
57COPY	= -cp -afv $1 $2
58#COPYR	= -cp -afr $1/* $2
59COPYR	= -rsync -aC $1/* $2
60TOUCH	= touch $1
61CAT	= cat
62ECHONL	= echo ""
63DL	= '
64else
65ifeq "$(OS)" "Windows_NT"
66DEL	= -del 2>NUL /q /f $(subst /,\,$1)
67RMDIR	= -rd 2>NUL /q /s $(subst /,\,$1)
68else
69DEL	= -del 2>NUL $(subst /,\,$1)
70RMDIR	= -deltree 2>NUL /y $(subst /,\,$1)
71endif
72MKDIR	= -md 2>NUL $(subst /,\,$1)
73COPY	= -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
74COPYR	= -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
75TOUCH	= copy 2>&1>NUL /b $(subst /,\,$1) +,,
76CAT	= type
77ECHONL	= $(ComSpec) /c echo.
78endif
79
80# The following line defines your compiler.
81ifdef METROWERKS
82	CC = mwcc
83else
84	CC = $(CROSSPREFIX)gcc
85endif
86
87# Set environment var ARCH to your architecture to override autodetection.
88ifndef ARCH
89ifeq ($(findstring gcc,$(CC)),gcc)
90ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
91ARCH	= w64
92else
93ARCH	= w32
94endif
95else
96ARCH	= w32
97endif
98endif
99
100# Include the version info retrieved from libssh2.h
101-include $(OBJDIR)/version.inc
102
103# Global flags for all compilers
104CFLAGS	= $(OPT) -D$(DB) -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H
105
106ifeq ($(CC),mwcc)
107LD	= mwld
108RC	= mwwinrc
109LDFLAGS	= -nostdlib
110AR	= $(LD)
111ARFLAGS	= -nostdlib -library -o
112LIBEXT	= lib
113LIBPATH	+= -lr "$(METROWERKS)/MSL" -lr "$(METROWERKS)/Win32-x86 Support"
114LDLIBS	+= -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib
115LDLIBS	+= -lkernel32.lib -luser32.lib -lwsock32.lib
116RCFLAGS	=
117CFLAGS	+= -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586
118CFLAGS	+= -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support"
119CFLAGS	+= -w on,nounused,nounusedexpr # -ansi strict
120else
121LD	= $(CROSSPREFIX)gcc
122RC	= $(CROSSPREFIX)windres
123LDFLAGS	= -s
124AR	= $(CROSSPREFIX)ar
125ARFLAGS	= -cq
126LIBEXT	= a
127#LDLIBS	+= -lwsock32
128LDLIBS	+= -lws2_32
129RCFLAGS	= -I $(PROOT)/include -O coff
130CFLAGS	+= -fno-builtin
131CFLAGS	+= -fno-strict-aliasing
132CFLAGS	+= -Wall #-Wno-unused #-pedantic
133ifeq ($(ARCH),w64)
134CFLAGS	+= -D_AMD64_
135RCFLAGS	+= -F pe-x86-64
136else
137CFLAGS	+= -m32
138RCFLAGS	+= -F pe-i386
139endif
140endif
141
142INCLUDES = -I$(PROOT)/win32 -I$(PROOT)/include
143LIBPATH += -L$(PROOT)/win32
144
145ifdef LINK_STATIC
146	LDLIBS += -llibssh2
147else
148	LDLIBS += -llibssh2dll
149endif
150
151ifdef WITH_WINCNG
152# CFLAGS	+= -DLIBSSH2_WINCNG
153LDLIBS	+= -lbcrypt -lcrypt32
154else
155# CFLAGS	+= -DLIBSSH2_OPENSSL
156ifndef OPENSSL_INCLUDE
157	ifeq "$(wildcard $(OPENSSL_PATH)/outinc)" "$(OPENSSL_PATH)/outinc"
158		OPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc
159	endif
160	ifeq "$(wildcard $(OPENSSL_PATH)/include)" "$(OPENSSL_PATH)/include"
161		OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
162	endif
163endif
164ifneq "$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)" "$(OPENSSL_INCLUDE)/openssl/opensslv.h"
165$(error Invalid OPENSSL_PATH: $(OPENSSL_PATH))
166endif
167INCLUDES += -I"$(OPENSSL_INCLUDE)"
168ifndef OPENSSL_LIBPATH
169	OPENSSL_LIBS_STAT = crypto ssl
170	ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out"
171		OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
172		OPENSSL_LIBS_DYN = eay32 ssl32
173	endif
174	ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib"
175		OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
176		OPENSSL_LIBS_DYN = crypto.dll ssl.dll
177	endif
178endif
179ifdef LINK_STATIC
180ifdef LINK_OPENSSL_STATIC
181	LDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_STAT)) -lgdi32
182else
183	LDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_DYN))
184endif
185endif
186endif
187
188ifdef WITH_ZLIB
189	CFLAGS += -DLIBSSH2_HAVE_ZLIB
190	INCLUDES += -I$(ZLIB_PATH)
191	ifdef LINK_ZLIB_STATIC
192		LDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT)
193	else
194		LDLIBS += $(ZLIB_PATH)/libzdll.$(LIBEXT)
195	endif
196endif
197
198CFLAGS	+= $(INCLUDES)
199
200vpath %.c $(PROOT)/example
201
202.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.rc $(OBJDIR)/%.res
203
204
205all: prebuild $(TARGETS)
206
207prebuild: $(OBJDIR) $(OBJDIR)/version.inc
208
209$(OBJDIR)/%.o: %.c
210#	@echo Compiling $<
211	$(CC) $(CFLAGS) -c $< -o $@
212
213$(OBJDIR)/version.inc: $(PROOT)/include/libssh2.h $(OBJDIR)
214	@echo Creating $@
215	@$(AWK) -f $(PROOT)/get_ver.awk $< > $@
216
217objclean:
218	$(call RMDIR, $(OBJDIR))
219
220clean: objclean
221	$(call DEL, $(TARGETS))
222
223$(OBJDIR):
224	$(call MKDIR, $@)
225
226%.exe: $(OBJDIR)/%.o $(OBJDIR)/%.res
227	@echo Linking $@
228	@$(call DEL, $@)
229	$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS)
230
231$(OBJDIR)/%.res: $(OBJDIR)/%.rc
232	@echo Creating $@
233	@$(RC) $(RCFLAGS) -i $< -o $@
234
235$(OBJDIR)/%.rc: GNUmakefile $(OBJDIR)/version.inc
236	@echo $(DL)1 VERSIONINFO$(DL) > $@
237	@echo $(DL) FILEVERSION $(LIBSSH2_VERSION),0$(DL) >> $@
238	@echo $(DL) PRODUCTVERSION $(LIBSSH2_VERSION),0$(DL) >> $@
239	@echo $(DL) FILEFLAGSMASK 0x3fL$(DL) >> $@
240	@echo $(DL) FILEOS 0x40004L$(DL) >> $@
241	@echo $(DL) FILEFLAGS 0x0L$(DL) >> $@
242	@echo $(DL) FILETYPE 0x1L$(DL) >> $@
243	@echo $(DL) FILESUBTYPE 0x0L$(DL) >> $@
244	@echo $(DL)BEGIN$(DL) >> $@
245	@echo $(DL)  BLOCK "StringFileInfo"$(DL) >> $@
246	@echo $(DL)  BEGIN$(DL) >> $@
247	@echo $(DL)    BLOCK "040904E4"$(DL) >> $@
248	@echo $(DL)    BEGIN$(DL) >> $@
249	@echo $(DL)      VALUE "LegalCopyright","\xA9 $(LIBSSH2_COPYRIGHT_STR)\0"$(DL) >> $@
250ifdef COMPANY
251	@echo $(DL)      VALUE "CompanyName","$(COMPANY)\0"$(DL) >> $@
252endif
253	@echo $(DL)      VALUE "ProductName","$(notdir $(@:.rc=.exe))\0"$(DL) >> $@
254	@echo $(DL)      VALUE "ProductVersion","$(LIBSSH2_VERSION_STR)\0"$(DL) >> $@
255	@echo $(DL)      VALUE "License","Released under GPL.\0"$(DL) >> $@
256	@echo $(DL)      VALUE "FileDescription","$(DESCR)\0"$(DL) >> $@
257	@echo $(DL)      VALUE "FileVersion","$(LIBSSH2_VERSION_STR)\0"$(DL) >> $@
258	@echo $(DL)      VALUE "InternalName","$(notdir $(@:.rc=))\0"$(DL) >> $@
259	@echo $(DL)      VALUE "OriginalFilename","$(notdir $(@:.rc=.exe))\0"$(DL) >> $@
260	@echo $(DL)      VALUE "WWW","$(WWWURL)\0"$(DL) >> $@
261	@echo $(DL)    END$(DL) >> $@
262	@echo $(DL)  END$(DL) >> $@
263	@echo $(DL)  BLOCK "VarFileInfo"$(DL) >> $@
264	@echo $(DL)  BEGIN$(DL) >> $@
265	@echo $(DL)    VALUE "Translation", 0x409, 1252$(DL) >> $@
266	@echo $(DL)  END$(DL) >> $@
267	@echo $(DL)END$(DL) >> $@
268ifdef ICON
269	@echo $(DL)10 ICON DISCARDABLE "$(ICON)"$(DL) >> $@
270endif
271
272help: $(OBJDIR)/version.inc
273	@echo $(DL)===========================================================$(DL)
274	@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)
275	@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)
276	@echo $(DL)===========================================================$(DL)
277	@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)
278	@echo $(DL)$(MAKE) all$(DL)
279	@echo $(DL)$(MAKE) clean$(DL)
280	@echo $(DL)$(MAKE) objclean$(DL)
281	@echo $(DL)===========================================================$(DL)
282
283
284