-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcmake-registry.in
executable file
·138 lines (123 loc) · 4.85 KB
/
cmake-registry.in
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env bash
set -e
: ${CMAKE_REGISTRY_PATH:=$HOME/.cmake}
: ${DEFAULT_CMAKE_CONFIG_LOCATION:=share/cmake}
CMAKE_REGISTRY_PACKAGES_PATH=$CMAKE_REGISTRY_PATH/packages
CMAKE_REGISTRY_CACHE_PATH=$CMAKE_REGISTRY_PATH/cache
VERSION="@PROJECT_VERSION@"
declare -A COMMANDS
function usage
{
declare -A NAMES
if [[ -z "$1" ]]; then
echo "Usage: $0 COMMAND [ARGUMENTS]"
echo "CMake local registry manager. Version: $VERSION"; echo
echo "Available commands:"
for i in ${!COMMANDS[@]}; do
NAMES+=([${i##*,}]=1)
done
else
NAMES=([$1]=1)
if [[ -z "${COMMANDS[name,$1]}" ]]; then
echo "ERROR: no such topic!"
return 1
fi
fi
for i in ${!NAMES[@]}; do
echo " ${COMMANDS[name,$i]}"\;${COMMANDS[args,$i]}\;- ${COMMANDS[desc,$i]}
done | column -t -s ';' -c 80
}
function list_packages
{
find ${CMAKE_REGISTRY_PACKAGES_PATH} -maxdepth 2 -type f | while read f; do
OUTPUT=$(head -n 1 "$f")
MESSAGE="$(basename $(dirname "$f"))/$(basename "$f"): $OUTPUT"
if [[ -d $OUTPUT ]]; then
echo $MESSAGE
else
if echo $OUTPUT | grep -q "^\s*/\w\+"; then
echo $MESSAGE '(The given path does not exists!)'
fi
fi
done
}
function make_config
{
if [[ ! -f "$1" ]]; then
echo "ERROR: config $1 does not exists!"
else
shopt -s extglob
CONFIG_NAME=$(basename ${1%@(-config|Config).cmake})
ABSOLUTE_PATH=$(realpath $1)
HASH_FILE=$CMAKE_REGISTRY_PACKAGES_PATH/$CONFIG_NAME/$(echo $ABSOLUTE_PATH | md5sum | cut -f 1 -d' ')
mkdir -p $(dirname $HASH_FILE)
dirname $ABSOLUTE_PATH > $HASH_FILE
echo Created path-config for project $CONFIG_PATH: $HASH_FILE
fi
}
function remove_config
{
DELETING_PATH="$CMAKE_REGISTRY_PACKAGES_PATH/$1"
if [[ ! -f "$DELETING_PATH" ]] || echo $DELETING_PATH | grep -q -v "^$CMAKE_REGISTRY_PACKAGES_PATH"; then
echo "ERROR: project $1 (path $DELETING_PATH) does not exists!"
else
rm $DELETING_PATH && echo Removed path-config for project $1
fi
}
function create_config
{
CONFIG_FILE="$CMAKE_REGISTRY_CACHE_PATH/$1/${1}Config.cmake"
mkdir -p $(dirname "$CONFIG_FILE")
if [[ -f $2 ]]; then
cp $2 "$CONFIG_FILE"
else
cat > "$CONFIG_FILE"
fi
make_config "$CONFIG_FILE"
}
function install_package
{
PROJECT_CONFIG=$(tar tf $1 | grep "$DEFAULT_CMAKE_CONFIG_LOCATION/[_[:alnum:]-]\+[Cc]onfig\.cmake" | head -n 1)
if [[ $? -ne 0 ]]; then
echo "ERROR: <project>Config.cmake has not been found in $1 archive!"
else
mkdir -p "$CMAKE_REGISTRY_CACHE_PATH"
echo Installing $1 into $CMAKE_REGISTRY_CACHE_PATH
tar xf $1 -C "$CMAKE_REGISTRY_CACHE_PATH" && make_config "$CMAKE_REGISTRY_CACHE_PATH/$PROJECT_CONFIG"
fi
}
function uninstall_package
{
PROJECT_PATH=$(cat $CMAKE_REGISTRY_PACKAGES_PATH/$1 | sed 's;\('$CMAKE_REGISTRY_CACHE_PATH'/[^/]\+\)/.*;\1;')
if [[ ! -d $PROJECT_PATH ]] || echo $PROJECT_PATH | grep -q -v "^$CMAKE_REGISTRY_CACHE_PATH"; then
echo "ERROR: project $1 does not exists in cache!"
else
rm -r $PROJECT_PATH && echo Uninstalled $1 && remove_config $1
fi
}
COMMANDS=(\
[name,help]=help [func,help]=usage [args,help]="[<topic>]" [desc,help]="print this help or show help for <topic>" \
[name,list]=list [desc,list]="list path-configs" \
[name,make]=make [args,make]="<config>" [desc,make]="make path-config in registry for project which is described by \
<config>. <config> should take the form <name>Config.cmake or <name>-config.cmake" \
[name,create]=create [args,create]="<name> [<file>]" [desc,create]="create path-config in registry for project <name> \
with <name>Config.cmake from stdin or <file>" \
[name,remove]=remove [args,remove]="<name>" [desc,remove]="remove path-config <name> from registry" \
[name,install]=install [args,install]="<tgz>" [desc,install]="unpack and install <tgz> into registry and make \
path-config. <tgz> should contain <name>Config.cmake or <name>-config.cmake configuration file. Supported archives: tar.*" \
[name,uninstall]=uninstall [args,uninstall]="<name>" [desc,uninstall]="uninstall <name> project and remove it\`s \
path-config" \
[name,version]=version [desc,version]="print version of the program" \
)
# MAIN PART
case $1 in
${COMMANDS[name,make]}) make_config "$2";;
${COMMANDS[name,create]}) create_config $2 $3;;
${COMMANDS[name,remove]}) remove_config $2;;
${COMMANDS[name,list]}) list_packages;;
${COMMANDS[name,install]}) install_package $2;;
${COMMANDS[name,uninstall]}) uninstall_package $2;;
${COMMANDS[name,help]}) ${COMMANDS[func,help]} $2;;
${COMMANDS[name,version]}) echo $VERSION;;
*) echo Unknown command [$1]. Try help; exit 1;;
esac