title: Language/Platform/Build-Independent Dependency Manager
body: <p>I'm in need of a dependency manager that is not tied to a particular language or build system. I've looked into several excellent tools (Gradle, Bazel, Hunter, Biicode, Conan, etc.), but none satisfy my requirements (see below). I've also used Git Submodules and Mercurial Subrepos.</p>
  
  <p>My needs are well described in a <a href="https://www.youtube.com/watch?v=UnHeOywnj1k" rel="noreferrer">presentation</a> by Daniel Pfeifer at Meeting C++ 2014. To summarize the goals of this dependency tool (discussed @18:55 of the linked video):</p>
  
  <ul>
  <li>Not just a <em>package</em> manager</li>
  <li>Supports pre-built or source dependencies</li>
  <li>Can download or find locally - no unnecessary downloads</li>
  <li>Fetches using a variety of methods (i.e. download, or VCS clones, etc.)</li>
  <li>Integrated with the system installer - can check if lib is installed</li>
  <li>No need to adapt source code in any way</li>
  <li>No need to adapt the build system</li>
  <li>Cross-platform </li>
  </ul>
  
  <p>Further requirements or clarifications I would add:</p>
  
  <ul>
  <li>Suitable for third-party and/or versioned dependencies, but also capable of specifying non-versioned and/or co-developed dependencies (probably specified by a git/mercurial hash or tag).</li>
  <li>Provides a mechanism to override the specified fetching behavior to use some alternate dependency version of my choosing.</li>
  <li>No need to manually set up a dependency store. I'm not opposed to a central dependency location as a way to avoid redundant or circular dependencies. However, we need the simplicity of cloning a repo and executing some top-level build script that invokes the dependency manager and builds everything.</li>
  <li>Despite the requirement that I should not have to modify my build system, obviously some top-level build must wield the dependency manager and then feed those dependencies to the individual builds. The requirement means that the <em>individual builds</em> should not be aware of the dependency manager. For example, if using CMake for a C++ package, I should not need to modify its CMakeLists.txt to make <em>special</em> functional calls to locate dependencies. Rather, the top-level build manager should invoke the dependency manager to retrieve the dependencies and then provide arguments CMake can consume in traditional ways (i.e find_package or add_subdirectory). In other words, I should always have the option of manually doing the work of the top-level build and dependency manager and the individual build should not know the difference.</li>
  </ul>
  
  <p>Nice-to-have:</p>
  
  <ul>
  <li>A way to interrogate the dependency manager after-the-fact to find where a dependency was placed. This would allow me to create VCS hooks to automatically update the hash in dependency metadata of co-developed source repo dependencies. (Like submodules or subrepos do).</li>
  </ul>