X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=Makefile;h=0e715b9d04813fc191ffc76a04bc60c99ca2ad1c;hb=06885b4bc75b40431a9098b6b28915bae79a3f20;hp=8a3c72e26648666fbaae6ae1bc81dc6cdf6d3cfe;hpb=70f5b2bbcbac3df8bf855895ff51d63a5e9d333c;p=nikiroo-utils.git diff --git a/Makefile b/Makefile index 8a3c72e..0e715b9 100644 --- a/Makefile +++ b/Makefile @@ -1,131 +1,255 @@ -# Jexer - Java Text User Interface - Makefile # -# $Id$ +# Java Makefile: +# > NAME: name of project (used for jar output file) +# > MAIN: path to main java source to compile +# > MORE: path to supplementary needed resources not linked from MAIN +# > TEST: path to main test source to compile +# > JAR_FLAGS: a list of things to pack, each usually prefixed with "-C bin/" +# > SJAR_FLAGS: like JAR_FLAGS, but for *-sources.jar +# > PREFIX: usually /usr/local (where to install the program) # -# This program is licensed under the GNU Lesser General Public License -# Version 3. Please see the file "COPYING" in this directory for more -# information about the GNU Lesser General Public License Version 3. -# -# Copyright (C) 2015 Kevin Lamonte -# -# This library is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation; either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see -# http://www.gnu.org/licenses/, or write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 -# USA +NAME = nikiroo-utils +MAIN = be/nikiroo/tests/utils/Test +TEST = be/nikiroo/tests/utils/Test +# Option for this program: UI=android (or UI=awt by default) +ifeq ($(UI),android) +MORE += be/nikiroo/utils/android/test/TestAndroid +TEST += be/nikiroo/utils/android/ImageUtilsAndroid +else +MORE += be/nikiroo/utils/ui/ImageUtilsAwt +MORE += be/nikiroo/utils/ui/ImageTextAwt +TEST += be/nikiroo/utils/ui/test/TestUI +endif + + +JAR_MISC = -C ./ LICENSE -C ./ VERSION -C libs/ licenses +JAR_FLAGS += -C bin/ be -C bin/ org $(JAR_MISC) +SJAR_FLAGS += -C src/ org -C src/ be $(JAR_MISC) + +PREFIX = /usr/local + +# Makefile base template +# +# Version: +# - 1.0.0: add a version comment +# - 1.1.0: add 'help', 'sjar' +# - 1.2.0: add 'apk' +# - 1.2.1: improve 'apk' and add 'android' +# - 1.3.0: add 'man' for man(ual) pages +# - 1.4.0: remove android stuff (not working anyway) +# - 1.5.0: include sources and readme/changelog in jar +# - 1.5.1: include binaries from libs/bin/ into the jar +# - 1.6.0: rework the system without need of a ./configure.sh, add uninstall -# This Makefile is a quick-and-dirty build that is useful to execute -# the Demo1 application that uses stdin/stdout. Use 'make run'. -# -# Generally it would be better to use the ant build. - -default: all - -.SUFFIXES: .class .java - -SRC_DIR = src -ANT_TARGET_DIR = build -TARGET_DIR = classes - -JEXER_SRC = $(SRC_DIR)/jexer/TApplication.java \ - $(SRC_DIR)/jexer/TAction.java \ - $(SRC_DIR)/jexer/TButton.java \ - $(SRC_DIR)/jexer/TLabel.java \ - $(SRC_DIR)/jexer/TCommand.java \ - $(SRC_DIR)/jexer/TKeypress.java \ - $(SRC_DIR)/jexer/TText.java \ - $(SRC_DIR)/jexer/THScroller.java \ - $(SRC_DIR)/jexer/TVScroller.java \ - $(SRC_DIR)/jexer/TWidget.java \ - $(SRC_DIR)/jexer/bits/GraphicsChars.java \ - $(SRC_DIR)/jexer/bits/Color.java \ - $(SRC_DIR)/jexer/bits/CellAttributes.java \ - $(SRC_DIR)/jexer/bits/Cell.java \ - $(SRC_DIR)/jexer/bits/ColorTheme.java \ - $(SRC_DIR)/jexer/bits/MnemonicString.java \ - $(SRC_DIR)/jexer/event/TInputEvent.java \ - $(SRC_DIR)/jexer/event/TCommandEvent.java \ - $(SRC_DIR)/jexer/event/TKeypressEvent.java \ - $(SRC_DIR)/jexer/event/TMenuEvent.java \ - $(SRC_DIR)/jexer/event/TMouseEvent.java \ - $(SRC_DIR)/jexer/event/TResizeEvent.java \ - $(SRC_DIR)/jexer/menu/TMenu.java \ - $(SRC_DIR)/jexer/menu/TMenuItem.java \ - $(SRC_DIR)/jexer/menu/TMenuSeparator.java \ - $(SRC_DIR)/jexer/menu/TSubMenu.java \ - $(SRC_DIR)/jexer/session/SessionInfo.java \ - $(SRC_DIR)/jexer/session/TSessionInfo.java \ - $(SRC_DIR)/jexer/session/TTYSessionInfo.java \ - $(SRC_DIR)/jexer/io/Screen.java \ - $(SRC_DIR)/jexer/io/ECMA48Screen.java \ - $(SRC_DIR)/jexer/io/ECMA48Terminal.java \ - $(SRC_DIR)/jexer/backend/Backend.java \ - $(SRC_DIR)/jexer/backend/ECMA48Backend.java \ - $(SRC_DIR)/jexer/demos/Demo1.java - -JEXER_BIN = $(TARGET_DIR)/jexer/TApplication.class \ - $(TARGET_DIR)/jexer/TAction.class \ - $(TARGET_DIR)/jexer/TButton.class \ - $(TARGET_DIR)/jexer/TLabel.class \ - $(TARGET_DIR)/jexer/TCommand.class \ - $(TARGET_DIR)/jexer/TKeypress.class \ - $(TARGET_DIR)/jexer/TText.class \ - $(TARGET_DIR)/jexer/THScroller.class \ - $(TARGET_DIR)/jexer/TVScroller.class \ - $(TARGET_DIR)/jexer/TWidget.class \ - $(TARGET_DIR)/jexer/bits/GraphicsChars.class \ - $(TARGET_DIR)/jexer/bits/Color.class \ - $(TARGET_DIR)/jexer/bits/CellAttributes.class \ - $(TARGET_DIR)/jexer/bits/Cell.class \ - $(TARGET_DIR)/jexer/bits/ColorTheme.class \ - $(TARGET_DIR)/jexer/bits/MnemonicString.class \ - $(TARGET_DIR)/jexer/event/TInputEvent.class \ - $(TARGET_DIR)/jexer/event/TCommandEvent.class \ - $(TARGET_DIR)/jexer/event/TKeypressEvent.class \ - $(TARGET_DIR)/jexer/event/TMenuEvent.class \ - $(TARGET_DIR)/jexer/event/TMouseEvent.class \ - $(TARGET_DIR)/jexer/event/TResizeEvent.class \ - $(TARGET_DIR)/jexer/menu/TMenu.class \ - $(TARGET_DIR)/jexer/menu/TMenuItem.class \ - $(TARGET_DIR)/jexer/menu/TMenuSeparator.class \ - $(TARGET_DIR)/jexer/menu/TSubMenu.class \ - $(TARGET_DIR)/jexer/session/SessionInfo.class \ - $(TARGET_DIR)/jexer/session/TSessionInfo.class \ - $(TARGET_DIR)/jexer/session/TTYSessionInfo.class \ - $(TARGET_DIR)/jexer/io/Screen.class \ - $(TARGET_DIR)/jexer/io/ECMA48Screen.class \ - $(TARGET_DIR)/jexer/io/ECMA48Terminal.class \ - $(TARGET_DIR)/jexer/backend/Backend.class \ - $(TARGET_DIR)/jexer/backend/ECMA48Backend.class \ - $(TARGET_DIR)/jexer/demos/Demo1.class JAVAC = javac -JAVAFLAGS = -g -deprecation +JAVAC_FLAGS += -encoding UTF-8 -d ./bin/ -cp ./src/ +JAVA = java +JAVA_FLAGS += -cp ./bin/ +JAR = jar +RJAR = java +RJAR_FLAGS += -jar + +all: build jar man + +help: + @echo "Usual options:" + @echo "==============" + @echo " make : to build the jar file and man pages IF possible" + @echo " make help : to get this help screen" + @echo " make libs : to update the libraries into src/" + @echo " make build : to update the binaries (not the jar)" + @echo " make test : to update the test binaries" + @echo " make build jar : to update the binaries and jar file" + @echo " make sjar : to create the sources jar file" + @echo " make clean : to clean the directory of intermediate files" + @echo " make mrpropre : to clean the directory of all outputs" + @echo " make run : to run the program from the binaries" + @echo " make run-test : to run the test program from the binaries" + @echo " make jrun : to run the program from the jar file" + @echo " make install : to install the application into $$PREFIX" + @echo " make uninstall : to uninstall the application from $$PREFIX" + @echo " make man : to make the manual pages (requires pandoc)" + +.PHONY: all clean mrproper mrpropre build run jrun jar sjar resources \ + test-resources install libs man love + +bin: + @mkdir -p bin -all: jexer +jar: $(NAME).jar -run: jexer run-demo1 +sjar: $(NAME)-sources.jar -all-demos: jexer +build: resources + @echo Compiling program... + @echo " src/$(MAIN)" + @$(JAVAC) $(JAVAC_FLAGS) "src/$(MAIN).java" + @[ "$(MORE)" = "" ] || for sup in $(MORE); do \ + echo " src/$$sup" ;\ + $(JAVAC) $(JAVAC_FLAGS) "src/$$sup.java" ; \ + done -run-demo1: all-demos - java -cp $(TARGET_DIR) jexer.demos.Demo1 +test: test-resources + @[ -e bin/$(MAIN).class ] || echo You need to build the sources + @[ -e bin/$(MAIN).class ] + @echo Compiling test program... + @[ "$(TEST)" != "" ] || echo No test sources defined. + @[ "$(TEST)" = "" ] || for sup in $(TEST); do \ + echo " src/$$sup" ;\ + $(JAVAC) $(JAVAC_FLAGS) "src/$$sup.java" ; \ + done clean: - -rm -r $(ANT_TARGET_DIR) - -rm -r $(TARGET_DIR) - -mkdir $(TARGET_DIR) + rm -rf bin/ + @echo Removing sources taken from libs... + @for lib in libs/*-sources.jar libs/*-sources.patch.jar; do \ + if [ "$$lib" != 'libs/*-sources.jar' \ + -a "$$lib" != 'libs/*-sources.patch.jar' ]; \ + then \ + basename "$$lib"; \ + jar tf "$$lib" | while read -r ln; do \ + [ -f "src/$$ln" ] && rm "src/$$ln"; \ + done; \ + jar tf "$$lib" | tac | while read -r ln; do \ + if [ -d "src/$$ln" ]; then \ + rmdir "src/$$ln" 2>/dev/null || true; \ + fi; \ + done; \ + fi \ + done + +mrproper: mrpropre +mrpropre: clean man + rm -f $(NAME).jar + rm -f $(NAME)-sources.jar + [ ! -e VERSION ] || rm -f "$(NAME)-`cat VERSION`.jar" + [ ! -e VERSION ] || rm -f "$(NAME)-`cat VERSION`-sources.jar" + +love: + @echo " ...not war." + +resources: libs + @echo Copying resources and documentation into bin/... + @if ! cp *.md bin/ 2>/dev/null; then \ + if [ -e VERSION ]; then \ + cp VERSION bin/no-documentation.md; \ + else \ + echo > bin/no-documentation.md; \ + fi; \ + fi + @cd src && find . | grep -v '\.java$$' \ + | grep -v '/test/' | while read -r ln; do \ + if [ -f "$$ln" ]; then \ + dir="`dirname "$$ln"`"; \ + mkdir -p "../bin/$$dir" ; \ + cp "$$ln" "../bin/$$ln" ; \ + fi ; \ + done + @[ ! -e VERSION ] || cp VERSION bin/ + +test-resources: resources + @echo Copying test resources into bin/... + @cd src && find . | grep -v '\.java$$' \ + | grep '/test/' | while read -r ln; do \ + if [ -f "$$ln" ]; then \ + dir="`dirname "$$ln"`"; \ + mkdir -p "../bin/$$dir" ; \ + cp "$$ln" "../bin/$$ln" ; \ + fi ; \ + done + +libs: bin + @if [ ! -e bin/libs -a -d libs ]; then \ + echo Extracting sources from libs...; \ + cd src; \ + for lib in ../libs/*-sources.jar \ + ../libs/*-sources.patch.jar; do \ + if [ "$$lib" != '../libs/*-sources.jar' \ + -a "$$lib" != '../libs/*-sources.patch.jar' ]; \ + then \ + basename "$$lib"; \ + jar xf "$$lib"; \ + fi; \ + done; \ + fi; + @[ ! -d libs ] || touch bin/libs + +$(NAME)-sources.jar: libs + @echo Making sources JAR file... + @echo > bin/manifest + @if [ "$(SJAR_FLAGS)" = "" ]; then \ + echo No sources JAR file defined, skipping; \ + else \ + echo Creating $(NAME)-sources.jar...; \ + $(JAR) cfm $(NAME)-sources.jar \ + bin/manifest -C ./ *.md $(SJAR_FLAGS); \ + if [ -e VERSION ]; then \ + echo Copying to "$(NAME)-`cat VERSION`-sources.jar"...;\ + cp $(NAME)-sources.jar \ + "$(NAME)-`cat VERSION`-sources.jar"; \ + fi; \ + fi; + +$(NAME).jar: resources + @if [ -d libs/bin/ ]; then \ + echo "Copying additional binaries from libs/bin/ into bin/...";\ + cp -r libs/bin/* bin/; \ + fi; + @echo "Copying sources into bin/..." + @cp -r src/* bin/ + @echo "Making jar..." + @echo "Main-Class: `echo "$(MAIN)" | sed 's:/:.:g'`" > bin/manifest + @echo >> bin/manifest + $(JAR) cfm $(NAME).jar bin/manifest -C ./ *.md $(JAR_FLAGS) + @[ ! -e VERSION ] || echo Copying to "$(NAME)-`cat VERSION`.jar"... + @[ ! -e VERSION ] || cp $(NAME).jar "$(NAME)-`cat VERSION`.jar" + +run: + @echo Running "$(NAME)"... + $(JAVA) $(JAVA_FLAGS) $(MAIN) + +jrun: + @echo Running "$(NAME).jar"... + $(RJAR) $(RJAR_FLAGS) $(NAME).jar + +run-test: + @echo Running tests for "$(NAME)"... + @[ "$(TEST)" != "" ] || echo No test sources defined. + @if [ "`whereis tput`" = "tput:" ]; then \ + ok='"[ ok ]"'; \ + ko='"[ !! ]"'; \ + cols=80; \ + else \ + ok="`tput bold`[`tput setf 2` OK `tput init``tput bold`]`tput init`"; \ + ko="`tput bold`[`tput setf 4` !! `tput init``tput bold`]`tput init`"; \ + cols="`tput cols`"; \ + fi; \ + [ "$(TEST)" = "" ] || ( \ + clear; \ + for test in $(TEST); do \ + $(JAVA) $(JAVA_FLAGS) "$$test" "$$cols" "$$ok" "$$ko"; \ + done; \ + ); + + +install: man + @[ -e $(NAME).jar ] || echo You need to build the jar + @[ -e $(NAME).jar ] + mkdir -p "$(PREFIX)/lib" "$(PREFIX)/bin" + cp $(NAME).jar "$(PREFIX)/lib/" + ( \ + echo "#!/bin/sh"; \ + echo "$(RJAR) $(RJAR_FLAGS) \"$(PREFIX)/lib/$(NAME).jar\" \"\$$@\"" \ + ) > "$(PREFIX)/bin/$(NAME)" + chmod a+rx "$(PREFIX)/bin/$(NAME)" + +uninstall: man + rm "$(PREFIX)/bin/$(NAME)" + rm "$(PREFIX)/lib/$(NAME).jar" + rmdir "$(PREFIX)/bin" 2>/dev/null + +man: + @$(MAKE) -f man.d $(MAKECMDGOALS) NAME=$(NAME) -jexer: $(JEXER_SRC) - $(JAVAC) $(JAVAFLAGS) -sourcepath $(SRC_DIR) -d $(TARGET_DIR) $(JEXER_SRC)