⁃ What is CUL?
⁃ Why Choose CUL Over Other Package Managers?
⁃ Features
⁃ How to Install?
⁃ How to Use?
⁃ How to Contribute?
⁃ A Little Backstory
CUL is a command-line utility for the C and C++ programming languages that simplifies the downloading, management, and compilation of external modules. Its primary goal is to hide away the complexity of compiler flags and build configurations behind a single, beginner-friendly command like cul compile. By doing so, CUL aims to lower the entry barrier for newcomers and encourages them to build real projects in C/C++ without getting lost in linker errors or makefiles.
Inspired by Python’s pip and NodeJS’s npm, CUL aims to bring the same simplicity and efficiency to the C/C++ ecosystem — making it easy to install, update, organize, and compile project with minimal effort.
The code for CUL's Backend can be accessed here: CUL Backend.
Most C/C++ package managers are either too complex or too limited. CUL is here to change that!
CUL is built for developers, by a developer to make C/C++ package management as easy as Python’s pip or JavaScript’s npm! 🚀
Here's how CUL compares to other well-known C/C++ package managers. This comparison reflects CUL's current capabilities, not future planned features.
| Feature | CUL 🚀 | Conan 🏗️ | vcpkg 🏢 | Hunter 🏹 | Spack 🔬 |
|---|---|---|---|---|---|
| Ease of Use 🏆 | ✅ Intuitive CLI (pip/npm-like) | 🟡 Moderate learning curve | ✅ Easy, Visual Studio-friendly | 🟡 Moderate, CMake-centric | ❌ Complex, HPC-focused |
| Platform Support 💻 | ✅ Cross-platform | ✅ Cross-platform | ✅ Cross-platform | ✅ Cross-platform | ✅ Cross-platform |
| Repository Size 📚 | 🆕 Growing | 📦 Large | 📦 Large (Microsoft) | 📦 Moderate | 🏢 Extensive (scientific) |
| Build System Independence 🏗️❌ | ✅ Works standalone | ❌ Requires CMake | ❌ Requires MSBuild/CMake | ❌ CMake-focused | ❌ Complex build scripts |
| Versioning Support 🔢 | ✅ Available | ✅ Yes | ✅ Yes | ✅ Yes | |
| Dependency Resolution 🔄 | ✅ Automatic | 🔥 Advanced | 🔥 Advanced | ||
| Caching Mechanism 📀 | ✅ Yes | ✅ Yes | ❌ No | ❌ No | ✅ Yes |
| Custom Repositories 🌍 | ✅ Multi-registry | ✅ Yes | ❌ No | ❌ No | ✅ Yes |
| Fuzzy Search 🔍 | ✅ Yes | ❌ No | ❌ No | ❌ No | ❌ No |
| Community Support 🤝 | 🚀 Emerging | 💬 Active | 🏢 Microsoft-backed | 💬 Small but active | 🔬 Research-focused |
| Documentation 📖 | ✍️ Comprehensive, evolving | 📜 Extensive | 📜 Detailed | 📜 Moderate | 📜 Extensive |
| Binary Packages 📦 | ⏳ Planned | ✅ Yes | ✅ Yes | ❌ No | ✅ Yes |
| Security 🔒 | ⏳ Planned | ✅ Yes | 🔥 Advanced | ||
| Offline Installation |
✅ Supported via caching | ✅ Yes | ❌ No | ❌ No | ✅ Yes |
| Lightweight ⚡ | ✅ Yes | ❌ Heavy | ❌ Bloated | ✅ Yes | ❌ Complex setup |
| Error Logging 📜 | ✅ Yes | ❌ No | ❌ No | ❌ No | ❌ No |
| Learning Curve 📈 | ⭐ Gentle, beginner-friendly | 📉 Moderate | ⭐ Easy | 📉 Moderate | 📉 Steep |
- Provides minimalistic UI.
- Installs modules directly into project directory.
- Allows searching for the versions availabe, if any, before installing the module.
- Uses caching technique to install the module again in less amount of time without using the internet.
- Provides a way to list all the modules installed, both in human readable way and machine readable way, and store them into a .txt file.
- Allows downloading different versions of modules.
- Provides the way to initialize a project and maintain dependencies/requirements easily.
- Installs all the required modules by the current installing module automatically.
- Users can search for a module even if they know only a part of its name.
- Automatically logs warnings and errors in a .cul folder inside the project folder for ease of access.
- Modules can be downloaded from various registries hosted and maintained by independent individuals or organizations.
Installation Guide: Click Here
User Manual: Click Here
CUL is an open-source project, and contributions from the community are highly welcome!
If you have the skills and passion to improve this tool, feel free to contribute. All contributions will go through a thorough code review process before being approved.
- Fork the repository.
- Create a new branch for your feature or fix.
- Commit your changes and create a pull request.
- Wait for the code review and approval.
Thank you for contributing to CUL and making it better!
Feel free to share feedback or report issues in the GitHub Issues section. Let's make C/C++ module management hassle-free together!
During my early college days, I began learning Python after gaining experience with the C language. I often wondered why C didn't have a package management tool like Python's pip, which sparked an idea in me to create one. This project became my dream, motivated by my love for programming rather than the pursuit of fame or financial success.
At that time, I was unaware of existing tools like vcpkg and Conan that provide package management for C/C++. Instead of feeling discouraged by their existence, I found inspiration in them to improve my own tool, CUL. Initially, my plan was to implement basic functionalities such as installing, uninstalling, updating, and providing help. However, as I worked on the project, my desire to enhance its capabilities grew.
One particular incident during college strengthened my resolution to build CUL. A faculty member once gave our class a fun little activity and hinted that we could use graphics.h to complete it. Excited to experiment, I jumped in, only to find myself stuck battling linker errors for hours. The process of manually setting up external dependencies in C felt unnecessarily tedious compared to Python or other modern languages. That frustration stuck with me, and I knew there had to be a better way.
That experience, along with countless other struggles of dealing with dependencies in C/C++, reinforced my belief that a package management tool for C/C++ should exist. I continue to develop CUL with the hope of making it a valuable resource for others in the C/C++ community. I recognize the many excellent tools available and aim to learn from them while striving to contribute positively to the ecosystem. This journey is about growth, learning, and sharing knowledge within the programming community—turning past frustrations into a solution that benefits others.