Skip to content

igsha/cmake-registry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cmake-registry

CMake Registry Manager is a small tool to work with cmake local registry.

Motivations

E.g., I have a project bit_iterator that can represent file as a bit stream. Another project bit_parser uses my bit_iterator to parse a file bit by bit. I need to connect these projects.

The obvious way is to create installable package for bit_iterator like deb-package. But I need to contantly fix both project at any time. CMake is a build system that I always use. It has the local registry that can be used for my goals.

Installation

Just put cmake-registry executable file (a simple bash-script) into /usr/local/bin or ~/bin or whatever you want (add it`s location into PATH system variable).

Help

cmake-registry has a small help, just type cmake-registry help. It supports getting help by topic: cmake-registry help install.

Registry flow

Let's install bit_iterator into cmake registry. The first approach is to install a tar.gz archive into the cache of the registry ($HOME/.cmake/cache).

$ ./cmake-registry install ~/bit_iterator/build/bit_iterator-0.1.0-Linux.tar.gz
Installing /home/igor/bit_iterator/build/bit_iterator-0.1.0-Linux.tar.gz into /home/igor/.cmake/cache
Created path-config for project : /home/igor/.cmake/packages/BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee

This command creates so-called path-config that contains the location of BitIteratorConfig.cmake file. The last one is a project configuration file that is used by cmake to correctly set include and library paths. My BitIteratorConfig.cmake contains:

find_path(BitIterator_INCLUDE_DIRS NAMES bit_iterator.hpp HINTS ${CMAKE_CURRENT_LIST_DIR}/../../include)

It sets INCLUDE_DIRS relatively to the script directory.

Now my bit_parser CMakeLists.txt file calls find_package(BitIterator REQUIRED) and nothig else. cmake looks into /home/igor/.cmake/packages/BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee, sees

$ cat ~/.cmake/packages/BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee 
/home/igor/.cmake/cache/bit_iterator-0.1.0-Linux/share/cmake
$ ls ~/.cmake/cache/bit_iterator-0.1.0-Linux/share/cmake
BitIteratorConfig.cmake  BitIteratorConfigVersion.cmake

Then reads BitIteratorConfig.cmake and correctly sets BitIterator_INCLUDE_DIRS variable.

The second approach is to point path-config to bit_iterator build tree folder. After make package the build tree folder contains _CPack_PACKAGES folder that is the content of tar.gz package archive. To create the link in registry I just need to pass the full path of the BitIteratorConfig.cmake file:

$ ./cmake-registry make ~/bit_iterator/build/_CPack_Packages/Linux/TGZ/bit_iterator-0.1.0-Linux/share/cmake/BitIteratorConfig.cmake
Created path-config for project : /home/igor/.cmake/packages/BitIterator/4c74e74620b1ba554d7d65776b243518
$ cat /home/igor/.cmake/packages/BitIterator/4c74e74620b1ba554d7d65776b243518
/home/igor/bit_iterator/build/_CPack_Packages/Linux/TGZ/bit_iterator-0.1.0-Linux/share/cmake

Now I can see all my installations through cmake-registry list:

$ ./cmake-registry list
BitIterator/4c74e74620b1ba554d7d65776b243518: /home/igor/bit_iterator/build/_CPack_Packages/Linux/TGZ/bit_iterator-0.1.0-Linux/share/cmake
BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee: /home/igor/.cmake/cache/bit_iterator-0.1.0-Linux/share/cmake

To remove path-config use remove command (you need to pass left-hand name returned by list command):

$ ./cmake-registry remove BitIterator/4c74e74620b1ba554d7d65776b243518
Removed path-config for project BitIterator/4c74e74620b1ba554d7d65776b243518

The cache packages should be uninstalled:

$ ./cmake-registry uninstall BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee
Uninstalled BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee
Removed path-config for project BitIterator/542d8ff09ae330ea4baaa87b2f1ba4ee

Make path-config for an existing package

Some helpful packages does not have their own FindPackage.cmake in cmake repository. Let me show how to add them into the registry. For example, Catch package. I need only CatchConfig.cmake file in my cache and path-config. The command create takes 2 arguments: the name of the packet and location of CatchConfig.cmake. The last one is optional. If it is omitted the stdin will be read for content of CatchConfig.cmake.

$ echo "find_path(CATCH_INCLUDE_DIRS NAMES catch/catch.hpp)" | ./cmake-registry create Catch
Created path-config for project : /home/igor/.cmake/packages/Catch/9e4a4c3341da669737a34c39e688f51d
$ cat /home/igor/.cmake/packages/Catch/9e4a4c3341da669737a34c39e688f51d
/home/igor/.cmake/cache/Catch
$ cat /home/igor/.cmake/cache/Catch/CatchConfig.cmake
find_path(CATCH_INCLUDE_DIRS NAMES catch/catch.hpp)

To have such CatchConfig.cmake you should have the path of installed Catch in your CMAKE_PREFIX_PATH variable.

Diagnostic

If I manually remove my Catch folder from the cache registry, the list command will show the absence of the path:

$ rm -r /home/igor/.cmake/cache/Catch
$ ./cmake-registry list
BitIterator/15cca7d08a511bac1a4af9dd66cfb44f: /home/igor/bit_iterator/build/_CPack_Packages/Linux/TGZ/bit_iterator-0.1.0-Linux/share/cmake
Catch/9e4a4c3341da669737a34c39e688f51d: /home/igor/.cmake/cache/Catch (The given path does not exists!)

Now, the message (The given path does not exists!) shows that something wrong with Catch package.