Часть программы нашей исследовательской группы имеет дополнительные функции, предоставляемые библиотекой ctemplate. На нашем устаревшем кластере мы не можем собрать программное обеспечение из-за компиляции, поэтому я хотел бы отделить эту функциональность и контролировать, включена она или нет с помощью флага configure
, такого как --disable-ctemplate
.
Программное обеспечение, написанное на C++, использует систему сборки Autotools, с которой у меня нет большого опыта. Насколько я понимаю, для выполнения этой задачи мне нужно сделать следующее:
Добавьте новый флаг в сценарий настройки, создав новую запись
AC_ARG_ENABLE
вconfigure.ac
.Добавьте несколько операторов
#ifdef
(или, возможно,#ifndef
) вокруг кода, использующего библиотекуctemplate
, и вокруг любого кода, вызывающего этот код.
Я думаю, что первый шаг будет выглядеть примерно так:
AC_ARG_ENABLE(ctemplate,
[ --disable-ctemplate Disable HTML output],
[case "${enableval}" in
yes) ctemplate=false ;;
no) ctemplate=true ;;
*) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
esac],[ctemplate=true])
AM_CONDITIONAL(NOCTEMPLATE, test x$ctemplate = xfalse)
хотя я не знаю, верна ли логика, так как я адаптировал этот пример из примеров, в которых использовалось --enable-FLAG
вместо --disable-FLAG
.
На втором этапе я оберну разделы флагами препроцессора, такими как
#ifndef NOCTEMPLATE
void Class::MethodUsingCtemplate(...)
{
...
}
#endif
Будет ли это правильно «подключать» все, если я сделаю configure --disable-ctemplate
?
Кроме того, будет ли это гарантировать, что программа не попадет в библиотеку ctemplate
для компиляции? Если нет, то все это зря; крайне важно, чтобы я мог предотвратить компиляцию библиотеки ctemplate
и зависимых компонентов.
Повторюсь, я не знаком ни с C++, ни с Autotools; Я применил очень наивный первый подход к решению этой проблемы. Если у вас есть опыт в этой области, я был бы очень признателен за ваши исправления и любые объяснения, которые вы могли бы предложить.