четверг, 24 ноября 2011 г.

C++ библиотека-плагин для Unix. Часть 3-я. Наводим порядок с Makefile.

Ни для кого не секрет, что make - самая распространенная система сборки и особенно для unix.
Но make требует особого ухода за Makefile либо каких-то иных, сторонних утилит для его обслуживания. В GNU мире широкое распространение получил autoconf и наверное по праву. У него много достоинств для охвата широкого спектра конфигураций на разных инсталляциях.
В моем же случае autoconf слишком "жирен" и для сборки на моих одних и тех - же машинах повторяет все шаги, тестирует и.т.д.

Для себя же, уже давно выбрал Makefile Project Creator (MPC). Я использую MPC из библиотеки ADAPTIVE Communication Environment (ACE) тем более, что я и саму библиотеку часто использую и в поставке имеются дополнения и улучшения. Также MPC умеет создавать файлы проектов для Visual Studio и других распространенных сред.
Итак, что нам нужно для сборки на разных платформах?
  1. Библиотека ACE. Даже если вам данная библиотека не нужна, MPC в ее поставке отлажен и требует наименьших усилий по доработке. 
  2. Распаковываем ее, ставим переменную окружения ACE_ROOT, указывающую на каталог  ACE_wrappers.
  3. На каждой платформе в каталоге ACE_wrappers/makeinclude/include создаем файл platform_macros.GNU . Включаем туда одну строчку, например для linux:
    include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU
  4. Создаем для нашего проекта mpc файл:
    project (ourproject)  {
      sharedname   = ourlibname
      Source_Files {
         main.cpp
         util.cpp
      }
    }
  5. Получаем наши проектные Makefile - запускаем в каталоге проекта:
    perl ${ACE_ROOT}/bin/mwc.pl   -type gnuace
  6. Запускаем make для сборки.
  7. Добавляем в наш mpc файл другие опции (смотрим в документации в составе ACE).
 Кстати, с помощью MPC очень легко переносить приложения с одной платформы на другую, но об этом в другой раз.

2 комментария:

  1. Интересно, а заголовочные файлы добавлять в MPC-файл не нужно?

    ОтветитьУдалить
  2. Файлы заголовков также можно добавлять:
    Header_Files {
    file1.h
    file2.h
    }

    ОтветитьУдалить