-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmerge_static_libs.sh
executable file
·151 lines (126 loc) · 4.66 KB
/
merge_static_libs.sh
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
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/env bash
# Получаем корневую дирректорию
readonly ROOT=$(cd "$(dirname "$0")" && pwd)
# Название библиотеки
readonly LIBNAME="dependence"
# Каталог статических библиотек
THIRD_PARTY="$ROOT/third_party/lib"
# Если на вход получен каталог с библиотеками
if [[ -d $1 ]]; then
# Каталог статических библиотек
THIRD_PARTY="$1"
fi
# Получаем версию OS
OS=$(uname -a | awk '{print $1}')
if [[ $OS =~ "MINGW64" ]]; then
OS="Windows"
fi
# Расширение файла объекта
OBJECT_NAME="o"
# Если операционной системой является Windows
if [ $OS = "Windows" ]; then
# Расширение файла объекта
OBJECT_NAME="obj"
fi
##
# Функция упаковка модулей в библиотеку
#
intract(){
# Количество собранных модулей
COUNT=0
# Список собранных модулей
MODULES=""
# Производим пересборку всех зависимых библиотек
for i in $(ls . | grep ".*\.${OBJECT_NAME}$");
do
# Если список уже сформирован
if [ -n "$MODULES" ]; then
# Добавляем название модуля
MODULES="$MODULES $i"
# Если список модулей ещё не сформирован
else
# Формируем список модулей
MODULES="$i"
fi
# Выполняем увеличение количества обработанных модулей
COUNT=$((COUNT+1))
# Если мы достигли 100 элементов
if [ $COUNT -ge 100 ]; then
# Выполняем сборку новой статической библиотеки
ar -crv lib$1.a $MODULES || exit 1
# Выполняем сброс количества элементов
COUNT=0
# Выполняем очистку списка модулей
MODULES=""
fi
done
# Если список уже сформирован
if [ -n "$MODULES" ]; then
# Выполняем сборку новой статической библиотеки
ar -crv lib$1.a $MODULES || exit 1
fi
# Выполняем удаление всех обработанных модулей
rm -r *.$OBJECT_NAME || exit 1
# Выполняем запуск библиотеки
ranlib "lib$1.a"
# Если операционной системой является Unix-подобная ОС
if [ ! $OS = "Windows" ]; then
# Удаляем файл разметки
rm -f "__.SYMDEF"
rm -f "__.SYMDEF SORTED"
fi
}
##
# Функция извлечения модулей из библиотеки
#
extract(){
# Производим пересборку всех зависимых библиотек
for i in $(ls . | grep ".*\.$1$");
do
# Индекс текущей библиотеки
INDEX=0
# Выводим сообщение
echo "Extract \"$i\""
# Получаем список модулей
MODULES=$(ar -t $i | grep ".*\.$2$")
# Выполняем формирование последовательности списка модулей
for j in $MODULES;
do
# Выводим название модуля
echo "Module: $j in $i"
# Выполняем извлечение модуля из архива
ar -xv $i "$j"
# Выполняем удаление модуля в архиве
ar -dv $i "$j"
# Выполняем переименование модуля
mv "${j%.*}.$2" "${j%.*}_$INDEX.$OBJECT_NAME"
# Выполняем увеличение индекса
INDEX=$((INDEX+1))
done
# Если список модулей получен
if [ -n "$MODULES" ]; then
# Удалем архив статической библиотеки
rm "$i" || exit 1
fi
done
}
# Выполняем переход в каталог статических библиотек
cd $THIRD_PARTY
# Если операционной системой является Windows
if [ $OS = "Windows" ]; then
# Извлекаем все модули из библиотеки
extract "a" "o"
extract "a" "obj"
# Если операционной системой является Unix-подобная ОС
else
# Извлекаем все модули из библиотеки
extract "a" "o"
fi
# Выполняем сборку библиотеки
intract $LIBNAME
# Переходим обратно
cd "$ROOT" || exit 1
printf "\n****************************************"
printf "\n************ Success merge static libs!!! ************"
printf "\n****************************************"
printf "\n\n\n"