1#
2#  Copyright (c) 2008-2014,
3#  Reto Buerki, Adrian-Ken Rueegsegger
4#
5#  This file is part of Alog.
6#
7#  Alog is free software; you can redistribute it and/or modify
8#  it under the terms of the GNU Lesser General Public License as published
9#  by the Free Software Foundation; either version 2.1 of the License, or
10#  (at your option) any later version.
11#
12#  Alog is distributed in the hope that it will be useful,
13#  but WITHOUT ANY WARRANTY; without even the implied warranty of
14#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15#  GNU Lesser General Public License for more details.
16#
17#  You should have received a copy of the GNU Lesser General Public License
18#  along with Alog; if not, write to the Free Software
19#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
20#  MA  02110-1301  USA
21#
22
23# DESTDIR and PREFIX have their usual meanings.
24PREFIX ?= $(HOME)/libraries
25
26INSTALL = install
27
28MAJOR = 0
29MINOR = 6
30REVISION = 1
31VERSION = $(MAJOR).$(MINOR).$(REVISION)
32ALOG = libalog-$(VERSION)
33TARBALL = $(ALOG).tar.bz2
34
35SO_LIBRARY = libalog.so.$(VERSION)
36A_LIBRARY = libalog.a
37LIBRARY_KIND = dynamic
38
39SOURCEDIR = src
40OBJECTDIR = obj
41LIBDIR = lib
42COVDIR = cov
43ALI_FILES = lib/$(LIBRARY_KIND)/*.ali
44GPR_FILE = gnat/alog.gpr
45
46PWD = `pwd`
47
48
49# GNAT_BUILDER_FLAGS, ADAFLAGS, CFLAGS and GNATFLAGS may be overridden in the
50# environment or on the command line.
51CFLAGS             ?= -W -Wall -Werror -O3
52GNAT_BUILDER_FLAGS ?= -R -j$(NUM_CPUS)
53GNATFLAGS          ?= ${GNAT_BUILDER_FLAGS}
54# GMAKE_OPTS should not be overridden because -p is essential.
55GMAKE_OPTS = -g -p ${GNATFLAGS} \
56  $(foreach v,ADAFLAGS CFLAGS CPPFLAGS LDFLAGS,"-X$(v)=$($(v))")
57
58all: build_lib
59
60tests: build_tests
61	@$(OBJECTDIR)/test_runner
62
63build_lib: build_lib_$(LIBRARY_KIND)
64build_lib_dynamic:
65	@gprbuild $(GMAKE_OPTS) -Palog -XALOG_VERSION="$(VERSION)"
66build_lib_static:
67	@gprbuild $(GMAKE_OPTS) -Palog -XALOG_VERSION=
68
69build_tests:
70	@gprbuild $(GMAKE_OPTS) -Palog_tests -XALOG_BUILD="tests" -XALOG_VERSION=
71
72build_all: build_lib build_tests
73
74clean:
75	@rm -f $(TARBALL)
76	@rm -rf $(OBJECTDIR)
77	@rm -rf $(LIBDIR)
78	@rm -rf $(COVDIR)
79	$(MAKE) -C doc clean
80
81dist:
82	@echo "Creating release tarball $(TARBALL) ... "
83	@git archive --format=tar HEAD --prefix $(ALOG)/ | bzip2 > $(TARBALL)
84
85install: install_lib install_$(LIBRARY_KIND)
86
87install_lib: build_lib
88	@mkdir -p $(DESTDIR)$(PREFIX)/include/alog
89	@mkdir -p $(DESTDIR)$(PREFIX)/lib/alog
90	@mkdir -p $(DESTDIR)$(PREFIX)/lib/gnat
91	$(INSTALL) -m 644 $(SOURCEDIR)/*.ad[bs] $(DESTDIR)$(PREFIX)/include/alog
92	$(INSTALL) -m 444 $(ALI_FILES) $(DESTDIR)$(PREFIX)/lib/alog
93	$(INSTALL) -m 644 $(GPR_FILE) $(DESTDIR)$(PREFIX)/lib/gnat
94
95install_static: $(DESTDIR)$(PREFIX)/lib
96	$(INSTALL) -m 444 $(LIBDIR)/$(LIBRARY_KIND)/$(A_LIBRARY) $<
97
98install_dynamic: $(DESTDIR)$(PREFIX)/lib
99	$(INSTALL) -m 444 $(LIBDIR)/$(LIBRARY_KIND)/$(SO_LIBRARY) $<
100	@cd $(DESTDIR)$(PREFIX)/lib && ln -sf $(SO_LIBRARY) libalog.so
101
102install_tests: build_tests
103	$(INSTALL) -v -d $(DESTDIR)$(PREFIX)/tests
104	$(INSTALL) -m 755 $(OBJECTDIR)/test_runner $(DESTDIR)$(PREFIX)/tests/
105	@cp -vr data $(DESTDIR)$(PREFIX)/tests
106
107$(DESTDIR)$(PREFIX)/lib:
108	@mkdir -p $@
109
110cov:
111	@mkdir -p $(COVDIR)
112	@rm -f $(OBJECTDIR)/cov/*.gcda
113	@gprbuild $(GMAKE_OPTS) -Palog_tests -XALOG_BUILD="coverage" -XALOG_VERSION=
114	@$(OBJECTDIR)/cov/test_runner || true
115	@lcov -c -d $(OBJECTDIR)/cov/ -o $(OBJECTDIR)/cov/alog_tmp.info
116	@lcov -e $(OBJECTDIR)/cov/alog_tmp.info "$(PWD)/src/*.adb" \
117		-o $(OBJECTDIR)/cov/alog.info
118	@genhtml --no-branch-coverage $(OBJECTDIR)/cov/alog.info -o $(COVDIR)
119
120prof:
121	@rm -f $(OBJECTDIR)/callgrind.*
122	gprbuild $(GMAKE_OPTS) -Palog_tests -XALOG_BUILD="profiling" -XALOG_VERSION=
123	valgrind -q --tool=callgrind \
124		--callgrind-out-file=$(OBJECTDIR)/callgrind.out.%p $(OBJECTDIR)/profiler
125	callgrind_annotate $(OBJECTDIR)/callgrind.* > $(OBJECTDIR)/profile.txt
126
127doc:
128	$(MAKE) -C doc
129
130.PHONY: cov doc
131