diff options
author | Björn Persson <bjorn@rombobjörn.se> | 2016-01-18 11:59:31 +0100 |
---|---|---|
committer | Björn Persson <bjorn@rombobjörn.se> | 2016-01-18 11:59:31 +0100 |
commit | dae4f47f2b80c7ea7b1df0f713efe79a8a50c69f (patch) | |
tree | 9e92367d9bbca2a61b4b9f2f0240fab0fe2cbd70 | |
parent | c108be85bf27d40d9b1c45d4de14185dc902b763 (diff) |
Added Library_Type to help with building libraries as shared or static.
-rw-r--r-- | INSTALL | 17 | ||||
-rw-r--r-- | comfignat.gpr.gp | 18 | ||||
-rw-r--r-- | comfignat.mk | 17 | ||||
-rwxr-xr-x | manual.en.html | 42 | ||||
-rw-r--r-- | testsuite/inputs/build_static | 18 | ||||
-rw-r--r-- | testsuite/sources/dual_library/Makefile | 20 | ||||
-rw-r--r-- | testsuite/sources/dual_library/build_testcase.gpr.gp | 28 | ||||
-rw-r--r-- | testsuite/sources/dual_library/generated_files | 8 | ||||
-rw-r--r-- | testsuite/sources/dual_library/testcase.adb | 24 | ||||
-rw-r--r-- | testsuite/sources/dual_library/testcase.ads | 18 | ||||
-rw-r--r-- | testsuite/sources/dual_library/testcase.gpr.gp | 27 | ||||
-rw-r--r-- | testsuite/sources/library_2/Makefile | 4 | ||||
-rw-r--r-- | testsuite/sources/library_2/build_testcase.gpr | 6 | ||||
-rw-r--r-- | testsuite/sources/library_2/generated_files | 4 | ||||
-rw-r--r-- | testsuite/sources/library_2/intermediate.gpr.gp | 3 | ||||
-rw-r--r-- | testsuite/sources/library_2/testcase.gpr.gp | 4 |
16 files changed, 235 insertions, 23 deletions
@@ -209,6 +209,15 @@ invoke Gnatprep. You may need to define them if you run Gnatprep manually. above will be used if the symbols are undefined. +Building a Shared or Static Library +----------------------------------- + +If the software is a library that can be built as either shared or static, then +the Make variable library_type controls which kind of library is built. The +valid values are "dynamic", "static", and "relocatable" which is an alias for +"dynamic". The default is to build a shared library, that is "dynamic". + + Optional Features ----------------- @@ -220,12 +229,12 @@ The developers really should have listed those options here, or deleted this section if there are none. -Build Tools and Options ------------------------ +Build Tools and their Arguments +------------------------------- The following variables, which may be set in the environment or on the Make command line, control which programs are invoked to do the build and which -options are passed to them: +arguments are passed to them: GNATPREP The command for invoking Gnatprep, in case you want to use a nondefault @@ -287,7 +296,7 @@ options are passed to them: Copyright of This File ---------------------- -Copyright 2013 B. Persson, Bjorn@Rombobeorn.se +Copyright 2013 - 2016 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. diff --git a/comfignat.gpr.gp b/comfignat.gpr.gp index b9ea446..0f2179e 100644 --- a/comfignat.gpr.gp +++ b/comfignat.gpr.gp @@ -1,5 +1,5 @@ -- Comfignat configuration variables for GNAT project files --- Copyright 2013 - 2015 B. Persson, Bjorn@Rombobeorn.se +-- Copyright 2013 - 2016 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. @@ -313,4 +313,20 @@ abstract project Comfignat is Stage_Alidir := Stagedir & Alidir; #end if; + + -- + -- Other configuration than directories: + -- + + -- If a library can be built as either shared or static, then Library_Type + -- shall be used to set the attribute Library_Kind. It can be overridden on + -- the builder command line, which makes it possible to write a makefile + -- that builds both a shared and a static library. + type Library_Kind is ("dynamic", "relocatable", "static"); + #if Library_Type'Defined then + Library_Type : Library_Kind := external("LIBRARY_TYPE", $Library_Type); + #else + Library_Type : Library_Kind := external("LIBRARY_TYPE", "dynamic"); + #end if; + end Comfignat; diff --git a/comfignat.mk b/comfignat.mk index a9847a8..c355a7d 100644 --- a/comfignat.mk +++ b/comfignat.mk @@ -148,6 +148,10 @@ relocatable_package = false # breaking the project files. # dirgpr takes precedence over relocatable_package. +library_type = dynamic +# If a library can be built as either shared or static, then library_type shall +# be used to set the attribute Library_Kind in the project files. + prefix = /usr/local exec_prefix = ${prefix} datarootdir = ${prefix}/share @@ -268,14 +272,14 @@ Make_miscdocdir = ${call Make_pathname,stage_miscdocdir} preprocess_file = "${GNATPREP}" ${firstword ${filter %.gp,$^}} $@ \ ${options_preprocessing} ${Gnatprep_arguments} \ ${if ${filter ${notdir $@},${notdir ${usage_GPRs}}}, \ - ${usage_directories}, \ + ${usage_directories} '-DLibrary_Type="${library_type}"', \ '-DSrcdir="${srcdir}"'} \ ${GNATPREPFLAGS} # preprocess_file is a command for use in recipes. It runs the first .gp file # among the rule's prerequisites through Gnatprep to produce the target. If the -# target is a usage project, then the usage-relevant directory variables are -# conveyed to it as Gnatprep symbols. Otherwise srcdir is conveyed, as it's -# needed by preprocessed build projects. +# target is a usage project, then the usage-relevant variables are conveyed to +# it as Gnatprep symbols. Otherwise srcdir is conveyed, as it's needed by +# preprocessed build projects. build_GPR = "${GNAT_BUILDER}" -P ${firstword ${filter %.gpr,$^}} \ ${addprefix -aP,${VPATH}} -p \ @@ -407,7 +411,7 @@ configuration_variables += \ GNATPREPFLAGS GNAT_BUILDER_FLAGS ADAFLAGS CPPFLAGS CFLAGS CXXFLAGS FFLAGS \ GNATBINDFLAGS GNATLINKFLAGS LDFLAGS GNATFLAGS \ DESTDIR \ - dirgpr relocatable_package \ + dirgpr relocatable_package library_type \ prefix exec_prefix datarootdir localstatedir \ bindir libexecdir \ datadir sysconfdir statedir cachedir logdir runstatedir lockdir \ @@ -692,7 +696,8 @@ show_configuration:: # How to preprocess the project Comfignat: ${Make_builddir}/comfignat.gpr: comfignat.gpr.gp | ${Make_builddir}/ - "${GNATPREP}" $< $@ -DInvoked_By_Makefile ${all_directories} ${GNATPREPFLAGS} + "${GNATPREP}" $< $@ -DInvoked_By_Makefile ${all_directories} \ + '-DLibrary_Type="${library_type}"' ${GNATPREPFLAGS} # How to preprocess files that are needed during the build: ${Make_builddir}/%: %.gp | ${Make_builddir}/ diff --git a/manual.en.html b/manual.en.html index 3d25fc2..9910afb 100755 --- a/manual.en.html +++ b/manual.en.html @@ -112,7 +112,7 @@ and is also <p>The following applies to all of Comfignat including this document:</p> -<p>Copyright 2013 - 2015 Björn Persson, Bjorn@Rombobjörn.se</p> +<p>Copyright 2013 - 2016 Björn Persson, Bjorn@Rombobjörn.se</p> <p>This material is provided as is, with absolutely no warranty expressed or implied. Any use is at your own risk.</p> @@ -456,6 +456,43 @@ project will therefore automatically adapt to the current target architecture, so that 32-bit and 64-bit instances of the library can be installed in parallel and the right library will be used in every build.</p> +<h3 id="library_type">Shared and Static Libraries</h3> + +<p>Many libraries can be built either as a shared library or as a static +library. To enable this, use the variable <var>Comfignat.Library_Type</var> for +<var>Library_Kind</var> in the build-controlling project file, and the +preprocessor symbol <var>Library_Type</var> in the usage project file. The +default will then be to build a shared library, but installing users and +distributions can build a static library instead by setting +<var>library_type</var> to “<samp>static</samp>” on the Make command line. +The possible values of <var>Library_Type</var> are the same as for +<var>Library_Kind</var>: “<samp>dynamic</samp>”, “<samp>static</samp>”, and +“<samp>relocatable</samp>” which is an alias for “<samp>dynamic</samp>”.</p> + +<p>It may be necessary to also use <var>Comfignat.Library_Type</var> in a case +construction to set certain attributes only for one kind of library. It may for +example be desirable to set <var>Library_Interface</var> for a shared library +but not for a static library, to get the best automatic elaboration in both +cases. Here's a project file fragment that sets <var>Library_Version</var> and +<var>Library_Interface</var> only when building a shared library:</p> + +<pre class="example gpr"> for Library_Kind use Comfignat.Library_Type; + case Comfignat.Library_Type is + when "dynamic" | "relocatable" => + for Library_Version use "libexample.so.1"; + for Library_Interface use ("Example"); + when "static" => + null; + end case;</pre> + +<p>It is also possible to build both a shared and a static library in the same +Make invocation by overriding <var>LIBRARY_TYPE</var> on the builder command +line:</p> + +<pre class="example make">base: build_example.gpr + ${build_GPR} -margs -XLIBRARY_TYPE=dynamic + ${build_GPR} -margs -XLIBRARY_TYPE=static</pre> + <h3 id="options">Options</h3> <p>Your software may have optional features or properties that can be enabled @@ -510,7 +547,8 @@ have its own <var>runstatedir</var>.</p> <p>There are several options variables that let installing users and distributions control which arguments the build tools are invoked with. They have names that end with “<var>FLAGS</var>”, and are documented in -<var>INSTALL</var>. The value of <var>GNATFLAGS</var> is a combination of the +<a href="INSTALL"><var>INSTALL</var></a>. +The value of <var>GNATFLAGS</var> is a combination of the other options variables and must not be modified in a way that disregards the other variables. Apart from that restriction you can assign default values to optional arguments in these variables, but be sure to do the assignments with diff --git a/testsuite/inputs/build_static b/testsuite/inputs/build_static new file mode 100644 index 0000000..30a0fa7 --- /dev/null +++ b/testsuite/inputs/build_static @@ -0,0 +1,18 @@ +# part of Comfignat's testsuite +# Copyright 2016 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 testsuite +# 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. + + +static=true +expect_configuration +expect_generated_files +common_setup +make library_type=static diff --git a/testsuite/sources/dual_library/Makefile b/testsuite/sources/dual_library/Makefile new file mode 100644 index 0000000..aa57d84 --- /dev/null +++ b/testsuite/sources/dual_library/Makefile @@ -0,0 +1,20 @@ +# part of Comfignat's testsuite +# Copyright 2016 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 testsuite +# 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. + + +include comfignat.mk + +usage_GPRs = testcase.gpr + +base: build_testcase.gpr + ${build_GPR} -margs -XLIBRARY_TYPE=dynamic + ${build_GPR} -margs -XLIBRARY_TYPE=static diff --git a/testsuite/sources/dual_library/build_testcase.gpr.gp b/testsuite/sources/dual_library/build_testcase.gpr.gp new file mode 100644 index 0000000..1c39659 --- /dev/null +++ b/testsuite/sources/dual_library/build_testcase.gpr.gp @@ -0,0 +1,28 @@ +-- part of Comfignat's testsuite +-- Copyright 2016 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 testsuite +-- 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. + + +with "comfignat.gpr"; + +library project Build_Testcase is + + for Library_Name use "testcase"; + for Library_Kind use Comfignat.Library_Type; + for Library_Version use "libtestcase.so.1"; + for Library_Interface use ("Testcase"); + for Source_Dirs use ($Srcdir); + for Object_Dir use Comfignat.Objdir; + for Library_Src_Dir use Comfignat.Stage_Includedir & "/testcase"; + for Library_Dir use Comfignat.Stage_Libdir; + for Library_ALI_Dir use Comfignat.Stage_Alidir & "/testcase"; + +end Build_Testcase; diff --git a/testsuite/sources/dual_library/generated_files b/testsuite/sources/dual_library/generated_files new file mode 100644 index 0000000..45a5035 --- /dev/null +++ b/testsuite/sources/dual_library/generated_files @@ -0,0 +1,8 @@ +build_testcase.gpr +comfignat.gpr +${stage_includedir}/testcase/testcase.ads +${stage_libdir}/libtestcase.so.1 +${stage_libdir}/libtestcase.so +${stage_libdir}/libtestcase.a +${stage_alidir}/testcase/testcase.ali +${stage_gprdir}/testcase.gpr diff --git a/testsuite/sources/dual_library/testcase.adb b/testsuite/sources/dual_library/testcase.adb new file mode 100644 index 0000000..df96cc3 --- /dev/null +++ b/testsuite/sources/dual_library/testcase.adb @@ -0,0 +1,24 @@ +-- part of Comfignat's testsuite +-- Copyright 2014 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 testsuite +-- 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. + + +with Ada.Calendar; use Ada.Calendar; +with Ada.Text_IO; use Ada.Text_IO; + +package body Testcase is + + function Year return String is + begin + return Year(Clock)'Img; + end Year; + +end Testcase; diff --git a/testsuite/sources/dual_library/testcase.ads b/testsuite/sources/dual_library/testcase.ads new file mode 100644 index 0000000..d2646b8 --- /dev/null +++ b/testsuite/sources/dual_library/testcase.ads @@ -0,0 +1,18 @@ +-- part of Comfignat's testsuite +-- Copyright 2014 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 testsuite +-- 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. + + +package Testcase is + + function Year return String; + +end Testcase; diff --git a/testsuite/sources/dual_library/testcase.gpr.gp b/testsuite/sources/dual_library/testcase.gpr.gp new file mode 100644 index 0000000..e2833c1 --- /dev/null +++ b/testsuite/sources/dual_library/testcase.gpr.gp @@ -0,0 +1,27 @@ +-- part of Comfignat's testsuite +-- Copyright 2016 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 testsuite +-- 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. + + +#if Directories_GPR'Defined then +with $Directories_GPR; +#end if; + +library project Testcase is + + for Library_Name use "testcase"; + for Library_Kind use external("testcase_library_type", $Library_Type); + for Source_Dirs use ($Includedir & "/testcase"); + for Library_Dir use $Libdir; + for Library_ALI_Dir use $Alidir & "/testcase"; + for Externally_Built use "true"; + +end Testcase; diff --git a/testsuite/sources/library_2/Makefile b/testsuite/sources/library_2/Makefile index 63d47ef..9341253 100644 --- a/testsuite/sources/library_2/Makefile +++ b/testsuite/sources/library_2/Makefile @@ -1,5 +1,5 @@ # part of Comfignat's testsuite -# Copyright 2014 B. Persson, Bjorn@Rombobeorn.se +# Copyright 2014 - 2016 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. @@ -16,5 +16,5 @@ include comfignat.mk build_GPRs = build_testcase.gpr usage_GPRs = testcase.gpr other.gpr -Gnatprep_arguments = -Dkind='"dynamic"' +Gnatprep_arguments = -Dkind=Comfignat.Library_Type -Dslash='"/"' builder_arguments = -Xname=testcase diff --git a/testsuite/sources/library_2/build_testcase.gpr b/testsuite/sources/library_2/build_testcase.gpr index 29c62b9..c157484 100644 --- a/testsuite/sources/library_2/build_testcase.gpr +++ b/testsuite/sources/library_2/build_testcase.gpr @@ -1,5 +1,5 @@ -- part of Comfignat's testsuite --- Copyright 2014 B. Persson, Bjorn@Rombobeorn.se +-- Copyright 2014 - 2016 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. @@ -19,7 +19,7 @@ library project Build_Testcase is for Library_Version use Intermediate.Soname; for Library_Interface use (Intermediate.Package_Name); for Object_Dir use Intermediate.Objdir; - for Library_Src_Dir use Intermediate.Includedir & "/" & Intermediate.Name; + for Library_Src_Dir use Intermediate.Includedir & Intermediate.Slash_Name; for Library_Dir use Intermediate.Libdir; - for Library_ALI_Dir use Intermediate.Alidir & "/" & Intermediate.Name; + for Library_ALI_Dir use Intermediate.Alidir & Intermediate.Slash_Name; end Build_Testcase; diff --git a/testsuite/sources/library_2/generated_files b/testsuite/sources/library_2/generated_files index 015651b..595ef75 100644 --- a/testsuite/sources/library_2/generated_files +++ b/testsuite/sources/library_2/generated_files @@ -1,8 +1,8 @@ intermediate.gpr comfignat.gpr ${stage_includedir}/testcase/testcase.ads -${stage_libdir}/libtestcase.so.1 -${stage_libdir}/libtestcase.so +${stage_libdir}/libtestcase.`if [ -n "${static}" ]; then echo a; else echo so.1; fi` +`if [ -z "${static}" ]; then echo ${stage_libdir}/libtestcase.so; fi` ${stage_alidir}/testcase/testcase.ali ${stage_gprdir}/testcase.gpr ${stage_gprdir}/other.gpr diff --git a/testsuite/sources/library_2/intermediate.gpr.gp b/testsuite/sources/library_2/intermediate.gpr.gp index 6d6b8f2..9af9a4e 100644 --- a/testsuite/sources/library_2/intermediate.gpr.gp +++ b/testsuite/sources/library_2/intermediate.gpr.gp @@ -1,5 +1,5 @@ -- part of Comfignat's testsuite --- Copyright 2014 B. Persson, Bjorn@Rombobeorn.se +-- Copyright 2014 - 2016 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. @@ -16,6 +16,7 @@ with "comfignat.gpr"; abstract project Intermediate is Name := Names.Name; + Slash_Name := $Slash & Name; Kind := $Kind; Soname := Names.Soname; Package_Name := Names.Package_Name; diff --git a/testsuite/sources/library_2/testcase.gpr.gp b/testsuite/sources/library_2/testcase.gpr.gp index de4645c..7c4d945 100644 --- a/testsuite/sources/library_2/testcase.gpr.gp +++ b/testsuite/sources/library_2/testcase.gpr.gp @@ -1,5 +1,5 @@ -- part of Comfignat's testsuite --- Copyright 2014 B. Persson, Bjorn@Rombobeorn.se +-- Copyright 2014 - 2016 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. @@ -18,7 +18,7 @@ with $Directories_GPR; library project Testcase is for Library_Name use "testcase"; - for Library_Kind use "dynamic"; + for Library_Kind use $Library_Type; for Source_Dirs use ($Includedir & "/testcase"); for Library_Dir use $Libdir; for Library_ALI_Dir use $Alidir & "/testcase"; |