На мой взгляд данная "затея" больше относится к компиляции плагинов для метамода, нежели чем к Amxmod-у, и уж, тем более, к болтовне это, имхо, не относится.
Возникла необходимость скомпилировать AmxModX и прилагающиеся к нему модули на своём компьютере.
Править каждый Makefile руками было лень, а потом ещё и копировать скомпилированные файлы.. мде.. в итоге получился такой-вот скриптик.
Он сам скачивает свежие исходники из Mercurial-а hg.alliedmods.net, немного изменяет Makefile, компилирует их и складывает в одну директорию.
Да, если не забуду, то надо будет добавить замену строки CPP = gcc-4.1 в Makefile на строку, выбранную пользователем. Я, пока что, эту проблему решил созданием символических ссылок.
[spoiler]
- Код: Выделить всё
- #!/bin/bash
- #Скрипт предназначен для автоматической загрузки и компиляции модулей AmxModX.
- #Автор этого нубо-скрипта Chuvi.
- #Автор предполагает, что у вас уже есть то, что нужно для компиляции.
- #А именно:G++, Metamod SDK, HL SDK;
- #
- #HL SDK можно скачать тут: Вы должны зарегистрироваться, чтобы видеть ссылки. ... -p3.tar.gz.
- #При этом Вы _должны_ переименовать полученную директорию в hldsk и поместить её в ту же директорию, где лежит этот скрипт,
- #а в директории hlsdk переместить содержимое директории multiplayer в корень директории hldsk. (Туфталогия, ну и ладно)
- #
- #Исходники метамода можно скачать тут: Вы должны зарегистрироваться, чтобы видеть ссылки. ... z?download ( Вы должны зарегистрироваться, чтобы видеть ссылки. )
- #Вы так-же должны переименовать полученную директорию в metamod и поместить её в ту же директорию, где лежит этот скрипт.
- #Определяем место, откуда запущен скрипт.
- ABSOLUTE_FILENAME=`readlink -e "$0"`
- path=`dirname "$ABSOLUTE_FILENAME"`
- cd $path
- #Определили и перешли в директорию с этим скриптом.
- compiled_dir=$path/amxmodx-compiled #создали переменную для пути по которому будут храниться скомпилированные файлы
- log_dir=$compiled_dir/log #Здесь будут храниться логи успешно скомпилированных файлов.
- error_log_dir=$log_dir/errors #Здесь будут храниться логи не скомпилированных файлов.
- AmxX_dir=$path/amxmodx-central #Здесь будут находиться исходники.
- #Обновляем исходники AmxModX-а
- rm -rf $AmxX_dir #Удалили старые исходники (TODO: осилить обновление исходников без их полного удаления)
- mkdir $AmxX_dir #Cоздали директорию для загрузки новых
- hg clone http://hg.alliedmods.net/amxmodx-central/ $AmxX_dir #Загрузили
- chmod 777 -R $AmxX_dir #Жесть какая-то. Не помню зачем я это делал.
- rm -rf $AmxX_dir.hg #С этой папкой дальнейший алгоритм будет тупить. Поэтому удаляем. А может и не будет, я, походу, его по-другому сделал. Помню что она сильно мешала.
- #Закончили обновлять исходники
- rm -rf $compiled_dir #Отчистили результаты предыдущих компиляций.
- mkdir $compiled_dir #Создали директорию, которую только что снесли заново. Только уже пустую.
- mkdir $log_dir #Создали директорию для логов успешно скомпилированных файлов.
- mkdir $error_log_dir #Создали директорию для логов не скомпилированных файлов.
- cd $AmxX_dir #Перешли в директорию с исходниками AmxModX
- while true; #Работает и ладно. Бесконечный цикл, который мы потом прервём.
- do
- make_file=`grep -rl Werror . |head -n1` #Собственно, прикол в чём. В каждом Makefile у исходников AmxModX стоит параметр -Werror. Из-за этого параметра все предупреждения интерпретируются как ошибки и ничего в итоге не компилируется, ибо предупреждений очень много. Поэтому, во-первых, мы убираем этот параметр из Makefile, а во-вторых, собственно, по наличию этого параметра и определяем, что это нужный нам файл. И да, я знаю, что это дикий костыль.
- if [ $make_file ] #Если хоть один файл, описанный выше, существует, то..
- then
- make_file=`readlink -e "$make_file" ` #Определяем полный путь к этому файлу.
- source_path=`dirname "$make_file"` #Определяем полный путь к директории с этим файлом.
- library_name=`basename "$source_path"` #Считаем что имя директории соответствует названию модуля.
- sed -e 's/-Werror//g' $make_file > $make_file.new #Убираем параметр -Werror. (Через perl пробовал. Файл убирается целиком)
- rm $make_file #Удаляем оригиральный Makefile
- mv $make_file.new $make_file #Заменяем его Makefile-ом без -Werror. Да, пробовал я таким образом делать: sed -e 's/-Werror//g' $make_file > $make_file. Пустой файл на выходе имеем.
- cd $source_path #Переходим в директорию с исходниками модуля.
- echo Making $library_name #Это, думаю, комментить не надо.
- make -f $make_file >> $log_dir/$library_name.log 2>&1 #Компилируем и перенаправляем весь вывод в лог. Без 2>&1 вывод ошибок будет сыпаться в терминал.
- if [ -d $source_path/Release/ ]; #Проверяем наличие директории Release
- then #Если таковая есть.
- cd $source_path/Release/ #Переходим в неё
- if ls -d *.so >/dev/null 2>&1; #Проверяем наличие в этой директории свеженькой so-шки.
- then
- mv $source_path/Release/*.so $compiled_dir/ #Если сошка есть, перемещаем её в директорию со скомпилированными сошками.
- echo Done
- else
- mv $log_dir/$library_name.log $error_log_dir/$library_name.error.log #Если сошки нет, перемещаем лог в директорию, где хранятся логи с ошибками.
- echo !!!ERROR!!! See $error_log_dir/$library_name.error.log for more information.
- fi #Проверять наличие сошки закончили.
- rm -rf $source_path/Release #Удаляем директорию, полученную в процессе компиляции, ибо нам от неё больше ничего не нужно.
- else
- #echo $source_path/Release/ не существует
- mv $log_dir/$library_name.log $error_log_dir/$library_name.error.log #Если директории Release вообще не существует, то тоже перемещаем лог в директорию, где хранятся логи с ошибками.
- echo !!!ERROR!!! See $error_log_dir/$library_name.error.log for more information.
- fi #Закончили проверку наличия директории Release
- echo #Пустая строка, для визуального разделения компилируемых библиотек.
- cd $AmxX_dir #Возвращаемся в директорию с исходниками AmxModX.
- else
- break; #Если файлов, содержащих -Werror не осталось, останавливаем цикл.
- fi
- done #Готово. amxmodx-cental можно снести. Второй раз по ней этот скрипт пройти не сможет.
PS: Если честно, выкладываю чтобы не потерять. Ибо подобные вещи на моём компьютере имеют привычку куда-то пропадать.