标签: automake

如何让automake不那么难看?

我最近学会了如何使用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"就完美了.

automake makefile gnu-make

11
推荐指数
1
解决办法
2402
查看次数

如何用automake编译同一程序的MPI和非MPI版本?

我有一个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)?

automake autoconf mpi

11
推荐指数
2
解决办法
3681
查看次数

automake错误:未找到AM_INIT_AUTOMAKE的正确调用

我是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 autotools

11
推荐指数
2
解决办法
2万
查看次数

如何使用automake安装数据目录树

如何使用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调用之前未创建子目录.

automake

10
推荐指数
1
解决办法
2973
查看次数

使用pkg-config宏PKG_CHECK_MODULES失败

我确信这是一个相当简单的问题.我有一个非常简单的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.

macos automake autoconf pkg-config osx-snow-leopard

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

在公共头文件中使用条件是一种良好的做法吗?

我的C库有一些可选功能,使用automake,用户可以通过提供配置标志来打开和关闭它们.

如果关闭某个功能,则不会编译该功能.

但是,我的问题是,在这种情况下,我是否应该从公共头文件中删除函数原型?

这似乎不是一个好主意,有未编译函数的函数原型,但它对我来说不是一个好主意,有不同的公共报头装取决于库配置.(类似于config.h在公共头文件目录中安装的不良做法.)

对于可选功能,公共标题的最佳方法是什么?如果用户尝试使用禁用的功能,错误应该在编译时还是链接时?这种情况必须有标准做法.(如果有多个想法,我更愿意遵守GNU编码标准,但我不知道关于这个问题的GNU标准.)

c automake gnu shared-libraries

10
推荐指数
1
解决办法
158
查看次数

如何在Automake和libtool使用项目中构建*.so模块?

我和其他人有同样的问题:

  • 我在Automake项目中有一个*.lalibtool生成的文件(例如),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)

automake shared-libraries libtool

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

我应该在github存储库中包含configure和makefile吗?

我们最近从subversion转移到git,然后转到Github,用于几个开源项目.Github很不错,因为它提供了很多功能.我特别喜欢的一件事是能够下载标签zip.tar.gz文件.

不幸的是,Github最近停止了下载.这应该不是问题,因为能够下载标签.然而,在过去我们没有把Makefile,configure脚本或任何其他Autoconf生成的文件到回购,因为他们得到很多的冲突,当人们合并.

处理这个问题的正确方法是什么?

  • 我应该在回购中放置autoconf和automake生成的文件,以便人们可以直接下载标签吗?
  • 或者应该有一个bootstrap.sh文件,并告诉人们运行该文件?
  • 或者我应该做一个make dist并将其放入回购中?

谢谢

automake autoconf software-distribution github

10
推荐指数
2
解决办法
2139
查看次数

automake:如何将文件复制到构建目录?

我正在自动化一个图书馆项目,这个项目有一些示例程序.我希望示例程序在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).我已经尝试了一些东西,例如,添加RunDemodist_noinst_SCRIPTS,以及加入我自己的副本目标,并试图挂钩all.无论我怎么努力,我总是得到输出,

$ make RunDemo
make: Nothing to be done for `../../../projects/demo/RunDemo'.
Run Code Online (Sandbox Code Playgroud)

我似乎无法在builddir中创建一个目标,"如果此文件不在builddir中,则从srcdir复制它".

这可能与automake有关吗?

automake

10
推荐指数
1
解决办法
3193
查看次数

避免递归进行安装

我正在使用构建项目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。反正我有摆脱这种特殊的递归?

automake autotools configure

10
推荐指数
1
解决办法
154
查看次数