The source package of the SMS++ umbrella
for the PPA, out of
which Launchpad builds one library package per module, one command package per
tool and the smspp-project metapackage of them all:
sudo add-apt-repository ppa:smspp-project/smspp
sudo apt install smspp-project # everything
sudo apt install smspp-ucblock # the Unit Commitment tool alone
sudo apt install libsmspp-mcf-dev # the headers of the MCFBlock module
The umbrella is built once, and the install of each module goes to its own
package: libsmspp-<module><soname> holds the shared library,
libsmspp-<module>-dev the headers and the CMake configuration that
find_package() finds, smspp-<tool> the executable with its configuration
files, its examples and its man page.
debian/ the packaging, with the tables of the packages that
gen_debian.py writes: control, modules.tsv, tools.tsv
gen_debian.py generator of those tables, whose own tables carry the
modules, the tools and their dependencies
mk-ppa-source source package of a release, for one or more series
daqp/ the source package of DAQP, a QP solver of the MILP
Solvers, which no Ubuntu series carries
qpoases/ the source package of qpOASES, another QP solver of
the MILP Solvers, which no Ubuntu series carries
The tag of the umbrella publishes the release tarball, from which
./mk-ppa-source 0.6.0 resolute --upload
builds the source package of that version for that series and uploads it to
the PPA, which then builds the binary packages for every architecture. The
upload needs a GPG key registered on Launchpad, and devscripts and dput
installed.
A new module needs its row in the LIBS table of gen_debian.py (directory,
package base, the modules it needs, the -dev packages outside the project
that its CMake configuration finds, and its description), and a new tool its
row in TOOLS. The version of a package comes from the VERSION.txt of its
module, so a minor bump renames the library package: that is the point of the
name, since the SONAME changes with it.
CPLEX, Gurobi, SCIP and MOSEK are not redistributable, and the C interface of
Clarabel is in no package, so libsmspp-milp carries the HiGHS, DAQP and
qpOASES backends alone; a build against the others is still the one of the
sources. FastFlow, which the core fetches at configure time, travels in the
source package as a second component, so that the build needs no network.
DAQP, the dual active-set solver of DAQPMILPSolver, is in no Ubuntu series,
so the PPA carries it as a source package of its own, out of the tag of its
release and of daqp/debian: libdaqp0.10 holds the shared library, whose
SONAME is libdaqp.so.0.10, and libdaqp-dev the headers, the static library
and the CMake configuration. The patch in daqp/debian/patches builds the
static library without linking the shared one, links the math library and
installs the CMake configuration where find_package() looks for it.
daqp/mk-ppa-source noble resolute --upload
builds the source package of DAQP for both series and uploads it; it has to
be built on Launchpad before the first upload of SMS++ that depends on
libdaqp-dev. A new release of DAQP is DAQP_VERSION in that script, and a
new SONAME the name of the library package in daqp/debian/control and of
its .install file.
qpOASES, the online active-set solver of QPOASESMILPSolver, is in no Ubuntu
series either, and the PPA carries it the same way, out of the tag of its
release and of qpoases/debian: libqpoases3.2 holds the shared library,
whose SONAME is libqpOASES.so.3.2 and whose own BLAS and LAPACK
replacements are renamed, and libqpoases-dev the headers and the CMake
configuration. The rules drop the RPATH that upstream puts on the library and
let the newer CMake accept the old minimum version of the project.
qpoases/mk-ppa-source noble resolute --upload
builds it for both series and uploads it, before the first upload of SMS++
that depends on libqpoases-dev.