{"id":18925627,"url":"https://github.com/jm1/muldi","last_synced_at":"2026-02-03T11:35:04.593Z","repository":{"id":69767717,"uuid":"256966155","full_name":"JM1/muldi","owner":"JM1","description":"muldi - multi distribution package generator","archived":false,"fork":false,"pushed_at":"2020-11-10T10:49:08.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-03T19:06:34.472Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JM1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-04-19T09:59:09.000Z","updated_at":"2020-11-10T10:49:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"ad60d6ca-93e6-42d3-8efe-25d3de650409","html_url":"https://github.com/JM1/muldi","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JM1/muldi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fmuldi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fmuldi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fmuldi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fmuldi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JM1","download_url":"https://codeload.github.com/JM1/muldi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fmuldi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29044429,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T10:09:22.136Z","status":"ssl_error","status_checked_at":"2026-02-03T10:09:16.814Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T11:12:38.988Z","updated_at":"2026-02-03T11:35:04.571Z","avatar_url":"https://github.com/JM1.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"[//]: # (kate: space-indent on; indent-width 2; word-wrap-column 100; word-wrap on;)\n[//]: # (kate: remove-trailing-spaces modified;)\n\n# `muldi` - multi distribution package generator\n\n[![License: GPL v3](\nhttps://img.shields.io/badge/License-GPLv3-blue.svg)](\nhttps://www.gnu.org/licenses/gpl-3.0)\n\n\u003cimg src=\"https://www.svgrepo.com/show/217080/dump-truck-truck.svg\" width=\"48\" /\u003e\n\nA Python program that helps developers to generate package control files for easy and fine-grained\ndistribution of reuseable, atomic source code artifacts, e.g. the header and source file of a C++\nclass, the header of a C++ template class or the source file of a Python module or class. It\nsupports various distribution formats, e.g. source-based systems such as CMake projects and Gentoo\nPortage packages or binary package distribution systems such as Debian packages.\n\n:warning: **NOTE**: This is just a sunday-morning idea and has not yet been implemented!\n\nFeel free to [contact me](mailto:jakobmeng@web.de), if you want to see `muldi` realized.\n\n## Problem statement\n\nYou develop code in one project. Then you work on another project and you realize, that you want to\nreuse parts from the first project. You do not want to simply copy the files because then you have\nto maintain the same code twice. You know how to refactor your code to increase its reuseability\nand you know plenty of ways to distribute it as an individual code project, either as source code\nor as binary packages. Unfortunately, writing and maintaining `CMakeLists.txt` or `*.emerge`\nor package `control` files is a tedious and repetitive task. In practice, you trade source\ncode maintenance costs off agaist increased package maintenance and distribution costs. The more\nfined-grained your project landscape gets, the more you spend on writing project management code.\n\n## Assumption\n\nFine-grained or atomic code artifacts with explicit dependency management improve code reuse.\nThe smaller they are, the better their reuse.\n\n## Approach\n\nWhy not generate redistributable software packages for each code artifact automatically?\n\nThe observation is that source files written in the same programming language, usually share a\ncommon code, project management and directory structure. For example, in C++ projects code is\nlocated in `include` and `src` subfolders, headers install to `/usr/include`, binaries to\n`/usr/bin` and libraries to `/usr/lib/x86_64-linux-gnu/`. Each code project has a name and a list of\nbuild or runtime dependencies. Dependencies vary in quantity, names and versions between different\npackaging systems, e.g. `libboost-all-dev` on Debian and `boost` on Arch Linux.\n\nWith `muldi`, you declare essential project metadata in a `.muldi.yml`, e.g. the project's name and\nits dependencies. `muldi` detects what programming language you have used, what kind of\nsoftware you wrote (Found `int main()`? An application! `*.hpp`, but no `*.cpp` found? Header-only\nlibrary!) and then generates project management and packaging code for you.\n\n*NOTE:* `muldi` does *NOT* try to support every possible packaging feature, instead it aims for the\nopposite: Exploit structural similarities, respect syntactic differences (e.g. names of\ndependencies) and then generate package control files such as `CMakeLists.txt` and Debian package\n`control` from predefined templates.\n\n# Usage\n\n```sh\nTODO\n```\n\n`muldi` is best used with a CI/CD system such as [`GitLab CI/CD`](https://docs.gitlab.com/ce/ci/) or\n[`Travis CI`](https://travis-ci.com/) to automatically build packages on each commit and upload them\nto a package repository, e.g. for [Debian](https://wiki.debian.org/DebianRepository/).\n\n## Related work\n\n* [`CMake`](https://cmake.org/documentation/):\n  A developer writes one (or more) `CMakeLists.txt` file per code project. End users then run\n  `cmake` to generate e.g. native `Makefile`'s to build the whole code on their platform using their\n  own toolset.\n  `muldi` tries to reduce the maintenance burden for developers: It generates meta build files such\n  as `CMakeLists.txt` or package-build files such as `control` files for Debian packages. This can\n  also be beneficial for end users because it makes it easier for developers to generate end user\n  installable packages with CI/CD pipelines.\n\n## Example\n\n```yaml\n# All keys except 'profiles' are optional and will be auto-detected if possible\nlanguage: cpp # or: cpp17, python, python2, python3\n\npackages:\n- deb\n- rpm\n- cmake\n\nassembly?/type?/mode?/module?: library\n# or: header-library, static-library, dynamic-library, executable\n\nname: lorem-ipsum\n\ndescription: |\n  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut\n  labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco\n  laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\n  voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n  non proident, sunt in culpa qui officia deserunt mollit anim id est laborum\n\nprofiles:\n- debian:\n  dependencies:\n  - cmake\n  - gcc\n```\n\n# Principles\n\n* easy to setup\n  - one additional file `.muldi.yml`\n  - self-explaining examples\n  - auto-versioning if possible, e.g. using timestamp and git commit hash\n* easy to migrate\n  - do not break existing `muldi` configs with new `muldi` releases\n  - external `muldi` interface (e.g. `.muldi.yml`) is backwards compatible\n* easy to contribute and maintain\n  - well-known and established programming language (Python)\n  - GitLab/GitHub-based development work flow (Fork \u0026 Merge, CI)\n  - be happy about extensions, e.g. languages, profiles, ...\n  - internals may change at any time\n* minimal feature set which is required for automatic code artifact management\n  - only common features across source code and package managers are supported,\n    e.g. `name`, `dependencies`\n  - no optional dependencies (?), e.g.\n    [`Recommends` or `Suggests` in Debian](\n     https://www.debian.org/doc/debian-policy/ch-relationships.html),\n    [`Weak Dependencies` in Fedora](\n     https://fedoraproject.org/wiki/Packaging:WeakDependencies) or\n    [`Recommends` and `Suggests` in SUSE (\u003e=10)](\n     https://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto).\n    Reasons:\n    + support and implementation not consistent (?)\n    + [`Optional dependencies don’t work`](\n       https://michael.stapelberg.ch/posts/2019-05-23-optional-dependencies/)\n\n## Getting Involved\n\nFeel free to [contact me](mailto:jakobmeng@web.de).\n\n## Authors\n\n* **Jakob Meng** - [JM1](https://github.com/JM1)\n\nSee also the list of [contributors](https://github.com/JM1/muldi/contributors) who participated in\nthis project.\n\n## License\n\nThis project is licensed under the GPL v3 License -\nsee the [LICENSE.md](LICENSE.md) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjm1%2Fmuldi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjm1%2Fmuldi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjm1%2Fmuldi/lists"}