Coder Social home page Coder Social logo

pigei / hunter Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ruslo/hunter

0.0 1.0 0.0 1.46 MB

:package: Cross-platform package manager for C++ (based on CMake ExternalProject). Linux, Mac, Windows, iOS, Android, Raspberry Pi.

Home Page: http://goo.gl/wiAG

License: BSD 2-Clause "Simplified" License

CMake 86.51% Shell 1.77% Python 1.64% C++ 7.85% Batchfile 0.02% PowerShell 2.21%

hunter's Introduction

Hunter Build Status

  • Cross-platform package manager for C++ (based on CMake ExternalProject)
  • Supported platforms: Linux, Mac, Windows, iOS, Android, Raspberry Pi

What is it?

Every Hunter release archive is a meta-package with build instructions and URLs of real packages:

Hunter (0.4.2) = {
    Boost (1.55.0, 1.56.0, 1.57.0),
    GTest (1.7.0),
    OpenCV (3.0.0-beta, 2.4.11, 2.4.10),
    OpenSSL (1.0.2a, 0.9.8y),
    ...
}
  • Default build versions can be found in default.cmake file and are customizable (see Config-ID)
  • Per package versions are available in corresponding hunter.cmake file (e.g. GTest). You can pick one version that already exists or add a new one

Features

  • Automatic dependencies download
  • List of dependencies is a part of CMake code of the project
  • No emerge, apt-get, brew etc. needed before build, now it's simply cmake --build
  • Express install instructions in terms of CMake commands instead of raw README text or other script
  • Reusable ExternalProject_Add recipies (DRY principle)
  • Once written formula (build scheme) can be used by other projects, subprojects etc. without copying of collection of superbuild files. Just change 2 lines of code: input parameters SHA1/URL of HunterGate command
  • Several levels of build customization:
  • Hunter-ID - list of packages and mapping version-url-sha1
  • Config-ID - version of package to build and build options
  • Toolchain-ID - compiler and flags
  • Build type (e.g. Release/Debug)
  • Shareable root directory with build synchronization
  • Any number of projects can use root directory and add new packages simultaneously
  • Manage anything that can be downloaded by URL and checked with SHA1 hash:
  • C++ packages
  • CMake modules
  • Additional sources
  • Resources (pictures, data for testing, ...)
  • Backward compatibility. Turn Hunter off by adding one option HUNTER_ENABLED=OFF to use your old settings
  • No other dependencies - just CMake and your environment/IDE (no need for Git or Python or anything)
  • Works everywhere: CMake-GUI, Qt Creator, Visual Studio, Xcode, Cygwin, MinGW, Jenkins, Travis etc.

Notes about version of CMake

First step

  • Set HUNTER_ROOT environment variable to an empty directory. This directory will be used by HunterGate module for storing packages and utility files. Using environment variable is recommended but not mandatory, see other options.

  • Set minimum CMake version:

cmake_minimum_required(VERSION 3.0)
  • Copy gate module to your project and include it:
include("cmake/HunterGate.cmake")
  • This module will download archive automatically from URL that you provide to the HUNTER_ROOT directory (it means that there is no need to clone this repository in general, see notes):
HunterGate(
    URL "https://github.com/ruslo/hunter/archive/v0.10.9.tar.gz"
    SHA1 "53b198e364dc7bc8360fc545f798563229bd7e20"
)
  • Now project can be started:
project(Foo)
  • Let's download and install boost.{regex,system,filesystem}:
hunter_add_package(Boost COMPONENTS regex system filesystem)
  • Hunter part is done, now well known CMake-style kung-fu (see pkg.boost):
find_package(Boost CONFIG REQUIRED regex system filesystem)

add_executable(foo foo.cpp)
target_link_libraries(foo PUBLIC Boost::regex Boost::system Boost::filesystem)
  • Summarize:
cmake_minimum_required(VERSION 3.0)

include("cmake/HunterGate.cmake")
HunterGate(
    URL "https://github.com/ruslo/hunter/archive/v0.10.9.tar.gz"
    SHA1 "53b198e364dc7bc8360fc545f798563229bd7e20"
)

project(Foo)

hunter_add_package(Boost COMPONENTS regex system filesystem)
find_package(Boost CONFIG REQUIRED regex system filesystem)

add_executable(foo foo.cpp)
target_link_libraries(foo PUBLIC Boost::regex Boost::system Boost::filesystem)
  • Build it:
> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON -DCMAKE_BUILD_TYPE=Release
> cmake --build _builds --config Release

Usage

Hunter-ID

First level of customization. Hunter-ID is the first 7 digits of SHA1 of Hunter archive. I.e. each Hunter-ID contains list of projects that you can build and list of versions. Each version has it's unique URL and SHA1. Several Hunter-ID can coexists in same HUNTER_ROOT directory. HunterGate command will control your choice:

  • 1eae623
  • Hunter 0.8.3
  • Foo 1.0.0 -> http://mysite.com/Foo-1.0.0.tar.gz
  • Boo 2.0.0 -> http://mysite.com/Boo-2.0.0.tar.gz
  • Roo 1.2.3 -> http://mysite.com/Roo-1.2.3.tar.gz
  • -> ${HUNTER_ROOT}/_Base/1eae623/...
  • e07a124
  • Hunter 0.8.4
  • Awesome 1.0.0 -> http://example.com/Awesome-1.0.0.tar.gz
  • Best 2.0.0 -> http://example.com/Best-2.0.0.tar.gz
  • Foo 1.0.0 -> http://example.com/Foo-1.0.0-patch-1.tar.gz # yep, different URL/SHA1
  • -> ${HUNTER_ROOT}/_Base/e07a124/...

Message in logs:

-- [hunter] [ Hunter-ID: 1eae623 | Config-ID: ... | Toolchain-ID: ... ]
-- [hunter] [ Hunter-ID: e07a124 | Config-ID: ... | Toolchain-ID: ... ]

Config-ID

Second level of customization. Config-ID is the first 7 digits of SHA1 of the file with hunter_config commands (internal unified representation). This level can be customized with HunterGate options: GLOBAL, LOCAL and FILEPATH. Same Hunter-ID can be built with different versions of packages and different CMake arguments:

  • 0fa873a
  • Foo 1.0.0
  • Boo 2.0.0 with option BOO_WITH_SOMETHING=YES
  • -> ${HUNTER_ROOT}/_Base/1eae623/0fa873a
  • e9da39c
  • Foo 2.1.0 with option FOO_SUPER_MODE=YES
  • Boo 3.0.0 with option BUILD_SHARED_LIBS=ON
  • -> ${HUNTER_ROOT}/_Base/1eae623/e9da39c

Message in logs:

-- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: ... ]
-- [hunter] [ Hunter-ID: 1eae623 | Config-ID: e9da39c | Toolchain-ID: ... ]

Toolchain-ID

Third level of customization. Each build can be run with different toolchain. In general the result is completely different root lib/include directories. For example on Windows you can simultaniously build Visual Studio (32/64), NMake, Cygwin and MinGW projects, on Linux GCC/Clang, on Mac Xcode, Makefile, iOS. Or choose different clang tools like static analyzer/sanitizers and other platforms like Android/Raspberry Pi. Each toolchain file will be forwarded to external project so if you create toolchain with compiler g++ and flag -std=c++11 all dependent projects will be built by g++ -std=c++11. Information about toolchain has some internal representation (toolchain.info) and user can see first 7 digits (ID) of SHA1 hash of this file.

  • d46ea0b
  • gcc
  • -> ${HUNTER_ROOT}/_Base/1eae623/0fa873a/d46ea0b
  • c018e63
  • clang
  • -> ${HUNTER_ROOT}/_Base/1eae623/0fa873a/c018e63
  • c39da39
  • clang -std=c++11
  • -> ${HUNTER_ROOT}/_Base/1eae623/0fa873a/c39da39

Message in logs:

-- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: d46ea0b ]
-- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: c018e63 ]
-- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: c39da39 ]

Uninstall

All directories inside ${HUNTER_ROOT}/_Base are reconstructible. You can remove all temps (downloads, unpacked directories, installed directories etc.) by command:

rm -rf "${HUNTER_ROOT}/_Base"

or remove particular Hunter-ID by command:

rm -rf "${HUNTER_ROOT}/_Base/62422b8" # remove installed libraries
rm -rf "${HUNTER_ROOT}/_Base/Download/Hunter/0.8.3/62422b8" # remove Hunter itself

Questions?

Feel free to open new issue if you want to ask any questions.

Contribution

Donations

Links

hunter's People

Contributors

ruslo avatar headupinclouds avatar pretyman avatar alamaison avatar daminetreg avatar aadityakalsi avatar oliverdaniell avatar alapshin avatar dinno avatar rcdailey avatar

Watchers

Pierluigi Taddei avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.