BOLTS is intended as very contribution driven project. Is is also quite flexible from a technical point of view, which allows to incorporate content like OpenSCAD module, FreeCAD python functions, FreeCAD Models or STL files that were not specifically created for BOLTS with minimal changes.
While this is great as it allows to reuse a lot of work already done, it creates another problem: One has to make sure that the licenses of the different parts are compatible with each other and that the use of parts from BOLTS in an assembly does not pose license restrictions on the result. Also we want to make sure that the resulting distribution of files can be distributed under a open source license.
I did a bit of reading in the last few days, and now I want to describe how to handle these problems in BOLTS. As a disclaimer I want to add that I am not a lawyer, so everything that follows is given without any warranties and might be wrong. If in doubt, ask someone who is qualified to answer such questions.
BOLTS consists of a number of different parts that work together in different ways:
bolttools is a collection of python modules that handle various tasks and aspects of the processes in BOLTS: create HTML documentation, parse the blt and base files, perform consistency checks on the parts and assemble the different distributions (BOLTS for FreeCAD, BOLTS for OpenSCAD). bolttools is developed by me and licensed under the LGPL 2.1 or later.
the blt files are YAML files that contain not backend specific data and metadata about the part (more precisely about classes of parts, because there is often a large amount of redundancy). These files contain among other information the tables with dimensions, and form the foundation of BOLTS. Its license is chosen by the creator.
the backend specific data is specific to the CAD application (FreeCAD or OpenSCAD at the moment), and can come in two forms: as code (OpenSCAD modules or FreeCAD python functions) or as data (stl files for OpenSCAD or fcstd files for FreeCAD. Its license is chosen by the creator.
When we put together a distribution consisiting of all these files with different licenses, what license has the result? This is a difficult question, and in fact there are many licenses with conflicting terms, so that they can not be combined at all.
We want to focus on open source licenses, and luckily someone who knows explained the situation there very well. In particular I like the graph on this page.
And when we take some content with a certain license A and process it with a program with a certain license B, what license C has the result?
This is much easier to answer, and again I reference people who know. The result has license A, unless very specific conditions apply.
In BOLTS we have both of these mechanisms, in combination that depends on the target CAD system:
The BOLTS for FreeCAD distribution consists of the blt files, bolttools (for parsing them) and the FreeCAD backend specific files, so it represents a combined work consisting of these three parts.
Focusing on the most popular OpenSource licenses (the one discussed her), that means that for the BOLTS for FreeCAD distribution we have to choose a license, that is reachable from every license of the components. As bolttools is one of the components, this means that this license can not be more liberal then LGPL 2.1+.
If there are blt files of backend specific files that are licensed under a less liberal license (e.g. GPL 3), than the whole distribution must be licensed as GPL 3.
Therefore BOLTS for FreeCAD provides LGPL and GPL distributions, where in the former all components incompatible with the LGPL are removed. This means that the GPL distribution contains more parts, but is only available under a less liberal license.
If the FreeCAD people decided that they want to integrate BOLTS into FreeCAD (FreeCAD is licensed under LGPL), they would form a combined work of FreeCAD and BOLTS. There are two possibilities. Either they integrate the LGPL BOLTS distribution, which contains less parts, or they integrate the GPL BOLTS distribution and change the FreeCAD license to GPL.
The BOLTS for OpenSCAD distribution works a bit differently. It consists out of the OpenSCAD backend specific files, OpenSCAD code containing the tables and generated glue code.
The table and glue code is generated by bolttools from the blt files, so this code has the same license as the blt files. The backend specific files have the license that their creator chose. And BOLTS for OpenSCAD is a combined work of all these parts, which tells us again what licenses we can choose for the result, or which components we have to leave out of the distribution to be able to license it under a specific license.
Note that BOLTS for OpenSCAD does not contain bolttools, so in principle a BOLTS for OpenSCAD distribution with a license more liberal than LGPL is possible. However, there are some helper and utility modules that are always included, which are at the moment licensed under LGPL 2.1+. But (in contrast to bolttools) I could imagine to relicense these under a more liberal license, if there is a need for it (e.g. a lot of liberally licensed code being contributed).
But the same considerations have to be applied to the case, when someone uses BOLTS for OpenSCAD or FreeCAD to to create a nice design. This design is a combined work consisting of the content that the user created, and the parts provided by BOLTS. So does this pose restrictions on the license of the design?
This would be rather drastic, as that would severely limit the choice of licenses the user could assign to its design. This would limit the audience and the usefulness of BOLTS massively, so this is something that should be avoided.
I mentioned earlier, that there is application specific data in form of code and in form of data. These two cases have to be distinguished:
In this case on can consider the part as the result of a program (BOLTS), which is not affected by the license of the program. So parts created by code (FreeCAD python functions and OpenSCAD modules) cause no licensing related restrictions on the resulting design.
In this case on has to consider the final design as a combined work between the part (in form of a FreeCAD fcstd file or a STL file) and the rest of the design that the user created. If the BOLTS part were licensed under a fairly restrictive license like GPL, the whole design would need to be licensed under the GPL.
As this is undesirable, BOLTS must not contain backend specific data in form of data that causes such restrictions. This means, that such data must be placed in the public domain, or better yet, the author must waive all rights on this content using CC0. The latter is a legally more sound procedure, as the public domain is a legal concept that does not exist in all legislations.
I want to be able to consider the whole of BOLTS, i.e. all the content that is contained in the BOLTS git repo as a single combined work. I am not sure whether that is really necessary, but I could imagine that it might be necessary for things like a bolts-dev Debian package. At the moment BOLTS is licensed under GPL 3.0+, as this is the most restrictive license of all components.
However this makes it necessary to exclude GPL 2.0 (without the or any later version clause) material, as this can not be combined with GPL 3.0+ material.
These are a lot of complicated rules, and one is tempted to keep it simple and either require all contributions to be under a specific license, or to license BOLTS under the most restrictive license of all components.
However, one would then ignore a lot of possibly useful content that is already existing and could be incorporated easily, or one ends up with a very restrictive license for BOLTS, which limits its audience by e.g. prohibiting the inclusion in FreeCAD.
Therefore I tried to design BOLTS in such a way, that the work of assembling distributions that are compatible to a certain license can be automated. The license of each part is available in machine readable form in the .blt and .base files, which allows to decide programmatically whether something can be included in a distribution or not.
This results in the following license policy for contributions:
A contribution in form of a blt file or backend specific data in form of code can have one of the following licenses:
A contribution in form of backend specific data in form of data must be in the public domain or CC0 1.0.
From all available .blt files and backen specific data, distributions with specific licenses are created automatically.