标签: autoconf

autoconf/automake:基于库的存在的条件编译?

我需要根据库的存在有条件地编译一些代码.使用autoconf/automake似乎应该很容易,但我无法弄明白.

例如,如果存在PNG库,我想包含使用它的代码.我的configure.ac有:

AC_CHECK_LIB([png], [png_create_write_struct_2])
Run Code Online (Sandbox Code Playgroud)

我的Makefile.am有:

if USE_LIBPNG
libdev_la_SOURCES += png.c
endif
Run Code Online (Sandbox Code Playgroud)

(它将png.c添加到libdev的源列表中,以便进行编译).

像USE_LIBPNG这样的automake条件要求在configure.ac中定义条件,所以我需要:

AM_CONDITIONAL([USE_LIBPNG], [test SOMETHINGOROTHER])
Run Code Online (Sandbox Code Playgroud)

问题是,什么可以测试SOMETHINGOROTHER?AC_CHECK_LIB定义了什么,我可以测试?

AC_CHECK_LIB的默认行为是定义一个可以在源代码中使用的符号(在config.h中),但这对Makefile没有帮助,因为AM_CONDITIONAL需要shell测试

我尝试覆盖默认的AC_CHECK_LIB行为,如下所示:

AC_CHECK_LIB([png], [png_create_write_struct_2], [HAS_LIBPNG=1])
Run Code Online (Sandbox Code Playgroud)

之后我可以测试它:

AM_CONDITIONAL([USE_LIBPNG], [test "x$HAS_LIBPNG" = "x1"])
Run Code Online (Sandbox Code Playgroud)

这很丑陋,但适用于Makefile ...但是会产生一个新问题:因为它丢弃了原来的AC_CHECK_LIB行为,而且我不再在config.h中添加一个符号,这是我需要的.

我必须遗漏一些基本的东西,或者可能做错了.已经挖了几个小时,没有找到答案.

任何人?

automake autoconf

13
推荐指数
1
解决办法
9363
查看次数

如何在Autoconf中使用C++ 11功能?

我有一个通过Autoconf配置的项目,我想在这个项目中开始使用C++ 11功能.如何始终启用"-std = gnu ++ 0x"开关并支持配置时检查的功能?

c++ autoconf c++11

13
推荐指数
3
解决办法
1万
查看次数

如何为ARM交叉编译Git?

不幸的是,我很难为ARMv6架构交叉编译Git.

但在我开始描述我已经采取的步骤和我输入的命令之前,我应该简要描述一下构建环境:

  • 我在Ubuntu 12.10 64位上进行交叉编译.
  • 交叉编译器安装到/home/my_name/cctoolchain(该目录包含了bin/,lib/等).

我从这里开始抓住Git 1.8.2 .解压缩后运行的目录:

export PATH=$PATH:/home/my_name/cctoolchain/bin

我也跑去autoconf确保它./configure是最新的.然后我调用./configure如下:

./configure --prefix=/home/my_name/git-arm --build=x86_64-linux-gnu
  --host=arm-linux-androideabi

这运行了几秒钟然后中止了:

