如何使用automake安装HTML文件,样式表和图像的目录树,而无需在每个子目录中创建Makefile?
在顶层目录中使用以下内容
htmldir = $(docdir)/foo/html
html_DATA = \
stylesheets/foo.css \
images/foo.jpg \
index.html \
about/index.html \
faq/index.html
EXTRA_DIST = $(html_DATA)
Run Code Online (Sandbox Code Playgroud)
失败,因为在install调用之前未创建子目录.
我确信这是一个相当简单的问题.我有一个非常简单的configure.ac文件,我正在使用它来了解autoconf和pkg-config如何协同工作.该confgure.ac文件看起来像:
AC_PREREQ(2.61)
AC_INIT(autoconf_test, 1.0, nowhere@dev.null)
PKG_CHECK_MODULES(libusbmuxd, libusbmuxd >= 0.1.4)
Run Code Online (Sandbox Code Playgroud)
然后我可以从命令行执行autoconf,它确实生成了一个配置脚本.但是,当我运行配置脚本时,我收到以下错误:
./configure: line 1618: syntax error near unexpected token `libusbmuxd,'
./configure: line 1618: `PKG_CHECK_MODULES(libusbmuxd, libusbmuxd >= 0.1.4)'
Run Code Online (Sandbox Code Playgroud)
如果我使用命令行中的pkg-config程序检查它是否可以找到此库,则会成功.
/usr/lib/pkgconfig $pkg-config --libs --cflags --modversion libusbmuxd
1.0.7
-I/usr/local/Cellar/usbmuxd/1.0.7/include -L/usr/local/Cellar/usbmuxd/1.0.7/lib -lusbmuxd
Run Code Online (Sandbox Code Playgroud)
所以,似乎很清楚,由于某种原因,PGK_CHECK_MODULE无法定位宏,我不知道为什么.
这可能不是特定于操作系统,但我使用的是Mac OS X 10.6.8.
我没有看到任何与GNU autoconf/automake构建有关的问题,但我希望至少有一些人熟悉它.开始:
我有一个项目(我称之为myproject),包括另一个项目(供应商).供应商项目是由其他人维护的独立项目.包含这样的项目是相当简单的,但在这种情况下有一个小问题:每个项目都生成自己的config.h文件,每个文件定义标准宏,如PACKAGE,VERSION等.这意味着,在构建期间,当供应商正在构建中,我收到很多这样的错误:
... warning: "VERSION" redefined
... warning: this is the location of the previous definition
... warning: "PACKAGE" redefined
... warning: this is the location of the previous definition
Run Code Online (Sandbox Code Playgroud)
这些只是警告,暂时至少,但我想摆脱它们.我已经能够通过Google搜索获得的唯一相关信息是automake邮件列表中的这个主题,这不是很多帮助.还有其他人有更好的想法吗?
是否可以在使用automake/libtool的项目中使用gcc预编译头文件?
添加新的make规则来构建预编译头文件并不困难.问题是你还必须添加由libtool和AFAIK引入的编译标志,它无法处理标头输入文件.
你怎么能这样做?
我有一个大型的autoconf/automake项目,使用AC_CONFIG_SUBDIRS分解成组件.有没有办法让autoconf/configure运行得更快?也许并行进行子目录,或缓存可重用的结果?
我可以轻松地编写一个可以并行构建组件的构建脚本,但更愿意不添加构建结构维护的辅助点.
我有一个Makefile.am用于编译Ocaml源代码的ocamlbuild.但是,即使我有
AM_INIT_AUTOMAKE([foreign no-dependencies])
Run Code Online (Sandbox Code Playgroud)
在我的configure.ac,automake认为必须有一个C编译器来安装exectuables.也就是说,如果我将Makefile.am目标可执行文件放入bin_PROGRAMS使用ocamlbuild构建,则autoreconf(版本1.11.3)告诉我:
Makefile.am: C source seen but `CC' is undefined
Makefile.am: The usual way to define `CC' is to add `AC_PROG_CC'
Makefile.am: to `configure.ac' and run `autoconf' again.
autoreconf: automake failed with exit status: 1
Run Code Online (Sandbox Code Playgroud)
我不希望有AC_PROG_CC,因为我的源代码不包括C.它是纯粹的Ocaml程序编写.我能做什么?(我有同样的问题libexec_PROGRAMS.)
在Makefile.in我看到变量定义,其中外部变量名称包含在两个@符号之间
# @configure_input@
package = @PACKAGE_NAME@
Run Code Online (Sandbox Code Playgroud)
那些外部变量来自哪里?另外,我在GNU手册中找不到两个@符号之间完全包含变量的含义是什么意思?它是Makefile.in特有的东西吗?
谢谢.
我有一个autotools项目,可以在Mac上编译得很好,但在Linux(Ubuntu 12.04.1 LTS)下,命令行传递给gcc库相对于目标文件乱序.例如,autotools生成以下命令来编译我的代码,一个名为test.c二进制文件的文件命名为test:
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -O2 -lglib-2.0 -o test test-test.o
Run Code Online (Sandbox Code Playgroud)
此命令行失败:
/home/user/glib-test/test.c:4: undefined reference to `g_malloc`
/home/user/glib-test/test.c:5: undefined reference to `g_free`
Run Code Online (Sandbox Code Playgroud)
但是,如果我从命令行编译并将其切换,以便库引用位于目标文件之后,它可以正常工作:
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -O2 -o test test-test.o -lglib-2.0
Run Code Online (Sandbox Code Playgroud)
挑战在于我无法弄清楚如何强制Autotools以正确的顺序生成命令行.为了清楚起见,我在这里重现了简单的测试用例.首先是configure.ac:
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(glib-test, 1.0)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE()
AC_PROG_CC
AM_PROG_CC_C_O
PKG_CHECK_MODULES(GLIB, glib-2.0 > 2.0)
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)
接下来很简单Makefile.am:
CFLAGS=-Wall
bin_PROGRAMS=test
test_CFLAGS=$(GLIB_CFLAGS)
test_LDFLAGS=$(GLIB_LIBS)
test_SOURCES=test.c
Run Code Online (Sandbox Code Playgroud)
最后,这个最小测试用例的源代码,test.c:
#include <glib.h>
int …Run Code Online (Sandbox Code Playgroud) 我正在尝试为hello world示例C程序创建安装包.
我已经完成了以下工作.
自动扫描
mv configure.scan configure.ac编辑configure.ac以添加一些宏.
aclocal会
在其中创建Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.c
Run Code Online (Sandbox Code Playgroud)
最后我做了automake.
然后我收到了消息..
configure.ac:12: error: required file './compile' not found
configure.ac:12: 'automake --add-missing' can install 'compile'
configure.ac:6: error: required file './missing' not found
configure.ac:6: 'automake --add-missing' can install 'missing'
Makefile.am: error: required file './INSTALL' not found
Makefile.am: 'automake --add-missing' can install 'INSTALL'
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required …Run Code Online (Sandbox Code Playgroud) 我在使用automake时遇到了以下错误.我知道你可以把AUTOMAKE_OPTIONS = subdir-objects"放在Makefile.am的顶部.但是如何为所有文件设置这种行为,所以我不需要逐个进行呢?
Makefile.am:454: warning: source file 'libs/esl/src/esl_threadmutex.c' is in a subdirectory,
Makefile.am:454: but option 'subdir-objects' is disabled
Makefile.am:454: warning: source file 'libs/esl/ivrd.c' is in a subdirectory,
Makefile.am:454: but option 'subdir-objects' is disabled
Makefile.am:454: warning: source file 'libs/esl/src/esl_json.c' is in a subdirectory,
Makefile.am:454: but option 'subdir-objects' is disabled
Makefile.am:454: warning: source file 'libs/esl/src/esl_buffer.c' is in a subdirectory,
Makefile.am:454: but option 'subdir-objects' is disabled
tests/unit/unit.mk:6: warning: source file 'tests/unit/switch_event.c' is in a subdirectory,
tests/unit/unit.mk:6: but option 'subdir-objects' is disabled
Makefile.am:854: 'tests/unit/unit.mk' …Run Code Online (Sandbox Code Playgroud)