############################################################################## ## ## ## 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 ## ## . ## ## ## ############################################################################## # 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 /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}