-
Notifications
You must be signed in to change notification settings - Fork 4
/
build_static_lib.sh
159 lines (131 loc) · 5.03 KB
/
build_static_lib.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
152
153
154
155
156
157
158
159
#!/usr/bin/env bash
# Получаем корневую дирректорию
readonly ROOT=$(cd "$(dirname "$0")" && pwd)
# Каталог статических библиотек
readonly THIRD_PARTY="$ROOT/third_party/lib"
# Получаем версию OS
OS=$(uname -a | awk '{print $1}')
if [[ $OS =~ "MINGW64" ]]; then
OS="Windows"
fi
# Адрес собранной библиотеки
LIB=$1
# Если библиотека не собрана
if [ ! -f "$LIB" ]; then
echo "Library was not build"
exit 1
fi
# Расширение файла объекта
OBJECT_NAME="o"
# Если операционной системой является Windows
if [ $OS = "Windows" ]; then
# Расширение файла объекта
OBJECT_NAME="obj"
fi
# Получаем название файла
readonly FILENAME=$(basename ${LIB})
# Если такая библиотека уже есть в сборке
if [ -f "$THIRD_PARTY/$FILENAME" ]; then
# Выполняем удаление старой версии библиотеки
rm "$THIRD_PARTY/$FILENAME"
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 $1 $MODULES || exit 1
# Выполняем сброс количества элементов
COUNT=0
# Выполняем очистку списка модулей
MODULES=""
fi
done
# Если список уже сформирован
if [ -n "$MODULES" ]; then
# Выполняем сборку новой статической библиотеки
ar -crv $1 $MODULES || exit 1
fi
# Выполняем удаление всех обработанных модулей
rm -r *.$OBJECT_NAME || exit 1
# Выполняем запуск библиотеки
ranlib "$1"
# Если операционной системой является Unix-подобная ОС
if [ ! $OS = "Windows" ]; then
# Удаляем файл разметки
rm -f "__.SYMDEF"
rm -f "__.SYMDEF SORTED"
fi
}
##
# Функция извлечения модулей из библиотеки
#
extract(){
# Индекс текущей библиотеки
INDEX=0
# Выводим сообщение
echo "Extract \"$1\""
# Выполняем формирование последовательности списка модулей
for i in $(ar -t $1 | grep ".*\.$2$");
do
# Выводим название модуля
echo "Module: $i in $1"
# Выполняем извлечение модуля из архива
ar -xv $1 "$i"
# Выполняем удаление модуля в архиве
ar -dv $1 "$i"
# Выполняем переименование модуля
mv "${i%.*}.$2" "${i%.*}_$INDEX.$OBJECT_NAME"
# Выполняем увеличение индекса
INDEX=$((INDEX+1))
done
# Удалем архив статической библиотеки
rm "$1" || exit 1
}
# Выполняем копирование библиотеки
cp "$LIB" "$THIRD_PARTY/$FILENAME" || exit 1
# Переходим в каталог с библиотеками
cd "$THIRD_PARTY"
# Если операционной системой является Windows
if [ $OS = "Windows" ]; then
# Извлекаем все модули из библиотеки
extract $FILENAME "obj"
# Выполняем копирование библиотеки зависимостей
cp libdependence.lib libdependence.tmp.lib
# Извлекаем все модули из библиотеки
extract libdependence.tmp.lib "obj"
# Если операционной системой является Unix-подобная ОС
else
# Извлекаем все модули из библиотеки
extract $FILENAME "o"
# Выполняем копирование библиотеки зависимостей
cp libdependence.a libdependence.tmp.a
# Извлекаем все модули из библиотеки
extract libdependence.tmp.a "o"
fi
# Выполняем сборку библиотеки
intract $FILENAME
# Удаляем исходную библиотеку
rm $LIB
# Копируем полученную библиотеку
mv "$THIRD_PARTY/$FILENAME" $LIB