我最近学会了如何使用automake,我有点恼火,我的编译命令来自一堆:
g++ -O2 -Wall -c fileName.cpp
Run Code Online (Sandbox Code Playgroud)
对于一堆:
depbase=`echo src/Unit.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
g++ -DHAVE_CONFIG_H -I. -I./src -g -O2 -MT src/Unit.o -MD -MP -MF $depbase.Tpo -c -o src/Unit.o src/Unit.cpp &&\
mv -f $depbase.Tpo $depbase.Po
Run Code Online (Sandbox Code Playgroud)
有没有办法清理它?我通常可以轻松地选择警告信息,但现在要阅读的文字墙是3倍大且更奇怪.
我知道我的旗帜是什么,因此只需要为每个文件说"编译xxx.cpp"就完美了.
我有一个C++代码,可以使用MPI支持编译,具体取决于某个预处理器标志; 缺少相应的标志,源编译为非并行版本.
我想设置的Makefile.am,以便它编译双方的MPI并行和串行版本,如果选项
./configure中给出.
这是一个问题:MPI有自己的C++编译器包装器,并坚持使用它而不是标准C++编译器编译和链接源代码.如果我自己编写Makefile,我必须做这样的事情:
myprog.seq: myprog.cxx
$(CXX) ... myprog.cxx
myprog.mpi: myprog.cxx
$(MPICXX) -DWITH_MPI ... myprog.cxx
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉automake在编译MPI启用的程序版本时必须使用$(MPICXX)而不是$(CXX)?
我是autotools的新手,并且遵循本教程.但我无法解决这个错误,
$ automake
configure.ac: error: no proper invocation of AM_INIT_AUTOMAKE was found.
..
Makefile.am: error: required file './depcomp' not found
..
/usr/share/automake-1.12/am/depend2.am: error: am__fastdepCC does not appear in AM_CONDITIONAL
..
/usr/share/automake-1.12/am/depend2.am: error: AMDEP does not appear in AM_CONDITIONAL
..
Run Code Online (Sandbox Code Playgroud)
我的configure.ac档案是
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE(hello,1.0)
AC_CONFIG_SRCDIR([config.h.in])
AM_CONFIG_HEADERS(config.h)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for …Run Code Online (Sandbox Code Playgroud) 如何使用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.
我的C库有一些可选功能,使用automake,用户可以通过提供配置标志来打开和关闭它们.
如果关闭某个功能,则不会编译该功能.
但是,我的问题是,在这种情况下,我是否应该从公共头文件中删除函数原型?
这似乎不是一个好主意,有未编译函数的函数原型,但它也对我来说不是一个好主意,有不同的公共报头装取决于库配置.(类似于config.h在公共头文件目录中安装的不良做法.)
对于可选功能,公共标题的最佳方法是什么?如果用户尝试使用禁用的功能,错误应该在编译时还是链接时?这种情况必须有标准做法.(如果有多个想法,我更愿意遵守GNU编码标准,但我不知道关于这个问题的GNU标准.)
我和其他人有同样的问题:
*.la由libtool生成的文件(例如),module.la*.so它用于dlopen()(例如module.so).但是:项目已配置和构建,--disable-shared以确保创建的主二进制文件是一个大的静态链接程序,例如main.x(更容易部署和调试).因此*.so不会创建文件.
该程序main.x是一个巨大的框架式应用程序,它能够通过加载扩展(模块)dlopen()- 尽管它是静态链接的.
当我module.so手工构建时,这很好用.但是这Makefile.am对我来说似乎是不可能的.是的,我可以写lib_LTLIBRARIES,但按照我的标准,--disable-shared我没有得到*.so文件.
lib_LTLIBRARIES = module.la
module_so_SOURCES = module.cpp
Run Code Online (Sandbox Code Playgroud)
module.la创建文件,dlopen()拒绝加载(当然).
我试图将规则用于Makefile.am手动构建它并且有效:
# Makefile.am (yes, .am)
all: mm_cpp_logger.so
SUFFIXES = .so
%.so: %.cpp
$(CXX) $(CXXFLAGS) -fPIC -fpic -c -I $(top_srcdir)/include -o $@ $<
%.so: %.o
$(CXX) …Run Code Online (Sandbox Code Playgroud) 我们最近从subversion转移到git,然后转到Github,用于几个开源项目.Github很不错,因为它提供了很多功能.我特别喜欢的一件事是能够下载标签zip或.tar.gz文件.
不幸的是,Github最近停止了下载.这应该不是问题,因为能够下载标签.然而,在过去我们没有把Makefile,configure脚本或任何其他Autoconf生成的文件到回购,因为他们得到很多的冲突,当人们合并.
处理这个问题的正确方法是什么?
bootstrap.sh文件,并告诉人们运行该文件?make dist并将其放入回购中?谢谢
我正在自动化一个图书馆项目,这个项目有一些示例程序.我希望示例程序在dist中分发,但不安装.
目前,演示程序的组织如下:
src/*.cpp (library source)
include/*.h (library headers)
demos/demo.cpp (example program)
demos/RunDemo (script to run demo)
Run Code Online (Sandbox Code Playgroud)
在构建软件之后运行RunDemo非常重要,无需"安装"步骤.
到目前为止,我已经能够使用noinst_PROGRAMS目标构建"demo"exectuable .但是,make在VPATH构建之后,可以使用以下命令:
build/src/.libs/libxxx.so (etc..)
build/demos/demo
Run Code Online (Sandbox Code Playgroud)
如您所见,执行"demo"所需的RunDemo脚本不会复制到$(builddir).我已经尝试了一些东西,例如,添加RunDemo到dist_noinst_SCRIPTS,以及加入我自己的副本目标,并试图挂钩all.无论我怎么努力,我总是得到输出,
$ make RunDemo
make: Nothing to be done for `../../../projects/demo/RunDemo'.
Run Code Online (Sandbox Code Playgroud)
我似乎无法在builddir中创建一个目标,"如果此文件不在builddir中,则从srcdir复制它".
这可能与automake有关吗?
我正在使用构建项目autotool。基本上,该项目取决于几个由共同管理的第三方项目autotool。
my_project/
my_project/3rd-party/
Run Code Online (Sandbox Code Playgroud)
为了启用递归构建,我AC_CONFIG_SUBDIRS在我的configure.ac中添加了宏:
AC_CONFIG_SUBDIRS([3rd-party/gtest-1.7.0])
AC_CONFIG_SUBDIRS([3rd-party/libstatgrab-0.91])
AC_CONFIG_SUBDIRS([3rd-party/leveldb-1.2.0])
Run Code Online (Sandbox Code Playgroud)
这给了我递归构建,链接和清理的便利。但是,当我点击时,我不想安装所有这些第三方库,而是我自己的项目make install。反正我有摆脱这种特殊的递归?