mirror of
https://github.com/AdaCore/gpr.git
synced 2026-02-12 12:58:39 -08:00
This always uses the local libgpr2 library to build the tools, easing the developer setup and minimizes the supported configurations to build the tools. This also removes the support for selecting the prefix of gprbuild and gprclean, now always using "gpr". Fixes eng/gpr/gpr-issues#643 Depends-on eng/shared/anod!6419
287 lines
10 KiB
Makefile
287 lines
10 KiB
Makefile
##############################################################################
|
|
## ##
|
|
## GPR2 PROJECT LIBRARY ##
|
|
## ##
|
|
## Copyright (C) 2016-2022, Free Software Foundation, Inc. ##
|
|
## ##
|
|
## This library is free software; you can redistribute it and/or modify it ##
|
|
## under terms of the GNU General Public License as published by the Free ##
|
|
## Software Foundation; either version 3, or (at your option) any later ##
|
|
## version. This library is distributed in the hope that it will be useful, ##
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN# ##
|
|
## TABILITY or FITNESS FOR A PARTICULAR PURPOSE. ##
|
|
## ##
|
|
## As a special exception under Section 7 of GPL version 3, you are granted ##
|
|
## additional permissions described in the GCC Runtime Library Exception, ##
|
|
## version 3.1, as published by the Free Software Foundation. ##
|
|
## ##
|
|
## You should have received a copy of the GNU General Public License and ##
|
|
## a copy of the GCC Runtime Library Exception along with this program; ##
|
|
## see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ##
|
|
## <http://www.gnu.org/licenses/>. ##
|
|
## ##
|
|
##############################################################################
|
|
|
|
# Makefile targets
|
|
# ----------------
|
|
#
|
|
# Setup: make [VAR=VALUE] setup (see below)
|
|
# Build libgpr2 & tools: make
|
|
# Build libgpr2: make build-libs
|
|
# Install libgpr2 & tools: make install
|
|
# Install libgpr2: make install-libs
|
|
|
|
# Variables which can be set:
|
|
#
|
|
# prefix : root install directory
|
|
# ENABLE_SHARED : yes / no (or empty)
|
|
# GPR2_BUILD : debug / release / release_checks / gnatcov
|
|
# PROCESSORS : nb parallel compilations (0 to use all cores)
|
|
# PROFILER : Include gprof support instrumentation (yes / no)
|
|
# GPR2KBDIR : path to the gprconfig_kb repository
|
|
|
|
# Look for the source directory (in case of out-of-tree builds):
|
|
#
|
|
# Supports symlink of Makefile to the build directory
|
|
# Supports building with make -f <gpr path>/Makefile from the build directory
|
|
#
|
|
|
|
HAS_REALPATH := $(shell command -v realpath >/dev/null 2>&1 && echo yes || echo no)
|
|
|
|
# as Makefile is in the root dir, SOURCE_DIR is just dirname of the Makefile
|
|
# path above.
|
|
ifeq ($(HAS_REALPATH),yes)
|
|
# first let's check if Makefile is symlinked: realpath will return the actual
|
|
# (after link resolution) relative path of the Makefile from PWD.
|
|
# On macOS, the `realpath` command does not support the `--relative-to` option.
|
|
# To handle this, you can specify the Makefile explicitly by calling:
|
|
# make MFILE="./Makefile"
|
|
MFILE := $(shell realpath --relative-to=. "$(firstword ${MAKEFILE_LIST})"))
|
|
SOURCE_DIR := $(shell dirname "${MFILE}")
|
|
else
|
|
SOURCE_DIR := $(shell dirname $(dir ${MAKEFILE_LIST}))
|
|
endif
|
|
|
|
# Load current setup if any
|
|
-include makefile.setup
|
|
|
|
# Else setup defaults:
|
|
# Install in GNAT by default
|
|
prefix ?= $(dir $(shell which gnatls))..
|
|
# Enable shared libs by default.
|
|
ENABLE_SHARED ?= yes
|
|
# Use release mode with assertions
|
|
GPR2_BUILD ?= release_checks
|
|
# Use max number of processors by default
|
|
PROCESSORS ?= 0
|
|
# Don't use gcov by default
|
|
PROFILER ?= no
|
|
# gprconfig_kb repository location
|
|
GPR2KBDIR ?= ${SOURCE_DIR}/../gprconfig_kb/db
|
|
# Used to pass extra options to GPRBUILD, like -d or -v for instance
|
|
GPRBUILD_OPTIONS ?=
|
|
# Level of coverage requested from gnatcov code coverage testing
|
|
GNATCOV_LEVEL ?= stmt
|
|
# To override in case the python executable is not named "python" when
|
|
# generating the langkit parser
|
|
PYTHON ?= python
|
|
|
|
# Build modes for this repository:
|
|
# * debug: no optimisation and debug info
|
|
# * release: code optimisation and no assertion or contracts checking
|
|
# * release_checks: code optimisation with assertions and contracts checks
|
|
# * gnatcov: code optimisation with gnat coverage instrumentation and assertions
|
|
BUILD_TYPES := debug release release_checks gnatcov
|
|
|
|
# Location of the project files
|
|
GPR2 := ${SOURCE_DIR}/gpr2.gpr
|
|
GPR2TOOLS := ${SOURCE_DIR}/tools/gpr2_tools.gpr
|
|
GPR2KB := ${SOURCE_DIR}/kb/collect_kb.gpr
|
|
ALL_GPR2TOOLS := $(wildcard ${SOURCE_DIR}/tools/projects/gpr2tools-*.gpr)
|
|
|
|
# adapt build dirs to out-of-tree builds
|
|
ifeq (${SOURCE_DIR},.)
|
|
BUILD_ROOT := .build
|
|
else
|
|
BUILD_ROOT := .
|
|
endif
|
|
|
|
KB_BUILD_DIR := ${BUILD_ROOT}/kb
|
|
|
|
# Do not build static-pic and relocatable libs if shared libs are not supported
|
|
LIBGPR2_TYPES := static
|
|
ifeq (${ENABLE_SHARED},yes)
|
|
ifneq (${GPR2_BUILD},gnatcov)
|
|
LIBGPR2_TYPES := static relocatable static-pic
|
|
endif
|
|
endif
|
|
|
|
# Code coverage support
|
|
ifneq (${GPR2_BUILD},gnatcov)
|
|
COVERAGE_BUILD_FLAGS :=
|
|
else
|
|
COVERAGE_BUILD_FLAGS := \
|
|
--implicit-with=gnatcov_rts \
|
|
--src-subdirs=gnatcov-instr
|
|
COVERAGE_INSTR_FLAGS := -XGPR2_BUILD=${GPR2_BUILD} \
|
|
-XBUILD_ROOT="${CURDIR}/${BUILD_ROOT}" \
|
|
-XLIBRARY_TYPE=static -XXMLADA_BUILD=static
|
|
COVERAGE_INSTR := gnatcov instrument --level $(GNATCOV_LEVEL) \
|
|
--dump-trigger=atexit \
|
|
${COVERAGE_INSTR_FLAGS}
|
|
endif
|
|
|
|
# Command line helpers:
|
|
GPR_OPTIONS := -XGPR2_BUILD=${GPR2_BUILD} \
|
|
-XBUILD_ROOT="${CURDIR}/${BUILD_ROOT}"
|
|
|
|
BUILDER := gprbuild -p -j${PROCESSORS} ${GPR_OPTIONS} \
|
|
${GPRBUILD_OPTIONS} -XPROFILER=${PROFILER} \
|
|
${COVERAGE_BUILD_FLAGS}
|
|
INSTALLER := gprinstall -p -f ${GPR_OPTIONS} --prefix='${prefix}'
|
|
CLEANER := gprclean -eL -p ${RBD} -XGPR2_BUILD=${GPR2_BUILD} \
|
|
-XBUILD_ROOT="${CURDIR}/${BUILD_ROOT}"
|
|
UNINSTALLER := ${INSTALLER} -p -f --uninstall
|
|
|
|
# attributes documentation generation
|
|
GPRDOC := ${BUILD_ROOT}/${GPR2_BUILD}/gprdoc
|
|
DOCOUT := ${BUILD_ROOT}/attributes.json
|
|
|
|
.PHONY: force doc
|
|
|
|
#########
|
|
# build #
|
|
#########
|
|
|
|
all: ${LIBGPR2_TYPES:%=build-lib-%} build-tools
|
|
|
|
# Knowledge base
|
|
${KB_BUILD_DIR}:
|
|
mkdir -p ${KB_BUILD_DIR}
|
|
|
|
${KB_BUILD_DIR}/collect_kb: ${KB_BUILD_DIR} $(wildcard ${SOURCE_DIR}/kb/tool/*.ad[bs]) ${GPR2KB}
|
|
gprbuild -p -P ${GPR2KB} -XKB_BUILD_DIR=${KB_BUILD_DIR} --relocate-build-tree
|
|
|
|
${KB_BUILD_DIR}/gpr2-kb-embedded.adb: ${KB_BUILD_DIR}/collect_kb $(wildcard $(GPR2KBDIR)/*)
|
|
${KB_BUILD_DIR}/collect_kb -o ${KB_BUILD_DIR} ${GPR2KBDIR}
|
|
|
|
${KB_BUILD_DIR}/gpr2-kb-embedded.ads: ${KB_BUILD_DIR} ${SOURCE_DIR}/kb/gpr2-kb-embedded.ads
|
|
cp ${SOURCE_DIR}/kb/gpr2-kb-embedded.ads ${KB_BUILD_DIR}
|
|
|
|
# Libgpr2
|
|
build-libs: ${LIBGPR2_TYPES:%=build-lib-%}
|
|
|
|
build-lib-%: ${KB_BUILD_DIR}/gpr2-kb-embedded.ads ${KB_BUILD_DIR}/gpr2-kb-embedded.adb
|
|
ifneq (${GPR2_BUILD},gnatcov)
|
|
${BUILDER} -XLIBRARY_TYPE=$* -XXMLADA_BUILD=$* \
|
|
${GPR2}
|
|
else
|
|
echo "gpr2 library built from gpr2_tools in gnatcov mode"
|
|
endif
|
|
|
|
# Gpr2 tools
|
|
build-tools: build-lib-static coverage-instrument
|
|
${BUILDER} -XLIBRARY_TYPE=static -XXMLADA_BUILD=static ${GPR2TOOLS}
|
|
|
|
# Gnatcov instrumentation
|
|
coverage-instrument:
|
|
ifeq (${GPR2_BUILD},gnatcov)
|
|
# Remove artifacts from previous instrumentations, so that stale units
|
|
# that are not overriden by new ones don't get in our way.
|
|
rm -rf "${BUILD_ROOT}/${GPR2_BUILD}/obj-*/*gnatcov-instr"
|
|
rm -rf "${BUILD_ROOT}/${GPR2_BUILD}/obj-*/*/*gnatcov-instr"
|
|
mkdir -p "${BUILD_ROOT}/${GPR2_BUILD}"
|
|
for gpr in ${ALL_GPR2TOOLS}; do \
|
|
${COVERAGE_INSTR} -P $$gpr; \
|
|
done
|
|
endif
|
|
|
|
###########
|
|
# Install #
|
|
###########
|
|
|
|
uninstall-libs:
|
|
ifneq (,$(wildcard $(prefix)/share/gpr/manifests/gpr2))
|
|
${UNINSTALLER} $(notdir ${GPR2})
|
|
endif
|
|
|
|
uninstall-tools:
|
|
ifneq (,$(wildcard $(prefix)/share/gpr/manifests/gpr2_tools))
|
|
${UNINSTALLER} $(notdir ${GPR2TOOLS})
|
|
endif
|
|
|
|
install: uninstall-libs ${LIBGPR2_TYPES:%=install-lib-%} install-tools
|
|
|
|
install-libs: uninstall-libs ${LIBGPR2_TYPES:%=install-lib-%}
|
|
|
|
install-lib-%:
|
|
${INSTALLER} -XLIBRARY_TYPE=$* -XXMLADA_BUILD=$* \
|
|
--build-name=$* \
|
|
--build-var=LIBRARY_TYPE \
|
|
--build-var=GPR2_LIBRARY_TYPE \
|
|
${GPR2}
|
|
|
|
install-tools: uninstall-tools
|
|
${INSTALLER} -XLIBRARY_TYPE=static -XXMLADA_BUILD=static \
|
|
--build-name=static --mode=usage ${GPR2TOOLS} ${AP_GPR2}
|
|
|
|
#########
|
|
# setup #
|
|
#########
|
|
|
|
.SILENT: setup setup2
|
|
|
|
setup:
|
|
echo "prefix ?= ${prefix}" > makefile.setup
|
|
echo "ENABLE_SHARED ?= ${ENABLE_SHARED}" >> makefile.setup
|
|
echo "GPR2_BUILD ?= ${GPR2_BUILD}" >> makefile.setup
|
|
echo "PROCESSORS ?= ${PROCESSORS}" >> makefile.setup
|
|
echo "PROFILER ?= ${PROFILER}" >> makefile.setup
|
|
echo "LOCAL_GPR2 ?= ${LOCAL_GPR2}" >> makefile.setup
|
|
echo "GPR2KBDIR ?= ${GPR2KBDIR}" >> makefile.setup
|
|
echo "GPRBUILD_OPTIONS ?= ${GPRBUILD_OPTIONS}" >> makefile.setup
|
|
echo "GNATCOV_LEVEL ?= ${GNATCOV_LEVEL}" >> makefile.setup
|
|
echo "PYTHON ?= ${PYTHON}" >> makefile.setup
|
|
|
|
###########
|
|
# Cleanup #
|
|
###########
|
|
|
|
distclean: clean ${BUILD_TYPES:%=clean-buildtype-%}
|
|
rm -f makefile.setup
|
|
|
|
clean: clean-tools ${LIBGPR2_TYPES:%=clean-libtype-%}
|
|
rm -rf ${KB_BUILD_DIR}
|
|
rm -rf ${BUILD_ROOT}/autoconf
|
|
make -C ${SOURCE_DIR}/doc clean
|
|
|
|
clean-libtype-%:
|
|
-${CLEANER} -XLIBRARY_TYPE=$* -P ${GPR2}
|
|
|
|
clean-buildtype-%:
|
|
rm -rf ${BUILD_ROOT}/$*
|
|
|
|
clean-tools:
|
|
-${CLEANER} -XLIBRARY_TYPE=static -P ${GPR2TOOLS} ${AP_GPR2}
|
|
|
|
#################
|
|
# Documentation #
|
|
#################
|
|
|
|
${DOCOUT}: force
|
|
|
|
docgen:
|
|
${GPRDOC} > ${DOCOUT}
|
|
${GPRDOC} --display=json > ${SOURCE_DIR}/testsuite/tests/tools/gprdoc/attrs.json
|
|
make -C ${SOURCE_DIR}/doc gen GPRDOC_FILE="../${DOCOUT}"
|
|
|
|
|
|
###########
|
|
# Langkit #
|
|
###########
|
|
|
|
# Langkit parser (GPR project parser)
|
|
update-langkit: $(wildcard ${SOURCE_DIR}/langkit/language/**/*.py)
|
|
rm -rf ${SOURCE_DIR}/langkit/gen
|
|
${MAKE} -C ${SOURCE_DIR}/langkit setup DEST="gen" PYTHONEXE=${PYTHON}
|