NeoLayoutViewer/Makefile

346 lines
13 KiB
Makefile

#
# Makefile
#
# Tray icon flag. Possible values:
# none, tray (for gnome 2.x) , indicator (for gnome 3.x)
ICON ?= indicator
# Build type. Possible values:
# debug, release, win
BUILD_TYPE ?= release
BINNAME = neo_layout_viewer
BINDIR = bin
# Path prefix for 'make install'
PREFIX = /usr/local
APPNAME = NeoLayoutViewer
# Prefix for package name generation
PACKAGE_NAME = neo-layout-viewer
GIT_COMMIT_VERSION=$(shell git log --oneline --max-count=1 | head --bytes=7)
ENV_FILE = .build_env
# compiler options for a debug build
#VALAC_DEBUG_OPTS = -g --save-temps
VALAC_DEBUG_OPTS = -g
# compiler options for a release build.
# Note that some cc-warnings can not resolved. Use '-X -w' to hide them.
VALAC_RELEASE_OPTS = -X -O2 --disable-assert
# falg required for pbuilder environment and deb-file naming scheme.
UBUNTU ?= 0
DISTDIR = dist
TMPDIR = tmp
ARCHS = amd64 # i386 armhf arm64
BASETGZ_DIR = /var/cache/pbuilder
ifeq ($(UBUNTU),1)
# Ubuntu, valac requires universe-component
MIRROR=http://de.archive.ubuntu.com/ubuntu/
DIST = bionic
COMPONENTS = main universe #restricted multiverse
UBUNTU_SUFFIX = ubuntu1
else
# Debian
DIST = sid
MIRROR = http://ftp.de.debian.org/debian
COMPONENTS = main
UBUNTU_SUFFIX =
endif
# Debian Packaging version number
# Pattern: [epoch:]upstream_version[-debian_revision].
# The absence of a debian_revision is equivalent to a debian_revision of 0.
RELEASE_VERSION=$(shell sed -n "/^$(PACKAGE_NAME)\s*(\([^()]*\)[)].*/{ s//\1/p; q0 }; q1" debian/changelog || echo -n "undefined" )
#Token for .orig.tar.gz-files: dpkg-source request upstream tarball without revision substring
SRC_VERSION=$(shell echo -n "$(RELEASE_VERSION)" | cut -d\- -f 1 -z)
#########################################################
# Test build under MingW for Windows
WIN ?=
ifeq ($(WIN),)
NL = \n
BINEXT =
else
BUILD_TYPE = win
BINEXT = .exe
ICON = tray
GTK_PREBUILD_ZIP=http://win32builder.gnome.org/gtk+-bundle_3.10.4-20131202_win64.zip
GEE_XZ=https://ftp.gnome.org/pub/gnome/sources/libgee/0.8/libgee-0.8.8.tar.xz
PKG_CONFIG_PATH=$(shell pwd)/win/lib/pkgconfig
#PKG_CONFIG_PATH=${HOME}/software/gtk/gtk+-3.10_win64/lib/pkgconfig
GCC_WIN = x86_64-w64-mingw32-gcc
GCC_WIN_FLAGS = -mwindows $(shell PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" pkg-config --cflags --libs gtk+-3.0 gee-$(GEEVERSION))
VALAC_RELEASE_OPTS += -D _OLD_GTK_STOCK # Old gtk-versions (<3.16) do not define `gtk_label_set_xalign`
VALAC_DEBUG_OPTS += -D _OLD_GTK_STOCK
endif
#########################################################
EXEC_PREFIX = $(PREFIX)
DATADIR = $(PREFIX)/share
VALAC = valac -D $(ICON) \
--Xcc="-lm" --Xcc="-DXK_TECHNICAL" --Xcc="-DXK_PUBLISHING" --Xcc="-DXK_APL"
VAPIDIR = --vapidir=vapi/
# Source files
SRC = src/version.vala \
src/main.vala \
src/app.vala \
src/neo-window.vala \
src/scaling-image.vala \
src/config-manager.vala
ifeq ($(WIN),)
VALAC_DEBUG_OPTS += -D _NO_WIN
VALAC_RELEASE_OPTS += -D _NO_WIN
SRC += src/key-overlay.vala \
src/keybinding-manager.vala \
csrc/keysend.c \
csrc/checkModifier.c
endif
# Asset files
ASSET_FILES=$(wildcard assets/**/*.png)
# Test for valac version, workaround for Arch Linux bug
ifeq ($(wildcard /usr/include/gee-0.8),)
# Similar, but for Windows/MingW
ifeq ($(wildcard /mingw64/include/gee-0.8),)
GEEVERSION=1.0
else
GEEVERSION=0.8
endif
else
GEEVERSION=0.8
endif
# Packages
PKGS = --pkg x11 --pkg keysym --pkg gtk+-3.0 --pkg gee-$(GEEVERSION) --pkg gdk-x11-3.0 --pkg posix --pkg gdk-3.0
# Add some args if tray icon is demanded.
ifeq ($(ICON),tray)
SRC += src/tray.vala
endif
ifeq ($(ICON),indicator)
SRC += src/indicator.vala
PKGS += --pkg appindicator3-0.1
endif
.PHONY: debug release install clean last_build_env
# .FORCE: last_build_env
# The target respects BUILD_TYPE and cleaning if it changes
all: info last_build_env "$(BINDIR)/$(BINNAME)$(BINEXT)"
@echo "Done"
"$(BINDIR)/$(BINNAME)$(BINEXT)": $(SRC) Makefile "$(BINDIR)"
make build_$(BUILD_TYPE)
# Remove binary if current env differs from last build env
# This toggles a rebuild.
last_build_env:
@(test "$$(env|sort)" = "$$(test -f $(ENV_FILE) && cat $(ENV_FILE) )" \
&& echo "Same environment as last build.") \
|| (echo "Env has changed. Force build" \
&& make clean \
&& env | sort > "$(ENV_FILE)" \
)
# Clean release build, similar to 'BUILD_TYPE=release make all'
release: clean build_release
info:
@/bin/echo -e " $(NL)"\
"Buildtype: $(BUILD_TYPE)$(NL)" \
"Trayicon: $(ICON)$(NL)" \
"$(NL)" \
"Notes:$(NL)" \
" Use 'ICON=... make' to switch type of panel menu.$(NL)" \
" indicator: For gnome 3.x (default)$(NL)" \
" tray: For gnome 2.x$(NL)" \
" none: Disables icon$(NL)$(NL)" \
" Use 'BUILD_TYPE=[release|debug] make' to switch build type$(NL)$(NL)" \
gen_version:
@/bin/echo -e "namespace NeoLayoutViewer{$(NL)" \
"public const string RELEASE_VERSION = \"$(RELEASE_VERSION)\";$(NL)" \
"public const string GIT_COMMIT_VERSION = \"$(GIT_COMMIT_VERSION)\";$(NL)" \
"public const string SHARED_ASSETS_PATH = \"$(DATADIR)/$(APPNAME)/assets\";$(NL)" \
"}" \
> src/version.vala
src/version.vala: Makefile gen_version
"$(BINDIR)":
@test -d "$(BINDIR)" || \
(mkdir -p "$(BINDIR)" && ln -s ../assets "$(BINDIR)/assets")
"$(DISTDIR)":
@test -d "$(DISTDIR)" || \
(mkdir -p "$(DISTDIR)")
"$(TMPDIR)":
@test -d "$(TMPDIR)" || \
(mkdir -p "$(TMPDIR)")
build_debug: $(SRC) "$(BINDIR)"
$(VALAC) $(VAPIDIR) $(VALAC_DEBUG_OPTS) $(SRC) -o "$(BINDIR)/$(BINNAME)$(BINEXT)" $(PKGS) $(CC_INCLUDES)
build_release: $(SRC) "$(BINDIR)"
$(VALAC) $(VAPIDIR) $(VALAC_RELEASE_OPTS) $(SRC) -o "$(BINDIR)/$(BINNAME)$(BINEXT)" $(PKGS) $(CC_INCLUDES)
# Two staged compiling
build_release2: $(SRC) "$(BINDIR)"
$(VALAC) --ccode $(VAPIDIR) $(VALAC_RELEASE_OPTS) $(SRC) $(PKGS) $(CC_INCLUDES)
gcc $(SRC:.vala=.c) $(CC_INCLUDES) -o "$(BINDIR)/$(BINNAME)$(BINEXT)" \
`pkg-config --cflags --libs gtk+-3.0 gee-$(GEEVERSION)`
man: man/neo_layout_viewer.1.gz
man/%.gz: man/%
gzip -c "$<" > "$@"
install: man
test -f "$(BINDIR)/$(BINNAME)$(BINEXT)" || make all
install -d $(EXEC_PREFIX)/bin
install -D -m 0755 "$(BINDIR)/$(BINNAME)$(BINEXT)" "$(EXEC_PREFIX)/bin"
$(foreach ASSET_FILE,$(ASSET_FILES), \
install -D -m 0644 $(ASSET_FILE) "$(DATADIR)/$(APPNAME)/$(ASSET_FILE)" ; )
install -d $(PREFIX)/share/man/man1/
install -t $(PREFIX)/share/man/man1/ man/neo_layout_viewer.1.gz
install -D -t $(PREFIX)/share/applications/ Keyboard_Layout_Viewer.desktop
uninstall:
@rm -fv "$(EXEC_PREFIX)/bin/$(BINNAME)$(BINEXT)"
@test -d "$(DATADIR)/$(APPNAME)/assets" && rm -v -r "$(DATADIR)/$(APPNAME)"
# Prefixed with test because of dangerous -r-flag...
@rm -fv $(PREFIX)/share/man/man1/neo_layout_viewer.1.gz
@rm -v -r $(PREFIX)/share/applications/Keyboard_Layout_Viewer.desktop
# clean all build files, but not dist results.
clean:
@rm -v -d -f *~ *.c src/*.c src/*~ "$(BINDIR)"/* "$(BINDIR)" "$(ENV_FILE)"
@rm -v -d -f -r "$(TMPDIR)"/*
@rm -v -d -f "$(TMPDIR)"
@rm -v -f man/*.gz
run:
"$(BINDIR)/$(BINNAME)$(BINEXT)"
######################################################
## Targets for .*deb build
src-package: "$(DISTDIR)"
tar czf "$(DISTDIR)"/neo-layout-viewer_$(RELEASE_VERSION)-src.tar.gz \
--exclude=.git --exclude=.gitignore --exclude=win \
--exclude=bin --exclude=man/*.gz --exclude=.pc\
--exclude=dist --exclude=tmp \
--transform 's,^\./,neo-layout-viewer-$(RELEASE_VERSION)/,' \
.
dist-package: "$(DISTDIR)" release man
tar czf "$(DISTDIR)"/neo-layout-viewer_$(RELEASE_VERSION).tgz \
--transform 's,^$(BINDIR)/,,' \
--transform 's,^,neo-layout-viewer-$(RELEASE_VERSION)/,' \
"$(BINDIR)/$(BINNAME)" assets AUTHORS COPYING README.md \
man/*.gz
deb-packages: "$(TMPDIR)" "$(DISTDIR)" src-package
cp "$(DISTDIR)"/neo-layout-viewer_$(RELEASE_VERSION)-src.tar.gz "$(TMPDIR)"/neo-layout-viewer_$(SRC_VERSION).orig.tar.gz && \
cd "$(TMPDIR)" && \
tar xzf neo-layout-viewer_$(SRC_VERSION).orig.tar.gz && \
cd neo-layout-viewer-$(RELEASE_VERSION) && \
for arch in $(ARCHS); do \
sudo mkdir -p $(BASETGZ_DIR)/$(DIST)-aptcache/ && \
sudo pbuilder update --override-config --distribution "$(DIST)" --mirror "$(MIRROR)" --components "$(COMPONENTS)" --architecture $$arch --basetgz $(BASETGZ_DIR)/$(DIST)-$$arch-base.tgz --aptcache $(BASETGZ_DIR)/$(DIST)-aptcache/ || \
sudo pbuilder create --override-config --distribution $(DIST) --mirror $(MIRROR) --components "$(COMPONENTS)" --architecture $$arch --basetgz $(BASETGZ_DIR)/$(DIST)-$$arch-base.tgz --aptcache $(BASETGZ_DIR)/$(DIST)-aptcache/ && \
DEB_BUILD_OPTIONS="noautodbgsym" pdebuild --buildresult .. --debbuildopts "-i -us -uc -b" -- --override-config --distribution $(DIST) --mirror $(MIRROR) --components "$(COMPONENTS)" --architecture $$arch --basetgz $(BASETGZ_DIR)/$(DIST)-$$arch-base.tgz --aptcache $(BASETGZ_DIR)/$(DIST)-aptcache/ && \
mv ../neo-layout-viewer_$(RELEASE_VERSION)_$$arch*deb ../../dist/neo-layout-viewer_$(RELEASE_VERSION)$(UBUNTU_SUFFIX)_$$arch.deb ; \
done
deb-package: "$(TMPDIR)" "$(DISTDIR)" src-package
cp "$(DISTDIR)"/neo-layout-viewer_$(RELEASE_VERSION)-src.tar.gz "$(TMPDIR)"/neo-layout-viewer_$(SRC_VERSION).orig.tar.gz && \
cd "$(TMPDIR)" && \
tar xzf neo-layout-viewer_$(SRC_VERSION).orig.tar.gz && \
cd neo-layout-viewer-$(RELEASE_VERSION) && \
DEB_BUILD_OPTIONS="noautodbgsym" pdebuild --buildresult .. --debbuildopts "-i -us -uc -b" && \
mv ../neo-layout-viewer_$(RELEASE_VERSION)_$(shell dpkg --print-architecture).deb ../../dist/neo-layout-viewer_$(RELEASE_VERSION)$(UBUNTU_SUFFIX)_$(shell dpkg --print-architecture).deb
dist: src-package dist-package deb-packages
######################################################
## Windows stuff
# Building under MingW
build_win: $(SRC)
$(VALAC) $(VAPIDIR) $(VALAC_RELEASE_OPTS) $(SRC) -o "$(BINDIR)/$(BINNAME)$(BINEXT)" $(PKGS) $(CC_INCLUDES)
# Cross compiling under Debian/Ubuntu
build_cross_win: bin/libgtk-3-0.dll
test "$(WIN)" = "1" || (echo "Call this target with WIN=1" && exit 1)
echo "Flags: $(GCC_WIN_FLAGS)"
PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" \
$(VALAC) --ccode $(VAPIDIR) $(VALAC_RELEASE_OPTS) $(SRC) $(PKGS) $(CC_INCLUDES)
PKG_CONFIG_PATH="$(PKG_CONFIG_PATH), \
$(GCC_WIN) $(SRC:.vala=.c) -o "$(BINDIR)/$(BINNAME)$(BINEXT)" $(GCC_WIN_FLAGS)
bin/libgtk-3-0.dll:
WIN=1 make win_gtk
win_download_gtk:
test "$(WIN)" = "1" || (echo "Call this target with WIN=1" && exit 1)
test -d win || mkdir win
test -f win/$$(basename "$(GTK_PREBUILD_ZIP)") || \
( cd win && wget -c "$(GTK_PREBUILD_ZIP), && \
unzip $$(basename "$(GTK_PREBUILD_ZIP)") )
cd win && find -name '*.pc' | while read pc; do sed -e "s@^prefix=.*@prefix=$$PWD@" -i "$$pc"; done
win_build_gee:
test "$(WIN)" = "1" || (echo "Call this target with WIN=1" && exit 1)
cd win && wget -c "$(GEE_XZ)" && \
tar xJvf ./libgee-0.8.8.tar.xz > /dev/null
cd win/libgee-0.8.8 && \
sed -i -e 's/if test ".cross_compiling" != yes; then/if test 0 != 0; then/' ./configure
cd win/libgee-0.8.8 && \
PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) CC=$(GCC_WIN) \
CC_FLAGS="$(GCC_WIN_FLAGS)" \
./configure --build=x86_64 --prefix=$(PKG_CONFIG_PATH)/../.. && \
make && make install
win_gtk: win_download_gtk win_build_gee
test "$(WIN)" = "1" || (echo "Call this target with WIN=1" && exit 1)
cp win/bin/*.dll bin/.
print_version:
@echo "Source archive: $(PACKAGE_NAME)_$(SRC_VERSION).orig.tar.gz"
@echo "Deb file: $(PACKAGE_NAME)_$(RELEASE_VERSION)_$(shell dpkg --print-architecture).deb"
# Test to avoid sudo. Unfortunately, dpkg-buildpackage still ask...
deb-packages_as_user: "$(TMPDIR)" "$(DISTDIR)" src-package
cp "$(DISTDIR)"/neo-layout-viewer_$(RELEASE_VERSION)-src.tar.gz "$(TMPDIR)"/neo-layout-viewer_$(SRC_VERSION).orig.tar.gz && \
cd "$(TMPDIR)" && \
tar xzf neo-layout-viewer_$(SRC_VERSION).orig.tar.gz && \
cd neo-layout-viewer-$(RELEASE_VERSION) && \
for arch in $(ARCHS); do \
mkdir -p $(BASETGZ_DIR)/$(DIST)-aptcache/ && \
test "$(SKIP_PBUILDER_UPDATE)" = "1" || \
pbuilder update --override-config --distribution "$(DIST)" --mirror "$(MIRROR)" --components "$(COMPONENTS)" --architecture $$arch --basetgz $(BASETGZ_DIR)/$(DIST)-$$arch-base.tgz --aptcache $(BASETGZ_DIR)/$(DIST)-aptcache/ || \
pbuilder create --override-config --distribution $(DIST) --mirror $(MIRROR) --components "$(COMPONENTS)" --architecture $$arch --basetgz $(BASETGZ_DIR)/$(DIST)-$$arch-base.tgz --aptcache $(BASETGZ_DIR)/$(DIST)-aptcache/ && \
DEB_BUILD_OPTIONS="noautodbgsym" pdebuild --buildresult .. --debbuildopts "-i -us -uc -b" -- --override-config --distribution $(DIST) --mirror $(MIRROR) --components "$(COMPONENTS)" --architecture $$arch --basetgz $(BASETGZ_DIR)/$(DIST)-$$arch-base.tgz --aptcache $(BASETGZ_DIR)/$(DIST)-aptcache/ && \
mv ../neo-layout-viewer_$(RELEASE_VERSION)_$$arch*deb ../../dist/neo-layout-viewer_$(RELEASE_VERSION)$(UBUNTU_SUFFIX)_$$arch.deb ; \
done