Как использовать разные параметры сборки для двух программ в одном проекте autotools - PullRequest
0 голосов
/ 04 октября 2018

У меня есть простой проект автоинструментов с двумя программами: one и two.

От библиотеки зависит только одна программа (math в этом примере), и мне бы хотелось, чтобыдругая программа не должна быть связана с этой библиотекой.

Вот мои файлы:

configure.ac

AC_INIT([test], [0.1], [somebody@example.com])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC
AC_CHECK_LIB([m], [log])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT    

Makefile.am

bin_PROGRAMS = one two
one_SOURCES = one.c
two_SOURCES = two.c

one.c (заголовки удалены)

int main(void)
{
    /* do depend on lib math*/
    printf("log[15] = %f\n", log(15));
    return 0;
}

two.c (заголовки удалены)

int main(void)
{
    /* do NOT depend on lib math*/
    printf("15 = %d\n", 15);
    return 0;
}

Когда я собираю это

autoreconf --install
./configure
make

Программы хорошо сложены:

# compilation 
gcc .... -c -o one.o one.c
# link
gcc .... -o one one.o -lm
# compilation 
gcc .... -c -o two.o two.c
# link THE PROBLEM IS HERE, I don't want `-lm` to be added here
gcc .... -o two two.o -lm     

1 Ответ

0 голосов
/ 06 октября 2018

Только одна программа зависит от библиотеки (в данном примере математика), и я бы хотел, чтобы другая программа не была связана с этой библиотекой.

Требуется некотороезаботиться о создании программ с разными параметрами в одном проекте Autotools.Обычный подход заключается в создании отдельных выходных переменных для тех битов, которые не являются общими для всех проектов, и использования их в вашем Makefile.am для определения соответствующих переменных сборки для каждой цели.

В вашем примере этоПараметры ссылок, указывающие математическую библиотеку, которые являются специфичными для цели, поэтому вам нужно захватить их в своей собственной переменной.Макросы AC_CHECK_LIB и AC_SEARCH_LIBS оба предшествуют соответствующему параметру ссылки на библиотеку перед выходной переменной LIBS, которая является одним из источников, из которых Automake извлекает параметры глобальных ссылок, поэтому, если вы используете их, вам также нужно что-то сделатьчтобы опция математической библиотеки не оставалась в LIBS.В качестве альтернативы, вы могли бы разработать какой-то другой механизм для проверки параметров математической библиотеки.

Один хороший прием - сохранить значение LIBS перед запуском AC_CHECK_LIB, извлечь параметры математической библиотеки, если они есть, после, а затем восстановите исходное значение LIBS.Это довольно распространенная идиома Autoconf.Например,

LIBS_save=$LIBS

AC_CHECK_LIB([m], [log])

LIBM_LDFLAGS=${LIBS%${LIBS_save}}
AC_SUBST([LIBM_LDFLAGS])

LIBS=$LIBS_save

Ваш Makefile.am может выглядеть так:

bin_PROGRAMS = one two

one_SOURCES = one.c
one_LDADD = $(LIBM_LDFLAGS)

two_SOURCES = two.c
...