Forráskód Böngészése

Initial revision of the a new OSX release Makefile

Nils Maier 12 éve
szülő
commit
afaba4cf73

+ 407 - 0
makerelease-osx.mk

@@ -0,0 +1,407 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+# Written by Nils Maier
+
+# This make file will:
+#  - Download a set of dependencies and verify the known-good hashes.
+#  - Build static libraries of aria2 dependencies.
+#  - Create a statically linked, universal build (i386,x86_64) aria2 release.
+#    - The build will have all major features enabled, and will use
+#      AppleTLS.
+#  - Create a corresponding .tar.bz containing the binaries:
+#  - Create a corresponding .pkg installer.
+#  - Create a corresponding .dmg image containing said installer.
+#
+# This Makefile will also run all `make check` targets.
+#
+# The dependencies currently build are:
+#  - zlib (compression, in particular web compression)
+#  - c-ares (asynchronous DNS resolver)
+#  - expat (XML parser, for metalinks)
+#  - gmp (multi-precision arithmetric library, for DHKeyExchange, BitTorrent)
+#  - sqlite3 (self-contained SQL database, for Firefox3 cookie reading)
+#  - cppunit (unit tests for C++, framework in use by aria2 `make check`)
+#
+#
+# To use this Makefile, do something along the lines of
+#  - $ mkdir build-release
+#  - $ cd build-release
+#  - $ virtualenv .
+#  - $ . bin/activate
+#  - $ pip install sphinx-build
+#  - $ ln -s ../makerelease-os.mk Makefile
+#  - $ make
+#
+# If you haven't checkout out a release tag, you need to specify NON_RELEASE.
+# $ export NON_RELEASE=1
+# to generate a dist with git commit
+# $ export NON_RELEASE=force
+# to force this script to behave like it was on a tag.
+#
+# Note: This Makefile expects to be called from a git clone of aria2.
+#
+# Note: In theory, everything can be build in parallel, however the sub-makes
+# will be called with an appropriate -j flag. Building the `deps` target in
+# parallel before a general make might be beneficial, as the dependencies
+# usually bottle-neck on the configure steps.
+#
+# Note: Of course, you need to have XCode with the command line tools
+# installed for this to work, aka. a working compiler...
+#
+# Note: We're locally building the dependencies here, static libraries only.
+# This is required, because when using brew or MacPorts, which also provide
+# dynamic libraries, the linker will pick up the dynamic versions, always,
+# with no way to instruct the linker otherwise.
+# If you're building aria2 just for yourself and your system, using brewed
+# libraries is fine as well.
+#
+# Note: This Makefile is riddled with mac-isms. It will not work on *nix.
+#
+# Note: The convoluted way to create separate arch builds and later merge them
+# with lipo is because of two things:
+#  1) Avoid patching c-ares, which hardcodes some sizes in its headers.
+#  2) Make it easy in the future to enable -flto (currently, -flto builds crash)
+#
+# Note: This Makefile uses resources from osx-package when creating the
+# *.pkg and *.dmg targets
+
+SHELL := bash
+
+# A bit awkward, but OSX doesn't have a proper `readlink -f`.
+SRCDIR := $(shell dirname $(lastword $(shell stat -f "%N %Y" $(lastword $(MAKEFILE_LIST)))))
+
+# Same as in script-helper, but a bit easier on the eye (but more error prone)
+# and Makefile compatible
+BASE_VERSION := $(shell grep AC_INIT $(SRCDIR)/configure.ac | cut -d'[' -f3 | cut -d']' -f1)
+ifeq ($(NON_RELEASE),)
+	VERSION := $(BASE_VERSION)
+else
+ifeq ($(NON_RELEASE),force)
+	VERSION := $(BASE_VERSION)
+else
+	VERSION := $(subst release-,,$(shell git describe --tags))
+endif
+endif
+
+# Set up compiler.
+CC ?= cc
+export CC
+CXX ?= c++
+export CXX
+
+# Set up compiler/linker flags.
+OPTFLAGS ?= -Os
+CFLAGS ?= -mmacosx-version-min=10.7 $(OPTFLAGS)
+export CFLAGS
+CXXFLAGS ?= -Os -mmacosx-version-min=10.7 $(OPTFLAGS)
+export CXXFLAGS
+LDFLAGS ?= -Wl,-dead_strip
+export LDFLAGS
+
+
+# Dependency versions
+zlib_version = 1.2.8
+zlib_hash = a4d316c404ff54ca545ea71a27af7dbc29817088
+zlib_url = http://zlib.net/zlib-$(zlib_version).tar.gz
+
+expat_version = 2.1.0
+expat_hash = b08197d146930a5543a7b99e871cba3da614f6f0
+expat_url = http://sourceforge.net/projects/expat/files/expat/$(expat_version)/expat-$(expat_version).tar.gz
+
+cares_version = 1.10.0
+cares_hash = e44e6575d5af99cb3a38461486e1ee8b49810eb5
+cares_url = http://c-ares.haxx.se/download/c-ares-$(cares_version).tar.gz
+cares_confflags = "--enable-optimize=$(OPTFLAGS)"
+
+sqlite_version = autoconf-3080200
+sqlite_hash = 6033ef603ce221d367c665477514d972ef1dc90e
+sqlite_url = http://sqlite.org/2013/sqlite-$(sqlite_version).tar.gz
+
+gmp_version = 5.1.3
+gmp_hash = b35928e2927b272711fdfbf71b7cfd5f86a6b165
+gmp_url = https://ftp.gnu.org/gnu/gmp/gmp-$(gmp_version).tar.bz2
+gmp_flags = --disable-cxx --enable-assembly
+
+cppunit_version = 1.12.1
+cppunit_hash = f1ab8986af7a1ffa6760f4bacf5622924639bf4a
+cppunit_url = http://sourceforge.net/projects/cppunit/files/cppunit/$(cppunit_version)/cppunit-$(cppunit_version).tar.gz
+
+
+# ARCHLIBS that can be template build
+ARCHLIBS = expat cares sqlite gmp cppunit
+# NONARCHLIBS that cannot be template build
+NONARCHLIBS = zlib
+
+
+# Tags
+THIS_TAG := $(shell git describe --abbrev=0 $$(git rev-list --tags --max-count=1))
+PREV_TAG := $(shell git describe --abbrev=0 $(THIS_TAG)~1)
+
+
+# Aria2 setup
+ARIA2 := aria2-$(VERSION)
+ARIA2_PREFIX := $(PWD)/$(ARIA2)
+ARIA2_DIST := $(PWD)/$(ARIA2)-osx-darwin
+ARIA2_CONFFLAGS = \
+        --enable-static \
+        --disable-shared \
+        --enable-metalink \
+        --enable-bittorrent \
+        --disable-nls \
+        --with-appletls \
+        --with-libgmp \
+        --with-sqlite3 \
+        --with-libz \
+        --with-libexpat \
+        --with-libcares \
+        --without-libuv \
+        --without-gnutls \
+        --without-openssl \
+        --without-libnettle \
+        --without-libgcrypt \
+        --without-libxml2 \
+        ARIA2_STATIC=yes
+ARIA2_DOCDIR = $(ARIA2_PREFIX)/share/doc/aria2
+ARIA2_DOCS = \
+	     $(ARIA2_DOCDIR)/AUTHORS \
+	     $(ARIA2_DOCDIR)/COPYING \
+	     $(ARIA2_DOCDIR)/NEWS
+ARIA2_CHANGELOG = $(ARIA2_DOCDIR)/Changelog
+
+# Yeah, inlined XML, go figure :p
+define ARIA2_DISTXML
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<installer-gui-script minSpecVersion="1">
+	<title>aria1 $(VERSION)</title>
+	<welcome file="README.html"/>
+	<pkg-ref id="aria2"/>
+	<pkg-ref id="aria2.paths"/>
+	<options customize="never" require-scripts="false" rootVolumeOnly="true"/>
+	<volume-check>
+		<allowed-os-versions>
+			<os-version min="10.7"/>
+		</allowed-os-versions>
+	</volume-check>
+	<domains enable_anywhere="false" enable_currentUserHome="false" enable_localSystem="true"/>
+	<choices-outline>
+		<line choice="default">
+			<line choice="aria2"/>
+			<line choice="aria2.paths"/>
+		</line>
+	</choices-outline>
+	<choice id="default"/>
+	<choice id="aria2" visible="false">
+		<pkg-ref id="aria2"/>
+	</choice>
+	<choice id="aria2.paths" visible="false">
+		<pkg-ref id="aria2.paths"/>
+	</choice>
+	<pkg-ref id="aria2" version="$(VERSION)" onConclusion="none">out.pkg</pkg-ref>
+	<pkg-ref id="aria2.paths" version="$(VERSION)" onConclusion="none">paths.pkg</pkg-ref>
+</installer-gui-script>
+endef
+export ARIA2_DISTXML
+
+
+# Detect numer of CPUs to be used with make -j
+CPUS = $(shell sysctl hw.ncpu | cut -d" " -f2)
+
+
+# default target
+all::
+	@if test "x$(NON_RELEASE)" = "x" && !(git describe --tags --exact); then \
+		echo 'Not on a release tag; override by defining NON_RELEASE!'; \
+		exit 1; \
+	fi
+
+# No dice without sphinx
+all::
+	@if test "x$$(which sphinx-build)" = "x"; then \
+		echo "sphinx-build not present"; \
+		exit 1; \
+	fi;
+
+deps::
+
+
+# All those .PRECIOUS files, because otherwise gmake will treat them as
+# intermediates and remove them when the build completes. Thanks gmake!
+.PRECIOUS: %.tar.gz
+%.tar.gz:
+	curl -o $@ -A 'curl/0; like wget' -L \
+		$($(basename $(basename $@))_url)
+
+.PRECIOUS: %.check
+%.check: %.tar.gz
+	@if test "$$(shasum -a1 $< | awk '{print $$1}')" != "$($(basename $@)_hash)"; then \
+		echo "Invalid $@ hash"; \
+		rm -f $<; \
+		exit 1; \
+	fi;
+	touch $@
+
+.PRECIOUS: %.stamp
+%.stamp: %.tar.gz %.check
+	tar xf $<
+	mv $(basename $@)-$($(basename $@)_version) $(basename $@)
+	touch $@
+
+.PRECIOUS: cares.stamp
+cares.stamp: cares.tar.gz cares.check
+	tar xzf $<
+	mv c-ares-$($(basename $@)_version) $(basename $@)
+	touch $@
+
+# Using (NON)ARCH_template kinda stinks, but real multi-target pattern rules
+# only exist in feverish dreams.
+define NONARCH_template
+$(1).build: $(1).x86_64.build $(1).i686.build
+deps:: $(1).build
+endef
+
+.PRECIOUS: zlib.%.build
+zlib.%.build: zlib.stamp
+	$(eval BASE := $(basename $<))
+	$(eval DEST := $(basename $@))
+	$(eval ARCH := $(subst .,,$(suffix $(DEST))))
+	rsync -a $(BASE)/ $(DEST)
+	( cd $(DEST) && ./configure \
+		--static --prefix=$(PWD)/$(ARCH) \
+		)
+	$(MAKE) -C $(DEST) -sj$(CPUS) CFLAGS="$(CFLAGS) -arch $(ARCH)"
+	$(MAKE) -C $(DEST) -sj$(CPUS) CFLAGS="$(CFLAGS) -arch $(ARCH)" check
+	$(MAKE) -C $(DEST) -s install
+	touch $@
+
+$(foreach lib,$(NONARCHLIBS),$(eval $(call NONARCH_template,$(lib))))
+
+define ARCH_template
+.PRECIOUS: $(1).%.build
+$(1).%.build: $(1).stamp
+	$$(eval DEST := $$(basename $$@))
+	$$(eval ARCH := $$(subst .,,$$(suffix $$(DEST))))
+	mkdir -p $$(DEST)
+	( cd $$(DEST) && ../$(1)/configure \
+		--host=$$(ARCH)-apple-darwin11.4.2 \
+		--build=$$(ARCH)-apple-darwin11.4.2 \
+		--enable-static --disable-shared \
+		--prefix=$$(PWD)/$$(ARCH) \
+		$$($(1)_confflags) \
+		CFLAGS="$$(CFLAGS) -arch $$(ARCH)" \
+		CXXFLAGS="$$(CXXFLAGS) -arch $$(ARCH) -stdlib=libc++ -std=c++11" \
+		)
+	$$(MAKE) -C $$(DEST) -sj$(CPUS)
+	$$(MAKE) -C $$(DEST) -sj$(CPUS) check
+	$$(MAKE) -C $$(DEST) -s install
+	touch $$@
+
+$(1).build: $(1).x86_64.build $(1).i686.build
+deps:: $(1).build
+endef
+
+$(foreach lib,$(ARCHLIBS),$(eval $(call ARCH_template,$(lib))))
+
+.PRECIOUS: aria2.%.build
+aria2.%.build: zlib.%.build expat.%.build gmp.%.build cares.%.build sqlite.%.build cppunit.%.build
+	$(eval DEST := $$(basename $$@))
+	$(eval ARCH := $$(subst .,,$$(suffix $$(DEST))))
+	mkdir -p $(DEST)
+	( cd $(DEST) && ../$(SRCDIR)/configure \
+		--prefix=$(ARIA2_PREFIX) \
+		--bindir=$(ARIA2_PREFIX)/$(ARCH) \
+		--sysconfdir=/etc \
+		--with-cppunit-prefix=$(PWD)/$(ARCH) \
+		$(ARIA2_CONFFLAGS) \
+		CFLAGS="$(CFLAGS) -arch $(ARCH)" \
+		CXXFLAGS="$(CXXFLAGS) -arch $(ARCH)" \
+		PKG_CONFIG_PATH=$(PWD)/$(ARCH)/lib/pkgconfig \
+		)
+	$(MAKE) -C $(DEST) -sj$(CPUS) check
+	$(MAKE) -C $(DEST) -sj$(CPUS) install-strip
+	touch $@
+
+aria2.build: aria2.x86_64.build aria2.i686.build
+	mkdir -p $(ARIA2_PREFIX)/bin
+	# Got two binaries now. Merge them into one universal binary and remove
+	# the old ones.
+	lipo \
+		-arch x86_64 $(ARIA2_PREFIX)/x86_64/aria2c \
+		-arch i686 $(ARIA2_PREFIX)/i686/aria2c \
+		-create -output $(ARIA2_PREFIX)/bin/aria2c
+	rm -rf $(ARIA2_PREFIX)/x86_64 $(ARIA2_PREFIX)/i686
+	# Basic sanity check
+	arch -64 $(ARIA2_PREFIX)/bin/aria2c -v
+	arch -32 $(ARIA2_PREFIX)/bin/aria2c -v
+	touch $@
+
+$(ARIA2_CHANGELOG): aria2.build
+	git log --pretty=fuller --date=short $(PREV_TAG)..HEAD > $@
+
+$(ARIA2_DOCS): aria2.build
+	cp -av $(SRCDIR)/$(@F) $@
+
+$(ARIA2_DIST).tar.bz2: aria2.build $(ARIA2_DOCS) $(ARIA2_CHANGELOG)
+	find $(ARIA2_PREFIX) -exec touch "{}" \;
+	tar -cf $(ARIA2_DIST).tar.bz2 \
+		--use-compress-program=bzip2 \
+		--options='compression-level=9' \
+		$(ARIA2)
+
+$(ARIA2_DIST).pkg: aria2.build $(ARIA2_DOCS) $(ARIA2_CHANGELOG)
+	find $(ARIA2_PREFIX) -exec touch "{}" \;
+	pkgbuild \
+		--root $(ARIA2) \
+		--identifier aria2 \
+		--version $(VERSION) \
+		--install-location /usr/local/aria2 \
+		--ownership recommended \
+		out.pkg
+	pkgbuild \
+		--root $(SRCDIR)/osx-package/etc \
+		--identifier aria2.paths \
+		--version $(VERSION) \
+		--install-location /etc \
+		--ownership recommended \
+		paths.pkg
+	echo "$$ARIA2_DISTXML" > dist.xml
+	productbuild \
+		--distribution dist.xml \
+		--resources $(ARIA2_PREFIX)/share/doc/aria2 \
+		$@
+	rm -rf out.pkg paths.pkg dist.xml
+
+$(ARIA2_DIST).dmg: $(ARIA2_DIST).pkg
+	-rm -rf dmg
+	mkdir -p dmg/Docs
+	cp -av $(ARIA2_DIST).pkg dmg/aria2.pkg
+	find $(ARIA2_PREFIX)/share/doc/aria2 -type f -depth 1 -exec cp -av "{}" dmg/Docs \;
+	rm -rf dmg/Docs/README dmg/Docs/README.rst
+	cp $(SRCDIR)/osx-package/DS_Store dmg/.DS_Store
+	hdiutil create $@.uncompressed \
+		-srcfolder dmg \
+		-volname "aria2 $(VERSION) Intel Universal" \
+		-ov
+	hdiutil convert -format UDBZ -o $@ $@.uncompressed.dmg
+	hdiutil flatten $@
+	rm -rf $@.uncompressed.dmg dmg
+
+dist.build: $(ARIA2_DIST).tar.bz2 $(ARIA2_DIST).pkg $(ARIA2_DIST).dmg
+	echo 'Build success: $(ARIA2_DIST)'
+	touch $@
+
+all:: dist.build
+
+clean-dist:
+	rm -rf $(ARIA2_DIST).tar.bz2 $(ARIA2_DIST).pkg $(ARIA2_DIST).dmg
+
+clean: clean-dist
+	rm -rf *aria2*
+
+cleaner: clean
+	rm -rf *.build *.check *.stamp $(ARCHLIBS) $(NONARCHLIBS) *x86_64* *i686*
+
+really-clean: cleaner
+	rm -rf *.tar.*
+
+
+.PHONY: all clean-dist clean cleaner really-clean

BIN
osx-package/DS_Store


+ 1 - 0
osx-package/etc/manpaths.d/aria2

@@ -0,0 +1 @@
+/usr/local/aria2/share/doc/man

+ 1 - 0
osx-package/etc/paths.d/aria2c

@@ -0,0 +1 @@
+/usr/local/aria2/bin