如何为同一 autotools 项目中的两个程序设置不同的构建选项
How to have different build options for two programs in the same autotools project
我有一个带有两个程序的简单 autotools 项目: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(删除headers)
int main(void)
{
/* do depend on lib math*/
printf("log[15] = %f\n", log(15));
return 0;
}
two.c(删除了headers)
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
Only one of the program depends on a library (math in this example),
and I would like that the other program not to be linked with this
library.
在同一个 Autotools 项目中构建具有不同选项的程序需要一些注意。通常的方法是为那些并非所有项目都通用的位创建单独的输出变量,并在 Makefile.am
中使用它们来定义适当的每个目标构建变量。
在您的示例中,指定数学库的 link 选项是特定于目标的,因此您需要将它们捕获到它们自己的变量中。 AC_CHECK_LIB
和 AC_SEARCH_LIBS
宏都将适当的库 link 选项添加到 LIBS
输出变量,这是 Automake 绘制全局 link 的来源之一选项,所以如果你使用这些,你还需要做一些事情来避免数学库选项保留在 LIBS
中。或者,您可以设计一些其他机制来测试数学库选项。
一个好的技巧是在运行 AC_CHECK_LIB
之前保存LIBS
的值,然后提取数学库选项(如果有的话),然后恢复原始值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
我有一个带有两个程序的简单 autotools 项目: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(删除headers)
int main(void)
{
/* do depend on lib math*/
printf("log[15] = %f\n", log(15));
return 0;
}
two.c(删除了headers)
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
Only one of the program depends on a library (math in this example), and I would like that the other program not to be linked with this library.
在同一个 Autotools 项目中构建具有不同选项的程序需要一些注意。通常的方法是为那些并非所有项目都通用的位创建单独的输出变量,并在 Makefile.am
中使用它们来定义适当的每个目标构建变量。
在您的示例中,指定数学库的 link 选项是特定于目标的,因此您需要将它们捕获到它们自己的变量中。 AC_CHECK_LIB
和 AC_SEARCH_LIBS
宏都将适当的库 link 选项添加到 LIBS
输出变量,这是 Automake 绘制全局 link 的来源之一选项,所以如果你使用这些,你还需要做一些事情来避免数学库选项保留在 LIBS
中。或者,您可以设计一些其他机制来测试数学库选项。
一个好的技巧是在运行 AC_CHECK_LIB
之前保存LIBS
的值,然后提取数学库选项(如果有的话),然后恢复原始值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