1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
# Build script for Texttools.
# Copyright (c) 2003-2009 Ludovic Brenta <lbrenta@debian.org>
# Copyright (c) 2009-2012 Nicolas Boulenguez <nicolas.boulenguez@free.fr>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
########################
# Global configuration #
########################
LIB_NAME := texttools
SOVERSION := 1
################################
# Build and test configuration #
################################
# Use environment variables if available, this is common practice for
# CPPFLAGS, CFLAGS and LDFLAGS.
CFLAGS ?= -O2
ADAFLAGS ?= -O2
.NOTPARALLEL:
GNATMAKE_OPTIONS := -j$(shell getconf _NPROCESSORS_ONLN)
ifdef ALL_CHECKS
CFLAGS += -Wall -Wextra -Wformat -Wformat-security -g
ADAFLAGS += -Wall -Wextra -g -gnatE -gnatQ -gnatVa -gnata -gnatf \
-gnato -gnatq -gnatySdx -gnaty0 -gnatyM159 -gnatw.e -gnatwH
GNATMAKE_OPTIONS += -s -we
endif
# We want the same compiler for C and Ada sources.
CC := gnatgcc
LDLIBS := $(shell ncurses5-config --libs)
##############################
# Installation configuration #
##############################
# Each of the following path should be prefixed with
DESTDIR :=
# The sources files are installed into a LIB_NAME subdirectory of
SRC_DIR := usr/share/ada/adainclude
# A LIB_NAME.gpr project convenient for library usage is installed into
GPR_DIR := usr/share/ada/adainclude
# The content of this file ignores DESTDIR.
# The GNAT ALI files are installed into a LIB_NAME subdirectory of
ALI_DIR := usr/lib/ada/adalib
# The static and dynamic library are installed into
LIB_DIR := usr/lib
#########
# Rules #
#########
build: build-dynamic build-static
build-dynamic build-static: build-%: $(LIB_NAME).gpr
gnatmake -P$< $(GNATMAKE_OPTIONS) -XKIND=$*
clean::
rm -f $(foreach dir,obj lib,$(foreach kind,dynamic static,build-$(dir)-$(kind)/*))
clean::
find -name "*~" -delete
test: examples/examples.gpr build-static
gnatmake -P$< $(GNATMAKE_OPTIONS) -XKIND=static
# Texttools.gpr is found in the current directory when executing this
# recipe, and will be found in the default system location after
# installation.
clean:: examples/examples.gpr texttools.gpr
gnatclean -P$< -XKIND=static
rm -f $^
# We need to create them for gnatclean, then suppress it as the last action.
install: build
install --directory $(DESTDIR)/$(SRC_DIR)/$(LIB_NAME)
install --mode=644 src/*.ad[sb] src/*.[ch] $(DESTDIR)/$(SRC_DIR)/$(LIB_NAME)
install --directory $(DESTDIR)/$(GPR_DIR)
sed template_for_installed_project \
$(foreach var,LIB_NAME SRC_DIR ALI_DIR LDLIBS LIB_DIR, \
-e 's/$$($(var))/$(subst $(space),"$(comma) ",$($(var)))/g') \
> $(DESTDIR)/$(GPR_DIR)/$(LIB_NAME).gpr
chmod 644 $(DESTDIR)/$(GPR_DIR)/$(LIB_NAME).gpr
install --directory $(DESTDIR)/$(ALI_DIR)/$(LIB_NAME)
install --mode=444 build-lib-dynamic/*.ali $(DESTDIR)/$(ALI_DIR)/$(LIB_NAME)
install --directory $(DESTDIR)/$(LIB_DIR)
install --mode=644 build-lib-static/lib$(LIB_NAME).a $(DESTDIR)/$(LIB_DIR)
install --mode=644 build-lib-dynamic/lib$(LIB_NAME).so.$(SOVERSION) $(DESTDIR)/$(LIB_DIR)
cd $(DESTDIR)/$(LIB_DIR) && ln --force --symbolic lib$(LIB_NAME).so.$(SOVERSION) lib$(LIB_NAME).so
uninstall:
rm -rf $(DESTDIR)/$(SRC_DIR)/$(LIB_NAME)
rm -f $(DESTDIR)/$(GPR_DIR)/$(LIB_NAME).gpr
rm -rf $(DESTDIR)/$(ALI_DIR)/$(LIB_NAME)
rm -f $(DESTDIR)/$(LIB_DIR)/lib$(LIB_NAME).a
rm -f $(DESTDIR)/$(LIB_DIR)/lib$(LIB_NAME).so.$(SOVERSION)
rm -f $(DESTDIR)/$(LIB_DIR)/lib$(LIB_NAME).so
############################################################
# All that C stuff will be unnecessary with gprbuild’s mixed C/Ada
# project files. For the moment, gnatmake will embed all .o files,
# we only have to compile them and store them in the object dir.
C_SRC := $(wildcard src/*.c)
C_OBJ_DYNAMIC := $(patsubst src/%.c,build-obj-dynamic/%.o,$(C_SRC))
build-dynamic: $(C_OBJ_DYNAMIC)
$(C_OBJ_DYNAMIC): build-obj-dynamic/%.o: src/%.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -fPIC
C_OBJ_STATIC := $(patsubst src/%.c,build-obj-static/%.o, $(C_SRC))
build-static: $(C_OBJ_STATIC)
$(C_OBJ_STATIC): build-obj-static/%.o: src/%.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
C_OBJ_TEST := $(patsubst src/%.c,examples/%.o, $(C_SRC))
test: $(C_OBJ_TEST)
$(C_OBJ_TEST): CFLAGS += -g -Wall -Wextra
$(C_OBJ_TEST): examples/%.o: src/%.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
clean::
rm -f $(C_OBJ_TEST)
# gnatmake 4.4 does not handle External_As_List, so we emulate it with
# a template instead of passing the options with -X.
comma := ,
empty :=
space := $(empty) $(empty)
texttools.gpr examples/examples.gpr: %.gpr: %.gpr.sed
sed $< \
$(foreach var,ADAFLAGS CFLAGS LDFLAGS LDLIBS SOVERSION, \
-e 's/$(var)/$(subst $(space),"$(comma) ",$($(var)))/') \
> $@
.PHONY: build build-dynamic build-static clean install test uninstall
|