346 lines
13 KiB
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
|
|
|
|
|