Русское сообщество по скриптингу

Скрипт для пакетной компиляции AmxModX всесте с модулями.

Статьи или фрагменты кода для новичков и уже опытных скриптеров по Metamod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по Metamod.

Скрипт для пакетной компиляции AmxModX всесте с модулями.

Сообщение Chuvi » 03 янв 2013, 23:05

Для начала: Почему именно в этот раздел?
На мой взгляд данная "затея" больше относится к компиляции плагинов для метамода, нежели чем к Amxmod-у, и уж, тем более, к болтовне это, имхо, не относится.

Возникла необходимость скомпилировать AmxModX и прилагающиеся к нему модули на своём компьютере.
Править каждый Makefile руками было лень, а потом ещё и копировать скомпилированные файлы.. мде.. в итоге получился такой-вот скриптик.
Он сам скачивает свежие исходники из Mercurial-а hg.alliedmods.net, немного изменяет Makefile, компилирует их и складывает в одну директорию.

Да, если не забуду, то надо будет добавить замену строки CPP = gcc-4.1 в Makefile на строку, выбранную пользователем. Я, пока что, эту проблему решил созданием символических ссылок.

[spoiler]
Код: Выделить всё
  1. #!/bin/bash

  2. #Скрипт предназначен для автоматической загрузки и компиляции модулей AmxModX.

  3. #Автор этого нубо-скрипта Chuvi.

  4. #Автор предполагает, что у вас уже есть то, что нужно для компиляции.

  5. #А именно:G++, Metamod SDK, HL SDK;

  6. #


  7. #При этом Вы _должны_ переименовать полученную директорию в hldsk и поместить её в ту же директорию, где лежит этот скрипт,

  8. #а в директории hlsdk переместить содержимое директории multiplayer в корень директории hldsk. (Туфталогия, ну и ладно)

  9. #


  10. #Вы так-же должны переименовать полученную директорию в metamod и поместить её в ту же директорию, где лежит этот скрипт.

  11.  

  12.  

  13. #Определяем место, откуда запущен скрипт.

  14. ABSOLUTE_FILENAME=`readlink -e "$0"`

  15. path=`dirname "$ABSOLUTE_FILENAME"`

  16. cd $path

  17. #Определили и перешли в директорию с этим скриптом.

  18.  

  19. compiled_dir=$path/amxmodx-compiled #создали переменную для пути по которому будут храниться скомпилированные файлы

  20. log_dir=$compiled_dir/log                       #Здесь будут храниться логи успешно скомпилированных файлов.

  21. error_log_dir=$log_dir/errors           #Здесь будут храниться логи не скомпилированных файлов.

  22. AmxX_dir=$path/amxmodx-central          #Здесь будут находиться исходники.

  23.  

  24.  

  25. #Обновляем исходники AmxModX-а

  26. rm -rf $AmxX_dir #Удалили старые исходники (TODO: осилить обновление исходников без их полного удаления)

  27. mkdir $AmxX_dir  #Cоздали директорию для загрузки новых

  28. hg clone http://hg.alliedmods.net/amxmodx-central/ $AmxX_dir #Загрузили

  29. chmod 777 -R $AmxX_dir  #Жесть какая-то. Не помню зачем я это делал.

  30. rm -rf $AmxX_dir.hg     #С этой папкой дальнейший алгоритм будет тупить. Поэтому удаляем. А может и не будет, я, походу, его по-другому сделал. Помню что она сильно мешала.

  31. #Закончили обновлять исходники

  32.  

  33.  

  34. rm -rf $compiled_dir #Отчистили результаты предыдущих компиляций.

  35. mkdir $compiled_dir  #Создали директорию, которую только что снесли заново. Только уже пустую.

  36. mkdir $log_dir       #Создали директорию для логов успешно скомпилированных файлов.

  37. mkdir $error_log_dir #Создали директорию для логов не скомпилированных файлов.

  38. cd $AmxX_dir             #Перешли в директорию с исходниками AmxModX

  39.  

  40.  

  41. while true; #Работает и ладно. Бесконечный цикл, который мы потом прервём.

  42. do

  43.         make_file=`grep -rl Werror . |head -n1` #Собственно, прикол в чём. В каждом Makefile у исходников AmxModX стоит параметр -Werror. Из-за этого параметра все предупреждения интерпретируются как ошибки и ничего в итоге не компилируется, ибо предупреждений очень много. Поэтому, во-первых, мы убираем этот параметр из Makefile, а во-вторых, собственно, по наличию этого параметра и определяем, что это нужный нам файл. И да, я знаю, что это дикий костыль.

  44.         if [ $make_file ]                                               #Если хоть один файл, описанный выше, существует, то..

  45.                 then                             

  46.                         make_file=`readlink -e "$make_file"     `                                       #Определяем полный путь к этому файлу.

  47.                         source_path=`dirname "$make_file"`                                              #Определяем полный путь к директории с этим файлом.

  48.                         library_name=`basename "$source_path"`                                  #Считаем что имя директории соответствует названию модуля.

  49.                         sed -e 's/-Werror//g' $make_file > $make_file.new               #Убираем параметр -Werror. (Через perl пробовал. Файл убирается целиком)

  50.                         rm $make_file                                                                                   #Удаляем оригиральный Makefile

  51.                         mv $make_file.new  $make_file                                                   #Заменяем его Makefile-ом без -Werror. Да, пробовал я таким образом делать: sed -e 's/-Werror//g' $make_file > $make_file. Пустой файл на выходе имеем.

  52.                         cd $source_path                                                                                 #Переходим в директорию с исходниками модуля.

  53.                         echo Making $library_name                                                               #Это, думаю, комментить не надо.

  54.                         make -f $make_file >> $log_dir/$library_name.log 2>&1   #Компилируем и перенаправляем весь вывод в лог. Без 2>&1 вывод ошибок будет сыпаться в терминал.

  55.                         if [ -d $source_path/Release/ ];                                                #Проверяем наличие директории Release

  56.                                 then                                                                                                    #Если таковая есть.

  57.                                         cd $source_path/Release/                                                                #Переходим в неё

  58.                                         if ls -d *.so >/dev/null 2>&1;                                                  #Проверяем наличие в этой директории свеженькой so-шки.

  59.                                                 then

  60.                                                         mv $source_path/Release/*.so $compiled_dir/                     #Если сошка есть, перемещаем её в директорию со скомпилированными сошками.

  61.                                                         echo Done

  62.                                                 else

  63.                                                         mv $log_dir/$library_name.log $error_log_dir/$library_name.error.log #Если сошки нет, перемещаем лог в директорию, где хранятся логи с ошибками.

  64.                                                         echo !!!ERROR!!! See $error_log_dir/$library_name.error.log for more information.

  65.                                         fi                                                                                                                      #Проверять наличие сошки закончили.

  66.                                                 rm -rf $source_path/Release                             #Удаляем директорию, полученную в процессе компиляции, ибо нам от неё больше ничего не нужно.

  67.                                 else

  68.                                         #echo $source_path/Release/ не существует

  69.                                         mv $log_dir/$library_name.log $error_log_dir/$library_name.error.log #Если директории Release вообще не существует, то тоже перемещаем лог в директорию, где хранятся логи с ошибками.

  70.                                         echo !!!ERROR!!! See $error_log_dir/$library_name.error.log for more information.

  71.                         fi #Закончили проверку наличия директории Release

  72.                         echo #Пустая строка, для визуального разделения компилируемых библиотек.

  73.                         cd $AmxX_dir #Возвращаемся в директорию с исходниками AmxModX.

  74.                 else

  75.                   break; #Если файлов, содержащих -Werror не осталось, останавливаем цикл.

  76.                 fi

  77. done #Готово. amxmodx-cental можно снести. Второй раз по ней этот скрипт пройти не сможет.

  78.  

  79.  
[/spoiler]

PS: Если честно, выкладываю чтобы не потерять. Ибо подобные вещи на моём компьютере имеют привычку куда-то пропадать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

"Незнание английского языка - это ваша проблема."

Плагинами на заказ не занимаюсь. Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 560 раз.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1