使用autoconf

时间:2019-03-06 14:23:50

标签: makefile gnu autotools configure autoconf

出于工作目的,我需要链接由另一个程序生成并在其文件夹中找到的目标文件,这种情况是我没有找到有关这种链接的信息。我认为,如果我对路径进行硬编码并将name-of-obj.o放在package_LDADD变量前面应该可以,但是这种情况是我不想那样做。

如果找不到该对象,我希望配置失败并告诉用户name-of-obj.o丢失。

我尝试使用AC_LIBOBJ([name-of-obj.o]),但这将尝试在根目录中找到obj.c名称并进行编译。

有关此问题的任何提示或解决方案?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我需要链接到另一个程序生成的目标文件,并且   在其文件夹中找到

您所描述的是一个非常不寻常的要求,而不是Autotools旨在干净或轻松处理的要求。尤其是,与库相比,Autoconf没有专门适用于搜索裸对象文件的机制,而Automake在链接时并没有特别的自动化来围绕此类对象。但是,这些工具确实具有足够的通用功能来满足您的需求。只是不会像您想要的那样整洁。

  

我认为,如果我对路径进行硬编码并放入   name-of-obj.o变量前面的package_LDADD应该可以,但是   情况是我不想那样做。

我认为这是您要避免的“硬编码路径”部分。不能将项目添加到适当的LDADD变量中;这是使对象包含在链接中的正确方法。

  

如果找不到该对象,我希望配置失败并告诉   用户,缺少obj.o名称。

那么,关键的事情似乎是让configure执行对目标文件的搜索。 Autoconf没有内置的机制来执行这样的搜索,但是它只是一个基于宏的shell脚本生成器,因此您可以在shell脚本+ Autoconf中编写这样的搜索,也许是这样的:

AC_MSG_CHECKING([for name-of-obj.o])
OTHER_LOCATION=
for my_dir in
    /some/location/other_program/src
    /another/location/other_program.12345/src
    $srcdir/../relative/location/other_program/src; do
  AS_IF([test -r "${my_dir}/name-of-obj.o"], [
    # optionally, perform any desired test to check that the object is usable
    # ... perhaps one using AC_LINK_IFELSE ...
    # if it passes, then
    OTHER_LOCATION=${my_dir}
    break
  ])
done

# Check whether the object was in fact discovered, and act appropriately
AS_IF([test "x${OTHER_LOCATION}" = x], [
  # Not found
  AC_MSG_RESULT([not found])
  AC_MSG_ERROR([Cannot configure without name-of-obj.o])
], [
  AC_MSG_RESULT([${OTHER_LOCATION}/name-of-obj.o])
  AC_SUBST([OTHER_LOCATION])
])

这是有功能的,但是您当然可以修饰,例如,通过让软件包构建器通过命令行参数(AC_ARG_WITH(...)来指定要使用的位置。而且,如果要对多个对象执行此操作,则可能需要将其中至少一些包装到自定义宏中。

Automake方面的参与要少得多。要链接对象,只需使用上面创建的输出变量将其添加到适当的LDADD变量中,例如:

foo_LDADD = $(OTHER_LOCATION)/name-of-obj.o

请注意,如果仅构建一个程序目标,则可以使用常规的LDADD而不是foo_LDADD,但是请注意,默认情况下,这些是替代品,而不是补充。


话虽如此,这总体上是个坏主意。如果要链接不属于项目的内容,则应从已安装的库中获取。当然,它可以是本地的,自定义构建的库,只要它是库而不是裸对象文件并已安装即可。如果您不想依赖或分发单独的共享库,则它可以是静态库。

另一方面,如果您的项目是较大版本的一部分,则最好的方法可能是将其集成到该版本中,或者作为子项目。仍然最好链接库而不是裸对象文件,但是在子项目上下文中,使用未安装到构建系统的库可能是有意义的。结合一个命令行参数,告诉它在哪里可以找到所需的库,这可以使所需的Autoconf代码更加清晰明了。