I just created a dub package. Frankly, the whole thign is backward.

Egor Pugin egor.pugin at gmail.com
Sat May 7 21:36:40 UTC 2022


On Saturday, 7 May 2022 at 20:58:54 UTC, Dukc wrote:
> snip

Hi,

I see this thread is discussing package management/buils systems.
I have some experience in this area in C++ and will do some notes.

---

**1. Declarative artificial build descriptions**

See https://github.com/cppan
'specs' repo contains many examples, but they are serialized and 
not very useful as is (replace all '\\n' with '\n' in 'cppan' 
field).
You can check this build script with cmake inserions 
-https://github.com/cppan/cppan/blob/v1/cppan.yml
Cmake was used as a driver here.

Declarative approach showed itself unuseful in complex cases (C 
libs, C programs with complex build systems).
Relying on other tools also is a dependency, also very dangerous.

---

**2. Plugin-based compiled build descriptions**

Second (and existing) approach is compiled C++ code into shared 
object plugins.

https://software-network.org/
https://github.com/SoftwareNetwork
https://github.com/SoftwareNetwork/sw (main repo)
https://github.com/SoftwareNetwork/specifications (storage of 
specs, specs are visible on the website also)

Imperative approach and C++ itself give more space when 
describing builds, but there are limitations also.
Compilation can be quick with PCH (implemented and used) and 
probably with C++20 modules (not yet implemented).
Linking of these plugins take visible amount of time and a lot of 
RAM. So, parallel builds of these plugins are slow on small 
systems.

In general I see following problems with this approach.
We get now full tree of any build. How do we store build 
settings? We must be able to tweak any parameter, any definition, 
and compile/link option in any of downstream libs.
I used simple object-based config tree like json/yaml and this is 
the problem.
With such approach flexibility is the problem, we cannot pass 
custom data structures as config to plugins and order to use them.

Some scalability is present, but not great because of some bad 
implementation decisions.
Low or very low flexibility. It is hard to ask dependencyA to 
build with option X.

You can check the website, some application is possible, but 
still it is not that smooth.
Project have some integrations with cmake. Build capabilities as 
make/ninja.

---

**3. [WIP] Next iteration, current ideas**

Build description of a project should be compiled into an 
executable binary that contains whole build tree config.
Every target(package) must have its build config in the form of 
polymorphic object so it can change any property directly, not in 
any json/yaml/xml-like tree structure.

Not giving more details here because they are still only in form 
of ideas.

---

**Ending**

I see some mentions or preferences of some people for p.1. or p.2.
But curious readers may try to repeat steps 1 or 2 get their own 
experience which takes couple of years or point what was done 
wrong in their opinion.

Quick comments about some existing high level C++ tools (build 
systems (BS), build system generators (BSG) and package managers 
(PM)).

**cmake** - BSG; very bad DSL; not viable in long term?
**meson** - BSG; better because of python-like DSL. But bad 
because not imperative, not real Python (very bad - look at their 
parser). Questionable system of project settings. Need more 
practical work on their PM.
**premake** - BSG; Lua. Lua is fine.
**conan** - PM; python dsl is good, but it's hard to work with 
every underlying BS projects have.
**vcpkg** - PM; what DSL? still no package versions? There was 
some work. Are package versions ready? Many decisions are 
questionable also. Project is pushed with MS power, has a lot of 
users.
**xmake** - BS+BSG+PM; Lua as build desc; looks good, no deps on 
BS/PM, needs evaluation. Lua is fine.
**make** - BS; just works. Easy for simple configs, harder for 
large and huge projects. P.3 future projects must aim for its 
simplicity in describing simple builds.
**ninja** - BS; works. What about dynamic build graphs 
(Fortran/C++ modules)?
**presented here**
**cppan** - BSGG: yaml->cmake; cmake is bad, building something 
on the top of it is worse.
**sw** - BS+BSG+PM; C++ as build desc; complex native plugins 
building; low flexibility on huge build graphs.
**other langs**
**D(dub,...?)** - do not know much. You should tell better.
**rust(cargo)** - BS(?)+PM(?); smooth integration, does it job.
**java(...)** - established set of tools; ecosystem is fine.
**C#(...)** - powered by MS.

Not implementing BS+BSG+PM combo is bad.
You will get dependency on make/ninja/PM etc.
Viable project must do everything itself.


More information about the Digitalmars-d mailing list