checking whether system succeeds to read fopen'ed directory...
configure: error: in `/home/my_name/git-1.8.2':
configure: error: cannot run test program while cross compiling

我打开configure.ac并删除了806-825行,禁用了测试.在这之后,我还必须删除806-839行,原因类似.

此时,./configure脚本能够完成.然后我兴奋地跑去make构建Git,经过几分钟后,遇到了这个错误:

fetch-pack.c: In function 'fetch_pack':
fetch-pack.c:928:16: error: 'struct stat' has no member named 'st_mtim'
make: *** [fetch-pack.o] Error 1

不知何故,我感觉自己"做错了".这听起来比手动删除测试要简单得多configure.ac …

git autoconf cross-compiling

13
推荐指数
1
解决办法
4872
查看次数

Autoconf检查struct flock

fcntl()使用struct flock结构来定义和检查文件锁.不幸的是,在不同的Unix系统上,这种结构中的字段顺序不同.有没有人知道如何使用autoconf检查它或至少检查结构是否采用特定格式(例如,问题是 - 结构格式是否与Linux格式匹配)?

c unix linux autoconf autotools

13
推荐指数
1
解决办法
1030
查看次数

使用rake与非ruby项目

一位同事提出了将rake用作非ruby项目的构建系统的想法.是否可以扩展rake以补充通常使用autoconf工具集的其他语言?

ruby rake autoconf

12
推荐指数
1
解决办法
3165
查看次数

如何在configure.in中测试C++库的可用性?

我正在研究GNU/Linux上的C++项目,我正在寻找一种方法来测试IBM Informix库与Autotools的存在性和可用性 - 即编辑configure.in.我没有Autotools的经验,所以基本上我从项目configure.in 等人那里学到了.脚本和复制和更改我认为需要更改的位置.我,我一直在改编现有的文字configure.in.

到目前为止,我一直在成功使用AC_CHECK_LIBin configure.in来测试某个库是否存在且是否可用.但这似乎只适用于具有函数的库,而不是类.也就是说,在测试Informix的libifc++.so库时,这会失败:

AC_CHECK_LIB(ifc++, ITString, 
        INFORMIX_LIB="-L$INFORMIX_LIB_LOCATION/c++ -lifc++ -L$INFORMIX_LIB_LOCATION -L$INFORMIX_LIB_LOCATION/dmi -L$INFORMIX_LIB_LOCATION/esql -lifdmi -lifsql -lifasf -lifgen -lifos -lifgls -lifglx $INFORMIX_LIB_LOCATION/esql/checkapi.o -lm -ldl -lcrypt -lnsl",
        echo "* WARNING: libifc++.so not found!"
        INFORMIX_INC=""
        INFORMIX_LIB=""
)
Run Code Online (Sandbox Code Playgroud)

我也试过使用其他组合,比如ITString::ITString等.

我没有在Informix的API中找到"纯"函数(即,在C++类中没有上下文的函数).所以我希望AC_CHECK_LIB在这种情况下有一种方法可以使用,或者还有另一种autoconf/ configure.in"命令"用于此特定用途.

提前感谢您的反馈.

c++ usability autoconf autotools configure

12
推荐指数
2
解决办法
4742
查看次数

autotools临时文件

我正在尝试为开源项目调试autotools问题,这在配置步骤失败了.我想看看配置的代码/可执行文件正在尝试运行.

但是,config.log只显示失败的东西(不是它试图编译的代码),我不知道临时可执行文件的存储位置(并且它们可能会被及时删除).

有没有办法让autotools保持其临时文件?在指定的级别无关紧要 - 无论是使用args进行配置,还是在生成configure时使用args到autoconf,或者甚至进行一些m4调用.

编辑当出现故障时,configure.log看起来像这样:

configure:3285: checking whether we are cross compiling
configure:3293: gcc -o conftest.exe -DU_STATIC_IMPLEMENTATION -O3   conftest.c  >&5
configure:3297: $? = 0
configure:3304: ./conftest
configure:3308: $? = 1
configure:3315: error: in `/home/bobthebuilder/Development/icu/build':
configure:3317: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details
Run Code Online (Sandbox Code Playgroud)

autoconf autotools

12
推荐指数
1
解决办法
2486
查看次数

从configure.ac中的文件中读取版本号

由于某些原因,我在纯文本文件而不是configure.ac中定义项目版本号.我想创建一个语句来读取版本号并在编译期间存储它.

现在我的configure.ac看起来像这样:

AC_INIT([my program],[999.9.9])
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西:

AC_INIT([my program],[ $(cat VERSION) ])
Run Code Online (Sandbox Code Playgroud)

这当然不会奏效.这里的诀窍是什么?(我知道我失去了一些便携性 - 我现在不在乎).谢谢!

autoconf

12
推荐指数
2
解决办法
4276
查看次数

如何使用Autoconf通过"./configure"设置定义

我有一个项目可以基于一个定义生成两个不同的应用程序.

libfoo_la_CXXFLAGS = -DMYDEFINE
Run Code Online (Sandbox Code Playgroud)

我必须修改Makefile.am来设置这个定义,所以它不是自动的.

我可以通过configure命令以某种方式设置此定义吗?有没有其他方法可以使用autotools设置一个定义?

c++ automake autoconf autotools configure

12
推荐指数
2
解决办法
9854
查看次数

如何在使用交叉编译器时确定configure的主机值

一般问题:如果我使用交叉编译器,我怎么能告诉我在运行configure时应该给出的"--host"选项的值?

具体:我正在使用arm64 arch的交叉编译器.什么是正确的"--host"值?

autoconf cross-compiling arm64

12
推荐指数
3
解决办法
1万
查看次数

标签 统计

autoconf ×10

autotools ×4

c++ ×3

automake ×2

configure ×2

cross-compiling ×2

arm64 ×1

c ×1

c++11 ×1

git ×1

linux ×1

rake ×1

ruby ×1

unix ×1

usability ×1