代码之家  ›  专栏  ›  技术社区  ›  Mathieu Shrikanth M D

如何为同一autotools项目中的两个程序提供不同的生成选项

  •  1
  • Mathieu Shrikanth M D  · 技术社区  · 6 年前

    我有一个简单的自动工具项目,有两个程序: one two

    只有一个程序依赖于库( math 在这个例子中),我 希望其他程序不与此库链接。

    这是我的档案:

    配置.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    
    

    生成文件.am

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

    (标题已删除)

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

    二.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 回复  |  直到 6 年前
        1
  •  1
  •   John Bollinger    6 年前

    只有一个程序依赖于一个库(本例中为数学), 我希望另一个程序不与此相关 图书馆。

    在同一个Autotools项目中构建具有不同选项的程序需要一些注意。通常的方法是为那些并非所有项目通用的位创建单独的输出变量,并在您的应用程序中使用它们 Makefile.am

    在您的示例中,指定数学库的链接选项是特定于目标的,因此您需要在它们自己的变量中捕获它们。这个 AC_CHECK_LIB AC_SEARCH_LIBS 这两个宏都在 LIBS . 或者,您可以设计一些其他机制来测试数学库选项。

    自由基 跑步前 检查库 ,提取数学库选项(如果有),然后还原 自由基 . 这是一个相对常见的Autoconf习语。例如,

    LIBS_save=$LIBS
    
    AC_CHECK_LIB([m], [log])
    
    LIBM_LDFLAGS=${LIBS%${LIBS_save}}
    AC_SUBST([LIBM_LDFLAGS])
    
    LIBS=$LIBS_save
    

    你的 生成文件.am 可能看起来是这样的:

    bin_PROGRAMS = one two
    
    one_SOURCES = one.c
    one_LDADD = $(LIBM_LDFLAGS)
    
    two_SOURCES = two.c