######################################################################### # ## Makefile for building libssh2 (Win32 version - gnu make) ## Use: make -f GNUmakefile [help|all|clean|dev|devclean|dist|distclean|dll|objclean] ## ## Hacked by: Guenter Knauf # ######################################################################### # Edit the path below to point to the base of your Zlib sources. ifndef ZLIB_PATH ZLIB_PATH = ../../zlib-1.2.8 endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH OPENSSL_PATH = ../../openssl-1.0.2d endif # Edit the path below to point to your Distribution folder. ifndef DISTDIR DISTDIR = libssh2-$(LIBSSH2_VERSION_STR)-bin-$(ARCH) endif DISTARC = $(DISTDIR).zip # Edit the path below to point to your Development folder. ifndef DEVLDIR DEVLDIR = libssh2-$(LIBSSH2_VERSION_STR)-dev-$(ARCH) endif DEVLARC = $(DEVLDIR).zip # Project root PROOT = .. # Edit the vars below to change target settings. TARGET = libssh2 WWWURL = https://www.libssh2.org/ DESCR = libssh2 $(LIBSSH2_VERSION_STR) #STACK = 64000 # must be equal to DEBUG or NDEBUG ifndef DB DB = NDEBUG # DB = DEBUG endif # Optimization: -O or debugging: -g ifeq ($(DB),NDEBUG) OPT = -O2 OBJDIR = release else OPT = -g OPT += -DLIBSSH2DEBUG OBJDIR = debug endif # Here you can find a native Win32 binary of the original awk: # http://www.gknw.net/development/prgtools/awk-20100523.zip AWK = awk ZIP = zip -qzr9 # Platform-dependent helper tool macros ifeq ($(findstring /sh,$(SHELL)),/sh) DEL = rm -f $1 RMDIR = rm -fr $1 MKDIR = mkdir -p $1 COPY = -cp -afv $1 $2 #COPYR = -cp -afr $1/* $2 COPYR = -rsync -aC $1/* $2 TOUCH = touch $1 CAT = cat ECHONL = echo "" DL = ' else ifeq "$(OS)" "Windows_NT" DEL = -del 2>NUL /q /f $(subst /,\,$1) RMDIR = -rd 2>NUL /q /s $(subst /,\,$1) else DEL = -del 2>NUL $(subst /,\,$1) RMDIR = -deltree 2>NUL /y $(subst /,\,$1) endif MKDIR = -md 2>NUL $(subst /,\,$1) COPY = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2) COPYR = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2) TOUCH = copy 2>&1>NUL /b $(subst /,\,$1) +,, CAT = type ECHONL = $(ComSpec) /c echo. endif ifeq ($(LIBSSH2_CC),) LIBSSH2_CC := $(CROSSPREFIX)gcc endif ifeq ($(LIBSSH2_AR),) LIBSSH2_AR := $(CROSSPREFIX)ar endif ifeq ($(LIBSSH2_RANLIB),) LIBSSH2_RANLIB := $(CROSSPREFIX)ranlib endif ifeq ($(LIBSSH2_DLL_A_SUFFIX),) LIBSSH2_DLL_A_SUFFIX := dll endif libssh2_dll_LIBRARY = $(TARGET)$(LIBSSH2_DLL_SUFFIX).dll # The following line defines your compiler. ifdef METROWERKS CC = mwcc else CC = $(LIBSSH2_CC) endif # Set environment var ARCH to your architecture to override autodetection. ifndef ARCH ifeq ($(findstring gcc,$(CC)),gcc) ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64) ARCH = w64 else ARCH = w32 endif else ARCH = w32 endif endif # Include the version info retrieved from libssh2.h -include $(OBJDIR)/version.inc # Global flags for all compilers CFLAGS = $(LIBSSH2_CFLAG_EXTRAS) $(OPT) -D$(DB) -DLIBSSH2_WIN32 -DHAVE_WINDOWS_H # -DHAVE_CONFIG_H LDFLAGS = $(LIBSSH2_LDFLAG_EXTRAS) ifeq ($(CC),mwcc) LD = mwld RC = mwwinrc LDFLAGS += -nostdlib AR = $(LD) ARFLAGS = -nostdlib -library -o LIBEXT = lib #RANLIB = LIBPATH += -lr "$(METROWERKS)/MSL" -lr "$(METROWERKS)/Win32-x86 Support" LDLIBS += -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib RCFLAGS = CFLAGS += -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586 CFLAGS += -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support" CFLAGS += -w on,nounused,nounusedexpr # -ansi strict else LIBEXT = a LD = $(LIBSSH2_CC) RC = $(CROSSPREFIX)windres LDFLAGS += -s -shared -Wl,--output-def,$(libssh2_dll_LIBRARY:.dll=.def),--out-implib,$(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT) AR = $(LIBSSH2_AR) ARFLAGS = cru RANLIB = $(LIBSSH2_RANLIB) RCFLAGS = -I $(PROOT)/include -O coff CFLAGS += -fno-builtin CFLAGS += -fno-strict-aliasing CFLAGS += -Wall # -pedantic ifeq ($(ARCH),w64) CFLAGS += -m64 -D_AMD64_ LDFLAGS += -m64 RCFLAGS += -F pe-x86-64 else CFLAGS += -m32 LDFLAGS += -m32 RCFLAGS += -F pe-i386 endif endif INCLUDES = -I$(PROOT)/win32 -I$(PROOT)/include ifdef WITH_WINCNG CFLAGS += -DLIBSSH2_WINCNG LDLIBS += -lbcrypt -lcrypt32 else CFLAGS += -DLIBSSH2_OPENSSL ifndef OPENSSL_INCLUDE ifeq "$(wildcard $(OPENSSL_PATH)/outinc)" "$(OPENSSL_PATH)/outinc" OPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc endif ifeq "$(wildcard $(OPENSSL_PATH)/include)" "$(OPENSSL_PATH)/include" OPENSSL_INCLUDE = $(OPENSSL_PATH)/include endif endif ifneq "$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)" "$(OPENSSL_INCLUDE)/openssl/opensslv.h" $(error Invalid OPENSSL_PATH: $(OPENSSL_PATH)) endif INCLUDES += -I"$(OPENSSL_INCLUDE)" ifndef OPENSSL_LIBPATH OPENSSL_LIBS_STAT = crypto ssl ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out" OPENSSL_LIBPATH = $(OPENSSL_PATH)/out OPENSSL_LIBS_DYN = eay32 ssl32 endif ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib" OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib OPENSSL_LIBS_DYN = crypto.dll ssl.dll endif endif ifdef LINK_OPENSSL_STATIC LDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_STAT)) -lgdi32 else LDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_DYN)) endif endif ifeq ($(CC),mwcc) LDLIBS += -lkernel32.lib -luser32.lib -lwsock32.lib else #LDLIBS += -lwsock32 LDLIBS += -lws2_32 endif ifdef WITH_ZLIB CFLAGS += -DLIBSSH2_HAVE_ZLIB INCLUDES += -I$(ZLIB_PATH) ifdef LINK_ZLIB_STATIC LDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT) else LDLIBS += $(ZLIB_PATH)/libz.dll.$(LIBEXT) endif endif CFLAGS += $(INCLUDES) vpath %.c $(PROOT)/src ifdef WITH_WINCNG include $(PROOT)/Makefile.WinCNG.inc else include $(PROOT)/Makefile.OpenSSL.inc endif # include Makefile.inc to get CSOURCES define include $(PROOT)/Makefile.inc OBJECTS := $(patsubst %.c,%.o,$(CSOURCES)) OBJS := $(addprefix $(OBJDIR)/,$(OBJECTS)) OBJL = $(OBJS) $(OBJDIR)/$(TARGET).res all: lib dll dll: prebuild $(libssh2_dll_LIBRARY) lib: prebuild $(TARGET).$(LIBEXT) prebuild: $(OBJDIR) $(OBJDIR)/version.inc # libssh2_config.h test: all $(MAKE) -C test -f GNUmakefile $(OBJDIR)/%.o: %.c # @echo Compiling $< $(CC) $(CFLAGS) -c $< -o $@ $(OBJDIR)/version.inc: $(PROOT)/get_ver.awk $(PROOT)/include/libssh2.h $(OBJDIR) @echo Creating $@ @$(AWK) -f $^ > $@ dist: all $(DISTDIR) $(DISTDIR)/readme.txt @$(call MKDIR, $(DISTDIR)/bin) @$(call COPY, $(PROOT)/AUTHORS, $(DISTDIR)) @$(call COPY, $(PROOT)/COPYING, $(DISTDIR)) @$(call COPY, $(PROOT)/INSTALL, $(DISTDIR)) @$(call COPY, $(PROOT)/README, $(DISTDIR)) @$(call COPY, $(PROOT)/RELEASE-NOTES, $(DISTDIR)) @$(call COPY, $(libssh2_dll_LIBRARY), $(DISTDIR)/bin) @echo Creating $(DISTARC) @$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt dev: all $(DEVLDIR) $(DEVLDIR)/readme.txt @$(call MKDIR, $(DEVLDIR)/bin) @$(call MKDIR, $(DEVLDIR)/include) @$(call MKDIR, $(DEVLDIR)/win32) @$(call COPY, $(PROOT)/AUTHORS, $(DEVLDIR)) @$(call COPY, $(PROOT)/COPYING, $(DEVLDIR)) @$(call COPY, $(PROOT)/INSTALL, $(DEVLDIR)) @$(call COPY, $(PROOT)/README, $(DEVLDIR)) @$(call COPY, $(PROOT)/RELEASE-NOTES, $(DEVLDIR)) @$(call COPY, $(libssh2_dll_LIBRARY), $(DEVLDIR)/bin) @$(call COPY, $(PROOT)/include/*.h, $(DEVLDIR)/include) @$(call COPY, libssh2_config.h, $(DEVLDIR)/include) @$(call COPY, *.$(LIBEXT), $(DEVLDIR)/win32) @echo Creating $(DEVLARC) @$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt distclean vclean: clean $(call RMDIR, $(DISTDIR)) $(call DEL, $(DISTARC)) devclean: clean $(call RMDIR, $(DEVLDIR)) $(call DEL, $(DEVLARC)) objclean: all $(call RMDIR, $(OBJDIR)) testclean: clean $(MAKE) -C test -f GNUmakefile clean clean: # $(call DEL, libssh2_config.h) $(call DEL, $(libssh2_dll_LIBRARY) $(libssh2_dll_LIBRARY:.dll=.def) $(TARGET).$(LIBEXT) $(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT)) $(call RMDIR, $(OBJDIR)) $(OBJDIR): @$(call MKDIR, $@) $(DISTDIR): @$(call MKDIR, $@) $(DEVLDIR): @$(call MKDIR, $@) $(TARGET).$(LIBEXT): $(OBJS) @echo Creating $@ @$(call DEL, $@) @$(AR) $(ARFLAGS) $@ $^ ifdef RANLIB @$(RANLIB) $@ endif $(libssh2_dll_LIBRARY) $(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT): $(OBJL) @echo Linking $@ @$(call DEL, $@) @$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS) $(OBJDIR)/%.res: %.rc @echo Creating $@ @$(RC) $(RCFLAGS) -i $< -o $@ $(DISTDIR)/readme.txt: GNUmakefile @echo Creating $@ @echo $(DL)This is a binary distribution for Win32 platform.$(DL) > $@ @echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@ @echo $(DL)Please download the complete libssh package for$(DL) >> $@ @echo $(DL)any further documentation:$(DL) >> $@ @echo $(DL)$(WWWURL)$(DL) >> $@ $(DEVLDIR)/readme.txt: GNUmakefile @echo Creating $@ @echo $(DL)This is a development distribution for Win32 platform.$(DL) > $@ @echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@ @echo $(DL)Please download the complete libssh package for$(DL) >> $@ @echo $(DL)any further documentation:$(DL) >> $@ @echo $(DL)$(WWWURL)$(DL) >> $@ help: $(OBJDIR)/version.inc @echo $(DL)===========================================================$(DL) @echo $(DL)OpenSSL path = $(OPENSSL_PATH)$(DL) @echo $(DL)Zlib path = $(ZLIB_PATH)$(DL) @echo $(DL)===========================================================$(DL) @echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL) @echo $(DL)$(MAKE) all$(DL) @echo $(DL)$(MAKE) dll$(DL) @echo $(DL)$(MAKE) lib$(DL) @echo $(DL)$(MAKE) clean$(DL) @echo $(DL)$(MAKE) dev$(DL) @echo $(DL)$(MAKE) devclean$(DL) @echo $(DL)$(MAKE) dist$(DL) @echo $(DL)$(MAKE) distclean$(DL) @echo $(DL)$(MAKE) objclean$(DL) @echo $(DL)$(MAKE) test$(DL) @echo $(DL)===========================================================$(DL)