# # This Makefile builds the third-party libraries needed to build a standalone # libwim.dll for Windows. We build these third-party libraries ourselves mainly # to cut down on bloat. They are automatically downloaded from the URLs # declared below and verified against the checksums given in the 'sha256sums' # file. # # This Makefile requires a GNU toolchain with MinGW-w64 (i686 and x86_64 # versions). # ARCHITECTURES := i686 x86_64 LIBXML2_VERSION := 2.9.3 WINPTHREADS_VERSION := 4.0.4 WINICONV_VERSION := 0.0.6 LIBXML_URL := ftp://xmlsoft.org/libxml2/libxml2-$(LIBXML2_VERSION).tar.gz WINPTHREADS_URL := http://downloads.sourceforge.net/mingw-w64/mingw-w64/mingw-w64-release/mingw-w64-v$(WINPTHREADS_VERSION).tar.bz2 WINICONV_URL := https://github.com/win-iconv/win-iconv/archive/$(WINICONV_VERSION).tar.gz LIBXML_SRCDIR := libxml2-$(LIBXML2_VERSION) LIBXML_DIST := $(LIBXML_SRCDIR).tar.gz SRCDIR_TARGETS += $(LIBXML_SRCDIR) DIST_TARGETS += $(LIBXML_DIST) $(LIBXML_DIST): wget $(LIBXML_URL) $(LIBXML_SRCDIR):$(LIBXML_DIST) checksums_verified tar xvf $< cp $@/COPYING COPYING.libxml2 MAKE_CLEAN_FILES += $(LIBXML_SRCDIR) COPYING.libxml2 WINPTHREADS_DIST := mingw-w64-v$(WINPTHREADS_VERSION).tar.bz2 WINPTHREADS_SRCDIR := winpthreads-$(WINPTHREADS_VERSION) SRCDIR_TARGETS += $(WINPTHREADS_SRCDIR) DIST_TARGETS += $(WINPTHREADS_DIST) $(WINPTHREADS_DIST): wget $(WINPTHREADS_URL) $(WINPTHREADS_SRCDIR):$(WINPTHREADS_DIST) checksums_verified tar xvf $< cp -aT mingw-w64-v$(WINPTHREADS_VERSION)/mingw-w64-libraries/winpthreads $@ cp $@/COPYING COPYING.winpthreads MAKE_CLEAN_FILES += $(WINPTHREADS_SRCDIR) mingw-w64-v$(WINPTHREADS_VERSION) COPYING.winpthreads WINICONV_SRCDIR := win-iconv-$(WINICONV_VERSION) WINICONV_DIST := $(WINICONV_VERSION).tar.gz SRCDIR_TARGETS += $(WINICONV_SRCDIR) DIST_TARGETS += $(WINICONV_DIST) $(WINICONV_DIST): wget $(WINICONV_URL) $(WINICONV_SRCDIR):$(WINICONV_DIST) checksums_verified tar xvf $< # win-iconv is public domain, so there's no license file. MAKE_CLEAN_FILES += $(WINICONV_SRCDIR) checksums_verified:$(DIST_TARGETS) sha256sum -c sha256sums # # declare_libxml_target(arch) # define declare_libxml_target libxml_$(1):$(LIBXML_SRCDIR) builddir=build_libxml_$(1); \ rm -rf $$$$builddir; \ mkdir $$$$builddir; \ cd $$$$builddir; \ ../$(LIBXML_SRCDIR)/configure \ --host=$(1)-w64-mingw32 \ --enable-static \ --disable-shared \ --prefix=$$$$PWD/../sysroot_$(1) \ CFLAGS=-Os \ --with-minimum \ --without-lzma \ --with-tree \ --with-writer; \ $(MAKE) install; \ rm -f ../sysroot_$(1)/lib/libxml2.la; $(1)_BUILD_TARGETS += libxml_$(1) MAKE_CLEAN_FILES += build_libxml_$(1) endef # # declare_winpthreads_target(arch) # define declare_winpthreads_target winpthreads_$(1):$(WINPTHREADS_SRCDIR) builddir=build_winpthreads_$(1); \ rm -rf $$$$builddir; \ cp -r $(WINPTHREADS_SRCDIR) $$$$builddir; \ cd $$$$builddir; \ ./configure \ --host=$(1)-w64-mingw32 \ --enable-static \ --disable-shared \ --prefix=$$$$PWD/../sysroot_$(1) \ CFLAGS=-O2; \ $(MAKE) install; \ sed -i 's/if defined DLL_EXPORT/if 0/' ../sysroot_$(1)/include/pthread.h; $(1)_BUILD_TARGETS += winpthreads_$(1) MAKE_CLEAN_FILES += build_winpthreads_$(1) endef # # declare_winiconv_target(arch) # define declare_winiconv_target winiconv_$(1):$(WINICONV_SRCDIR) builddir=build_winiconv_$(1); \ rm -rf $$$$builddir; \ cp -r $(WINICONV_SRCDIR) $$$$builddir; \ cd $$$$builddir; \ $(MAKE) CC=$(1)-w64-mingw32-gcc \ AR=$(1)-w64-mingw32-ar \ RANLIB=$(1)-w64-mingw32-ranlib \ DLLTOOL=$(1)-w64-mingw32-dlltool \ CFLAGS=-O2 \ prefix=$$$$PWD/../sysroot_$(1) \ install; \ rm -f ../sysroot_$(1)/lib/libiconv.dll.a; $(1)_BUILD_TARGETS += winiconv_$(1) MAKE_CLEAN_FILES += build_winiconv_$(1) endef # # declare_arch_targets(arch) # define declare_arch_targets $(eval $(call declare_libxml_target,$(1))) $(eval $(call declare_winpthreads_target,$(1))) $(eval $(call declare_winiconv_target,$(1))) sysroot_$(1): $($(1)_BUILD_TARGETS) ALL_SYSROOTS += sysroot_$(1) MAKE_CLEAN_FILES += sysroot_$(1) endef $(foreach arch,$(ARCHITECTURES),$(eval $(call declare_arch_targets,$(arch)))) all: $(ALL_SYSROOTS) clean: rm -rf $(MAKE_CLEAN_FILES) $(DIST_TARGETS) .PHONY: all clean $(SRCDIR_TARGETS) checksums_verified .DEFAULT_GOAL = all