git-annex/Makefile
Joey Hess a1b55056fc
Make Build/BuildVersion update embedded version number
This way, autobuilders can run it before building, in a tree where
git-annex was already built, and get the current git rev embedded in the
build.

Before, the version number only updated when the setup program was run,
which was up to cabal and not on every build.
2018-06-26 10:36:54 -04:00

305 lines
13 KiB
Makefile

all=git-annex git-annex-shell mans docs
# set to "./Setup" if you lack a cabal program. Or can be set to "stack"
BUILDER?=cabal
ifeq ($(BUILDER),stack)
GHC?=stack ghc --
else
GHC?=ghc
endif
PREFIX?=/usr
SHAREDIR?=share
# Am I typing :make in vim? Do a fast build.
ifdef VIM
all=fast
endif
build: $(all)
tmp/configure-stamp: Build/TestConfig.hs Build/Configure.hs
if [ "$(BUILDER)" = ./Setup ]; then ghc --make Setup; fi
if [ "$(BUILDER)" != stack ]; then \
$(BUILDER) configure --ghc-options="$(shell Build/collect-ghc-options.sh)"; \
else \
$(BUILDER) setup; \
fi
mkdir -p tmp
touch tmp/configure-stamp
git-annex: tmp/configure-stamp
$(BUILDER) build $(BUILDEROPTIONS)
if [ "$(BUILDER)" = stack ]; then \
ln -sf $$(stack path --dist-dir)/build/git-annex/git-annex git-annex; \
else \
ln -sf dist/build/git-annex/git-annex git-annex; \
fi
git-annex-shell: git-annex
ln -sf git-annex git-annex-shell
# These are not built normally.
git-union-merge.1: doc/git-union-merge.mdwn
./Build/mdwn2man git-union-merge 1 doc/git-union-merge.mdwn > git-union-merge.1
git-union-merge:
$(GHC) --make -threaded $@
install-mans: mans
install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/man/man1
install -m 0644 man/*.1 $(DESTDIR)$(PREFIX)/$(SHAREDIR)/man/man1
install-docs: docs install-mans
install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex
if [ -d html ]; then \
rsync -a --delete html/ $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex/html/; \
fi
install-bins: build
install -d $(DESTDIR)$(PREFIX)/bin
install git-annex $(DESTDIR)$(PREFIX)/bin
ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell
ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-remote-tor-annex
install-misc: build Build/InstallDesktopFile
./Build/InstallDesktopFile $(PREFIX)/bin/git-annex || true
install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/bash-completion/completions
install -m 0644 bash-completion.bash $(DESTDIR)$(PREFIX)/$(SHAREDIR)/bash-completion/completions/git-annex
install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/zsh/vendor-completions
@./git-annex --zsh-completion-script git-annex 2>/dev/null > $(DESTDIR)$(PREFIX)/$(SHAREDIR)/zsh/vendor-completions/_git-annex || \
echo "** zsh completions not installed; built with too old version of optparse-applicative"
install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/fish/completions
@./git-annex --fish-completion-script git-annex 2>/dev/null > $(DESTDIR)$(PREFIX)/$(SHAREDIR)/fish/completions/git-annex.fish || \
echo "** fish completions not installed; built with too old version of optparse-applicative"
install: install-bins install-docs install-misc
test: git-annex git-annex-shell
./git-annex test
retest: git-annex
./git-annex test --rerun-update --rerun-filter failures
# hothasktags chokes on some template haskell etc, so ignore errors
tags:
(for f in $$(find . | grep -v /.git/ | grep -v /tmp/ | grep -v /dist/ | grep -v /doc/ | egrep '\.hs$$'); do hothasktags -c --cpp -c -traditional -c --include=dist/build/autogen/cabal_macros.h $$f; done) 2>/dev/null | sort > tags
mans: Build/MakeMans
./Build/MakeMans
# If ikiwiki is available, build static html docs suitable for being
# shipped in the software package.
docs: mans
@if [ -n "`which ikiwiki`" ]; then \
LC_ALL=C TZ=UTC ikiwiki doc html -v --wikiname git-annex \
--plugin=goodstuff \
--no-usedirs --disable-plugin=openid --plugin=sidebar \
--plugin theme --set theme=actiontabs --set deterministic=1 \
--disable-plugin=shortcut --disable-plugin=smiley \
--plugin=comments --set comments_pagespec="*" \
--exclude='ikiwiki/*' \
--exclude='news/.*' --exclude='design/assistant/blog/*' \
--exclude='bugs/*' --exclude='todo/*' --exclude='forum/*' \
--exclude='users/*' --exclude='devblog/*' --exclude='thanks'; \
else \
echo "** ikiwiki not found, skipping building docs" >&2; \
fi
clean:
if [ "$(BUILDER)" != ./Setup ] && [ "$(BUILDER)" != cabal ]; then $(BUILDER) clean; fi
rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \
doc/.ikiwiki html dist tags Build/SysConfig Build/Version \
Setup Build/InstallDesktopFile Build/EvilSplicer \
Build/Standalone Build/OSXMkLibs Build/LinuxMkLibs \
Build/DistributionUpdate Build/BuildVersion Build/MakeMans \
git-annex-shell git-union-merge .tasty-rerun-log
find . -name \*.o -exec rm {} \;
find . -name \*.hi -exec rm {} \;
Build/InstallDesktopFile: Build/InstallDesktopFile.hs
$(GHC) --make $@ -Wall -fno-warn-tabs
Build/EvilSplicer: Build/EvilSplicer.hs
$(GHC) --make $@ -Wall -fno-warn-tabs
Build/Standalone: Build/Standalone.hs tmp/configure-stamp
$(GHC) --make $@ -Wall -fno-warn-tabs
Build/OSXMkLibs: Build/OSXMkLibs.hs
$(GHC) --make $@ -Wall -fno-warn-tabs
Build/LinuxMkLibs: Build/LinuxMkLibs.hs
$(GHC) --make $@ -Wall -fno-warn-tabs
Build/MakeMans: Build/MakeMans.hs
$(GHC) --make $@ -Wall -fno-warn-tabs
LINUXSTANDALONE_DEST=tmp/git-annex.linux
linuxstandalone:
$(MAKE) git-annex Build/Standalone Build/LinuxMkLibs
rm -rf "$(LINUXSTANDALONE_DEST)"
mkdir -p tmp
cp -R standalone/linux/skel "$(LINUXSTANDALONE_DEST)"
sed -i -e 's/^GIT_ANNEX_PACKAGE_INSTALL=/GIT_ANNEX_PACKAGE_INSTALL=$(GIT_ANNEX_PACKAGE_INSTALL)/' "$(LINUXSTANDALONE_DEST)/runshell"
install -d "$(LINUXSTANDALONE_DEST)/bin"
cp git-annex "$(LINUXSTANDALONE_DEST)/bin/"
strip "$(LINUXSTANDALONE_DEST)/bin/git-annex"
ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell"
ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-remote-tor-annex"
zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE
cp doc/logo_16x16.png doc/logo.svg $(LINUXSTANDALONE_DEST)
cp standalone/trustedkeys.gpg $(LINUXSTANDALONE_DEST)
./Build/Standalone "$(LINUXSTANDALONE_DEST)"
install -d "$(LINUXSTANDALONE_DEST)/git-core"
(cd "$(shell git --exec-path)" && tar c .) | (cd "$(LINUXSTANDALONE_DEST)"/git-core && tar x)
install -d "$(LINUXSTANDALONE_DEST)/templates"
(cd "$(shell git --man-path)"/../git-core/templates && tar c .) | (cd "$(LINUXSTANDALONE_DEST)"/templates && tar x)
install -d "$(LINUXSTANDALONE_DEST)/magic"
cp /usr/share/file/magic.mgc "$(LINUXSTANDALONE_DEST)/magic"
cp /usr/share/i18n -a "$(LINUXSTANDALONE_DEST)"
./Build/LinuxMkLibs "$(LINUXSTANDALONE_DEST)"
$(MAKE) install-mans DESTDIR="$(LINUXSTANDALONE_DEST)"
cd tmp/git-annex.linux && find . -type f > git-annex.MANIFEST
cd tmp/git-annex.linux && find . -type l >> git-annex.MANIFEST
cd tmp && tar c git-annex.linux | gzip -9 --rsyncable > git-annex-standalone-$(shell dpkg --print-architecture).tar.gz
# Run this target to build git-annex-standalone*.deb
debianstandalone: dpkg-buildpackage-F
# Run this target to build git-annex-standalone*.dsc
debianstandalone-dsc: dpkg-buildpackage-S
prep-standalone:
$(MAKE) undo-standalone
QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt push -a
debian/create-standalone-changelog
undo-standalone:
test -e .git
git checkout debian/changelog CHANGELOG
quilt pop -a || true
commit-standalone:
QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt refresh
dpkg-buildpackage%: prep-standalone
umask 022; dpkg-buildpackage -rfakeroot $*
$(MAKE) undo-standalone
OSXAPP_DEST=tmp/build-dmg/git-annex.app
OSXAPP_BASE=$(OSXAPP_DEST)/Contents/MacOS/bundle
osxapp:
$(MAKE) git-annex Build/Standalone Build/OSXMkLibs
# Remove all RPATHs, both because this overloads the linker on
# OSX Sierra, and to avoid the binary looking in someone's home
# directory.
if otool -l git-annex | grep -q "path "; then \
eval install_name_tool $$(otool -l git-annex | grep "path " | sed 's/.*path /-delete_rpath /' | sed 's/ (.*//') git-annex; \
fi
rm -rf "$(OSXAPP_DEST)" "$(OSXAPP_BASE)"
install -d tmp/build-dmg
cp -R standalone/osx/git-annex.app "$(OSXAPP_DEST)"
install -d "$(OSXAPP_BASE)"
cp git-annex "$(OSXAPP_BASE)"
strip "$(OSXAPP_BASE)/git-annex"
ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell"
ln -sf git-annex "$(OSXAPP_BASE)/git-remote-tor-annex"
gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE
cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt
cp standalone/trustedkeys.gpg $(OSXAPP_DEST)/Contents/MacOS
./Build/Standalone $(OSXAPP_BASE)
(cd "$(shell git --exec-path)" && tar c .) | (cd "$(OSXAPP_BASE)" && tar x)
install -d "$(OSXAPP_BASE)/templates"
(cd "$(shell git --man-path)"/../git-core/templates && tar c .) | (cd "$(OSXAPP_BASE)"/templates && tar x)
install -d "$(OSXAPP_BASE)/magic"
if [ -e "$(OSX_MAGIC_FILE)" ]; then \
cp "$(OSX_MAGIC_FILE)" "$(OSXAPP_BASE)/magic/magic.mgc"; \
else \
echo "** OSX_MAGIC_FILE not set; not including it" >&2; \
fi
# OSX looks in man dir nearby the bin
$(MAKE) install-mans DESTDIR="$(OSXAPP_BASE)/.." SHAREDIR="" PREFIX=""
./Build/OSXMkLibs $(OSXAPP_BASE)
cd $(OSXAPP_DEST) && find . -type f > Contents/MacOS/git-annex.MANIFEST
cd $(OSXAPP_DEST) && find . -type l >> Contents/MacOS/git-annex.MANIFEST
rm -f tmp/git-annex.dmg
hdiutil create -format UDBZ -size 640m -srcfolder tmp/build-dmg \
-volname git-annex -o tmp/git-annex.dmg
ANDROID_FLAGS?=
# Cross compile for Android.
# Uses https://github.com/neurocyte/ghc-android
android: Build/EvilSplicer
echo "Running native build, to get TH splices.."
if [ ! -e dist/setup/setup ]; then $(BUILDER) configure -O0 $(ANDROID_FLAGS) -fAndroidSplice; fi
mkdir -p tmp
if ! $(BUILDER) build --ghc-options=-ddump-splices 2> tmp/dump-splices; then tail tmp/dump-splices >&2; exit 1; fi
echo "Setting up Android build tree.."
./Build/EvilSplicer tmp/splices tmp/dump-splices standalone/no-th/evilsplicer-headers.hs
rsync -az --exclude tmp --exclude dist . tmp/androidtree
# Copy the files with expanded splices to the source tree, but
# only if the existing source file is not newer. (So, if a file
# used to have TH splices but they were removed, it will be newer,
# and not overwritten.)
cp -uR tmp/splices/* tmp/androidtree || true
# Some additional dependencies needed by the expanded splices.
sed -i 's/^ Build-Depends: */ Build-Depends: yesod-core, yesod-routes, shakespeare, blaze-markup, file-embed, wai-app-static, wai, unordered-containers, /' tmp/androidtree/git-annex.cabal
# Avoid warnings due to sometimes unused imports added for the splices.
sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/androidtree/git-annex.cabal
sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/androidtree/git-annex.cabal
# Cabal cannot cross compile with custom build type, so workaround.
sed -i 's/Build-type: Custom/Build-type: Simple/' tmp/androidtree/git-annex.cabal
# Build just once, but link repeatedly, for different versions of Android.
mkdir -p tmp/androidtree/dist/build/git-annex/4.0 tmp/androidtree/dist/build/git-annex/4.3 tmp/androidtree/dist/build/git-annex/5.0
if [ ! -e tmp/androidtree/dist/setup-config ]; then \
cd tmp/androidtree && CROSS_COMPILE=Android $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal configure -fAndroid $(ANDROID_FLAGS); \
fi
PATH=$(shell standalone/android/toolchainpath 4) cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \
&& mv dist/build/git-annex/git-annex dist/build/git-annex/4.0/git-annex
PATH=$(shell standalone/android/toolchainpath 4) cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \
--ghc-options=-optl-z --ghc-options=-optlnocopyreloc \
&& mv dist/build/git-annex/git-annex dist/build/git-annex/4.3/git-annex
PATH=$(shell standalone/android/toolchainpath 5) cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \
--ghc-options=-optl-z --ghc-options=-optlnocopyreloc --ghc-options=-optl-fPIE --ghc-options=-optl-pie --ghc-options=-optc-fPIE --ghc-options=-optc-pie \
&& mv dist/build/git-annex/git-annex dist/build/git-annex/5.0/git-annex
androidapp:
$(MAKE) android
$(MAKE) -C standalone/android
# Bypass cabal, and only run the main ghc --make command for a
# faster development build.
fast: dist/cabalbuild
@sh dist/cabalbuild
@ln -sf dist/build/git-annex/git-annex git-annex
@$(MAKE) tags >/dev/null 2>&1 &
dist/cabalbuild: dist/caballog
grep 'ghc --make' dist/caballog | tail -n 1 > dist/cabalbuild
dist/caballog: git-annex.cabal
$(BUILDER) configure -f"-Production" -O0 --enable-executable-dynamic
$(BUILDER) build -v2 --ghc-options="-O0 -j" | tee dist/caballog
# Hardcoded command line to make hdevtools start up and work.
# You will need some memory. It's worth it.
# Note: Don't include WebDAV or Webapp. TH use bloats memory > 500 mb!
# TODO should be possible to derive this from caballog.
hdevtools:
hdevtools --stop-server || true
hdevtools check git-annex.hs -g -cpp -g -i -g -idist/build/git-annex/git-annex-tmp -g -i. -g -idist/build/autogen -g -Idist/build/autogen -g -Idist/build/git-annex/git-annex-tmp -g -IUtility -g -DWITH_S3 -g -DWITH_ASSISTANT -g -DWITH_INOTIFY -g -DWITH_DBUS -g -DWITH_PAIRING -g -g -optP-include -g -optPdist/build/autogen/cabal_macros.h -g -odir -g dist/build/git-annex/git-annex-tmp -g -hidir -g dist/build/git-annex/git-annex-tmp -g -stubdir -g dist/build/git-annex/git-annex-tmp -g -threaded -g -Wall -g -XHaskell98 -g -XPackageImports -g -XLambdaCase
distributionupdate:
git pull
cabal configure
ghc -Wall -fno-warn-tabs --make Build/DistributionUpdate -XLambdaCase -XPackageImports
./Build/DistributionUpdate
.PHONY: git-annex git-union-merge tags