From 41cf063931a6d818ba66b95283392ac8a6e48022 Mon Sep 17 00:00:00 2001 From: Björn Persson Date: Wed, 13 Feb 2013 23:23:53 +0100 Subject: Added a convenient and flexible build system. --- Makefile | 18 ++++ build_system_log.gpr | 29 +++--- build_test_system_log.gpr | 23 +++++ comfignat.gpr.in | 98 ++++++++++++++++++ comfignat.mk | 220 +++++++++++++++++++++++++++++++++++++++++ directories.gpr | 18 ---- system_log.gpr | 18 ---- system_log.gpr.in | 20 ++++ test/build_test_system_log.gpr | 19 ---- 9 files changed, 391 insertions(+), 72 deletions(-) create mode 100644 Makefile create mode 100644 build_test_system_log.gpr create mode 100644 comfignat.gpr.in create mode 100644 comfignat.mk delete mode 100644 directories.gpr delete mode 100644 system_log.gpr create mode 100644 system_log.gpr.in delete mode 100644 test/build_test_system_log.gpr diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5ae722c --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +# makefile to compile System_Log into a shared library +# Copyright 2013 B. Persson, Bjorn@Rombobeorn.se +# +# This makefile is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + + +include comfignat.mk + +build_GPRs = build_system_log.gpr +usage_GPRs = system_log.gpr + +test: build build_test_system_log.gpr + ${build_GPR} + +clean:: + rm -f test_system_log diff --git a/build_system_log.gpr b/build_system_log.gpr index b0d6dd7..df98c7f 100644 --- a/build_system_log.gpr +++ b/build_system_log.gpr @@ -1,37 +1,32 @@ --- Use this project file to compile System_Log into a shared library. --- Copyright 2012 B. Persson, Bjorn@Rombobeorn.se +-- project file to compile System_Log into a shared library +-- Copyright 2012 - 2013 B. Persson, Bjorn@Rombobeorn.se -- -- This project file is free software: you can redistribute it and/or modify it -- under the terms of the GNU General Public License version 3, as published -- by the Free Software Foundation. -with "directories"; +with "comfignat.gpr"; -project Build_System_Log is +library project Build_System_Log is Version := "1.2"; - Destdir := external("DESTDIR", ""); - - for Library_Name use "adasyslog"; - for Library_Kind use "relocatable"; - for Library_Version use "libadasyslog.so." & Version; - for Library_Src_Dir use Destdir & Directories.Includedir & "/adasyslog"; - for Library_Dir use Destdir & Directories.Libdir; - for Library_ALI_Dir use Destdir & Directories.Libdir & "/adasyslog"; - - -- Put the binder files for different architectures in subdirectories where - -- they won't conflict with each other. - for Object_Dir use "obj/" & Directories.Hardware_Platform; + for Library_Name use "adasyslog"; + for Library_Kind use "dynamic"; + for Library_Version use "libadasyslog.so." & Version; for Library_Interface use ("System_Log"); + for Object_Dir use Comfignat.Objdir; + for Library_Src_Dir use Comfignat.Stage_Includedir & "/adasyslog"; + for Library_Dir use Comfignat.Stage_Libdir; + for Library_ALI_Dir use Comfignat.Stage_Libdir & "/adasyslog"; package Compiler is for Default_Switches ("Ada") use ("-gnato"); end Compiler; -- Ensure that the shared library will be initialized. GPRbuild 2010 doesn't - -- pass -a automatically. + -- pass -a automatically. (Fixed in GPRbuild 2012.) package Binder is for Default_Switches ("Ada") use ("-a"); end Binder; diff --git a/build_test_system_log.gpr b/build_test_system_log.gpr new file mode 100644 index 0000000..046c929 --- /dev/null +++ b/build_test_system_log.gpr @@ -0,0 +1,23 @@ +-- project file to compile Test_System_Log +-- Copyright 2012 - 2013 B. Persson, Bjorn@Rombobeorn.se +-- +-- This project file is free software: you can redistribute it and/or modify it +-- under the terms of the GNU General Public License version 3, as published +-- by the Free Software Foundation. + + +with "comfignat.gpr"; +with "build_system_log"; -- Link to the just compiled library. + +standard project Build_Test_System_Log is + + for Main use ("test_system_log"); + for Source_Dirs use ("test"); + for Object_Dir use Comfignat.Objdir; + for Exec_Dir use "."; + + package Binder is + for Default_Switches ("Ada") use ("-shared"); + end Binder; + +end Build_Test_System_Log; diff --git a/comfignat.gpr.in b/comfignat.gpr.in new file mode 100644 index 0000000..8212336 --- /dev/null +++ b/comfignat.gpr.in @@ -0,0 +1,98 @@ +-- Comfignat configuration variables for GNAT project files +-- Copyright 2013 B. Persson, Bjorn@Rombobeorn.se +-- +-- This material is provided as is, with absolutely no warranty expressed +-- or implied. Any use is at your own risk. +-- +-- Permission is hereby granted to use or copy this project file +-- for any purpose, provided the above notices are retained on all copies. +-- Permission to modify the code and to distribute modified code is granted, +-- provided the above notices are retained, and a notice that the code was +-- modified is included with the above copyright notice. + + +-- This project file defines directory variables for use in build-controlling +-- project files. It is not to be installed on the target system. +-- +-- Normally the preprocessing of this file will be controlled by comfignat.mk, +-- which will make it import the directory project if one is provided. It can +-- also be preprocessed manually if Make cannot be used for some reason. There +-- are defaults that will be used if no preprocessor symbols are defined. + + +#if Directory_GPR'Defined then + with $Directory_GPR; +#end if; + +abstract project Comfignat is + + #if Objdir'Defined then + Objdir := $Objdir; + #else + Objdir := "build"; + #end if; + -- Intermediate files produced during the build shall be kept in Objdir. + + #if Directory_Project'Defined then + -- Put intermediate files for different architectures in subdirectories + -- where they won't conflict with each other. (This is useful especially + -- with binder files when they are packaged in debug information packages + -- for multiarch systems.) + Objdir := Objdir & "/" & $Directory_Project.Hardware_Platform; + #end if; + + #if Stagedir'Defined then + Stagedir := $Stagedir; + #else + Stagedir := external("DESTDIR", ""); + #end if; + -- Files to be installed shall be placed under Stagedir instead of the root + -- directory. + + #if Prefix'Defined then + Prefix := $Prefix; + #else + Prefix := "/usr/local"; + #end if; + + #if Exec_Prefix'Defined then + Exec_Prefix := $Exec_Prefix; + #else + Exec_Prefix := Prefix; + #end if; + + #if Bindir'Defined then + Bindir := $Bindir; + #else + Bindir := Exec_Prefix & "/bin"; + #end if; + Stage_Bindir := Stagedir & Bindir; + -- Programs intended to be run by users shall be installed in Stage_Bindir. + + #if Libexecdir'Defined then + Libexecdir := $Libexecdir; + #else + Libexecdir := Exec_Prefix & "/libexec"; + #end if; + Stage_Libexecdir := Stagedir & Libexecdir; + -- Programs intended to be run by other programs rather than by users shall + -- be installed under Stage_Libexecdir. + + #if Includedir'Defined then + Includedir := $Includedir; + #else + Includedir := Prefix & "/include"; + #end if; + Stage_Includedir := Stagedir & Includedir; + -- Source files needed for compiling against a library shall be installed + -- under Stage_Includedir. + + #if Libdir'Defined then + Libdir := $Libdir; + #else + Libdir := Prefix & "/lib"; + #end if; + Stage_Libdir := Stagedir & Libdir; + -- Binary libraries shall be installed in Stage_Libdir. + +end Comfignat; diff --git a/comfignat.mk b/comfignat.mk new file mode 100644 index 0000000..785a9f5 --- /dev/null +++ b/comfignat.mk @@ -0,0 +1,220 @@ +# Comfignat makefile foundation for configuring and building GNAT projects +# Copyright 2013 B. Persson, Bjorn@Rombobeorn.se +# +# This material is provided as is, with absolutely no warranty expressed +# or implied. Any use is at your own risk. +# +# Permission is hereby granted to use or copy this makefile +# for any purpose, provided the above notices are retained on all copies. +# Permission to modify the code and to distribute modified code is granted, +# provided the above notices are retained, and a notice that the code was +# modified is included with the above copyright notice. + + +# This file contains generic Make code. It is designed to be included by other +# makefiles, called containing makefiles, which add information specific to the +# project at hand. Builds are controlled by GNAT project files which import the +# abstract project Comfignat and use the directory variables it defines. For +# libraries there shall also be usage projects to be installed on the target +# system. Usage projects and the Comfignat project will be preprocessed with +# Gnatprep. (Build projects may also be preprocessed.) +# +# If a directory project is provided, then the project files will get the +# directory variables from there, otherwise the Make variables will be used. +# +# This file may not work with other Make clones than GNU Make. (Reusable Make +# code is pretty much impossible to write without advanced Make features.) If +# Make cannot be used for whatever reason, then it's not too difficult to run +# the project files through Gnatprep manually. + + +# +# Program-name variables and the usual options variables are picked up from the +# environment or the command line: +# + +GNATPREP ?= gnatprep +GNAT_BUILDER ?= gprbuild + +# If GNAT_BUILDER looks like it will invoke Gnatmake, then make the default +# value of GNATFLAGS compatible with Gnatmake. Otherwise make it suitable for +# building multi-language projects with GPRbuild. +ifeq ($(findstring gnatmake,${notdir ${lastword ${GNAT_BUILDER}}}),) + GNATFLAGS ?= ${GNAT_BUILDER_FLAGS} \ + -cargs:Ada ${ADAFLAGS} -cargs:C ${CFLAGS} \ + -cargs:C++ ${CXXFLAGS} -cargs:Fortran ${FFLAGS} \ + -largs ${LDFLAGS} +else + GNATFLAGS ?= ${GNAT_BUILDER_FLAGS} -cargs ${ADAFLAGS} -largs ${LDFLAGS} +endif + +# (DESTDIR is also supported.) + + +# +# These variables should be overridden on the command line as needed, but will +# not be picked up from the environment: +# + +dirgpr = +# dirgpr should be the filename of the directory project if there is one. It +# becomes the Gnatprep symbols Directory_GPR and Directory_Project. + +prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +libexecdir = ${exec_prefix}/libexec +datarootdir = ${prefix}/share +datadir = ${datarootdir} +sysconfdir = ${prefix}/etc +localstatedir = ${prefix}/var +includedir = ${prefix}/include +libdir = ${prefix}/lib +gprdir = ${datarootdir}/gpr +localedir = ${datarootdir}/locale +mandir = ${datarootdir}/man +infodir = ${datarootdir}/info +# These are the directories where different kinds of files will be installed on +# the target system. Some of these directory variables aren't used in this file +# but may be needed in containing makefiles. + +builddir = build +objdir = ${builddir}/obj +stagedir = ${builddir}/stage +# Intermediate files produced during the build are kept in objdir. Files to be +# installed are written to stagedir, and then copied to their destination in +# the installation step. + + +# +# Containing makefiles should assign or append to these variables as needed: +# + +ifneq (${origin configured_files},file) + configured_files := ${basename ${wildcard *.in}} +endif +# configured_files is a list of files to be produced in the preprocessing step +# at the beginning of the build. Containing makefiles may override it or append +# additional filenames to it. + +ifneq (${origin build_GPRs},file) + build_GPRs := +endif +# build_GPRs shall name one or more project files for building the software. +# These project files will be used when "make" or "make build" is invoked. + +ifneq (${origin usage_GPRs},file) + usage_GPRs := +endif +# If the build produces libraries, then usage_GPRs shall name the project files +# that other projects should import to link to the libraries. These project +# files will be installed to the target system. + +ifneq (${origin options},file) + options := +endif +# options may be assigned a list of variable names. Those variables may be +# overridden on the command line, and will be defined as Gnatprep symbols. +# Their values must be "true" or "false". +# The containing makefile should assign a default value to each variable unless +# it shall be mandatory to always set the option on the command line. + +ifneq (${origin Gnatprep_definitions},file) + Gnatprep_definitions := +endif +# Any text assigned to Gnatprep_definitions will be included in the Gnatprep +# command line. It may be used for additional symbol definitions. + + +# +# Compute the symbol definitions for Gnatprep, and some other data that the +# rules need: +# + +# Convey objdir and stagedir to Gnatprep. +definitions = '-DObjdir="${objdir}"' '-DStagedir="${stagedir}"' + +# Convey the prefix variables too, although they're supposed to be unused when +# the preprocessing is done with Make. +definitions += '-DPrefix="${prefix}"' '-DExec_Prefix="${exec_prefix}"' + +# If a directory project is used, then make project files take the directory +# variables from there. Otherwise convey the ones defined above. +ifeq (${dirgpr},) + definitions += '-DBindir="${bindir}"' '-DLibexecdir="${libexecdir}"' + definitions += '-DIncludedir="${includedir}"' '-DLibdir="${libdir}"' +else + directory_project := ${basename ${notdir ${dirgpr}}} + definitions += '-DDirectory_GPR="${dirgpr}"' + definitions += '-DDirectory_Project=${directory_project}' + definitions += '-DBindir=${directory_project}.Bindir' + definitions += '-DLibexecdir=${directory_project}.Libexecdir' + definitions += '-DIncludedir=${directory_project}.Includedir' + definitions += '-DLibdir=${directory_project}.Libdir' +endif + +# Convey boolean options to Gnatprep. +definitions += \ + ${foreach option,${options},\ + ${if ${and ${filter-out environment,${origin ${option}}},\ + ${filter 1,${words ${${option}}}},\ + ${filter true false,${${option}}}},\ + -D${option}=${${option}},\ + ${error ${option} must be "true" or "false".}}} +# For each variable listed in options, check that it didn't come from the +# environment (to prevent accidents), that its value is a single word, and that +# that word is either "true" or "false". If so, append a symbol definition; +# otherwise complain and stop. + +# Convey any additional symbols that the containing makefile has defined. +definitions += ${Gnatprep_definitions} + +build_targets = ${addsuffix .phony_target,${build_GPRs}} + +stage_any_GPRs = ${if ${usage_GPRs},stage_GPRs} + +build_GPR = "${GNAT_BUILDER}" -P ${firstword ${filter %.gpr,$^}} -p \ + ${GNATFLAGS} -margs +# build_GPR is a command for use in recipies. It performs a build controlled by +# the first project file among the rule's prerequisites. Arguments for the +# builder may be appended. + + +# +# Make rules: +# + +.SECONDEXPANSION: + +all: build + +%.gpr: %.gpr.in + "${GNATPREP}" $< $@ ${definitions} + +configure: $${configured_files} + +%.gpr.phony_target: %.gpr configure + ${build_GPR} +# Instead of tracking dependencies between project files, this rule simply +# requires that all preprocessing is done before any project is built. + +stage_GPRs: $${usage_GPRs} + mkdir -p "${stagedir}${gprdir}" + cp -p ${usage_GPRs} "${stagedir}${gprdir}" +.PHONY: stage_GPRs + +build: $${build_targets} $${stage_any_GPRs} + +${stagedir}: + @${MAKE} build --no-print-directory +# "make install" straight out of a source package triggers a build, but if +# something has been built then "make install" doesn't rebuild anything, just +# copies the built files to their destination. + +install: ${stagedir} + mkdir -p "${DESTDIR}/" + cp -RPpf "${stagedir}"/* "${DESTDIR}/" +.PHONY: install + +clean:: + rm -Rf ${builddir} ${configured_files} diff --git a/directories.gpr b/directories.gpr deleted file mode 100644 index 689d436..0000000 --- a/directories.gpr +++ /dev/null @@ -1,18 +0,0 @@ --- Default directories --- Copyright 2012 B. Persson, Bjorn@Rombobeorn.se --- You may do whatever you want with this file as long as you acknowledge the --- author's copyright. - --- If your system has a global directories.gpr and you want to install to the --- directories it specifies, then just delete this file and let the build use --- the global one. Otherwise edit the paths below to your liking. - - -project Directories is - Hardware_Platform := ""; - Libdir := "/usr/local/lib"; - Bindir := "/usr/local/bin"; - Libexecdir := "/usr/local/libexec"; - Includedir := "/usr/local/include"; - for Source_Files use (); -end Directories; diff --git a/system_log.gpr b/system_log.gpr deleted file mode 100644 index 3b37702..0000000 --- a/system_log.gpr +++ /dev/null @@ -1,18 +0,0 @@ --- Projects that use System_Log should import this file. --- Copyright 2012 B. Persson, Bjorn@Rombobeorn.se --- --- This project file is free software: you can redistribute it and/or modify it --- under the terms of the GNU General Public License version 3, as published --- by the Free Software Foundation. - - -with "directories"; - -project System_Log is - for Library_Name use "adasyslog"; - for Library_Kind use "relocatable"; - for Source_Dirs use (Directories.Includedir & "/adasyslog"); - for Library_Dir use Directories.Libdir; - for Library_ALI_Dir use Directories.Libdir & "/adasyslog"; - for Externally_Built use "true"; -end System_Log; diff --git a/system_log.gpr.in b/system_log.gpr.in new file mode 100644 index 0000000..bfd2521 --- /dev/null +++ b/system_log.gpr.in @@ -0,0 +1,20 @@ +-- Projects that use System_Log should import this file. +-- Copyright 2012 - 2013 B. Persson, Bjorn@Rombobeorn.se +-- +-- This project file is free software: you can redistribute it and/or modify it +-- under the terms of the GNU General Public License version 3, as published +-- by the Free Software Foundation. + + +#if Directory_GPR'Defined then +with $Directory_GPR; +#end if; + +library project System_Log is + for Library_Name use "adasyslog"; + for Library_Kind use "dynamic"; + for Source_Dirs use ($Includedir & "/adasyslog"); + for Library_Dir use $Libdir; + for Library_ALI_Dir use $Libdir & "/adasyslog"; + for Externally_Built use "true"; +end System_Log; diff --git a/test/build_test_system_log.gpr b/test/build_test_system_log.gpr deleted file mode 100644 index f9ba70b..0000000 --- a/test/build_test_system_log.gpr +++ /dev/null @@ -1,19 +0,0 @@ --- Use this project file to compile the test program. --- Copyright 2012 B. Persson, Bjorn@Rombobeorn.se --- --- This project file is free software: you can redistribute it and/or modify it --- under the terms of the GNU General Public License version 3, as published --- by the Free Software Foundation. - - -with "system_log"; - -project Build_Test_System_Log is - - for Main use ("test_system_log"); - - package Binder is - for Default_Switches ("Ada") use ("-shared"); - end Binder; - -end Build_Test_System_Log; -- cgit v1.2.3