标签: automake

什么是 ltmain.sh,为什么 automake 说它丢失了?什么是好的自动(make/conf/etc)生成器?

我只想用自动生成的 auto(make/conf/...) 东西在 linux 中开发一个 C 应用程序。我尝试用 ede 和 anjuta 生成它,但它似乎没有生成 Makefile.am。所以,我尝试运行 automake,它说找不到“ltmain.sh”。是否有一些易于为 linux C/C++ 应用程序生成基本构建文件的方法。什么是标准做法?大多数人自己编写这些文件吗?

emacs automake autoconf anjuta

5
推荐指数
2
解决办法
5055
查看次数

带有 automake/autoconf 条件的 Makefile

谁能告诉我是否有办法向 Makefile.am 插入条件块,以便将其进一步传递给由 autotools 创建的 Makfile?

下面是一个例子:

ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Run Code Online (Sandbox Code Playgroud)

这似乎是做有条件的事情的常见 Makefile 方式。Automake 切断 endif 行并最终失败并显示如下消息:

Makefile:390: *缺少‘endif’。停止。

有什么想法吗?

python automake autoconf conditional

5
推荐指数
1
解决办法
1944
查看次数

Automake:构建不安装的共享模块

如何告诉 Automake 构建一个不需要安装的动态模块?

pkglib_LTLIBRARIES = mywrapper.la
mywrapper_la_LDFLAGS = -no-undefined -module -avoid-version
Run Code Online (Sandbox Code Playgroud)

导致 mywrapper.so 安装到pkglibdir.

noinst_LTLIBRARIES = mywrapper.la
mywrapper_la_LDFLAGS = -no-undefined -module -avoid-version
Run Code Online (Sandbox Code Playgroud)

导致改为构建静态便利库。

有问题的动态模块仅用于运行测试套件,因此不能分发。

automake libtool

5
推荐指数
1
解决办法
678
查看次数

Automake的预期项目/目录结构?

我正在开发一个静态C库,并且一直在使用一个简单的Makefile.我们现在不得不支持异地安装等等,现在是时候采用更强大的构建标准了.我真的希望它是autotools - 我喜欢GNU Build System的自动一致性,我也发现它非常容易使用.

那就是说,我有一个问题.

以下是项目结构的概述:

project/
    common/
       pkg/
    inc/
    src/
       submodule1/
           some_thing/
           some_other_thing/
       submodule2/
        . . .
Run Code Online (Sandbox Code Playgroud)

common包含将安装在目标系统上的头文件 - 一个直接在常见下的头文件,以及一些其他共同的东西/ pkg.(好吧,这不是真的PKG,这只是一个例子.)一切都在common.h.

inc包含严格与实现相关的内部包含文件,不应公开.一切都在inc.h.

src为每个子模块都有一个目录,每个子模块可以分成或不分成几个子分段(子模块,如果你愿意的话).一切都在src.c.

原始makefile将设置一个SOURCES变量,该变量由.c在src中递归发现的每个文件组成,添加-I./common -I./inc,构建目标文件,并将它们存档到库中.非常直截了当.

好吧,有了automake,它似乎并不那么简单.我想到了为构建目标添加标志,例如`project_CPPFLAGS = -I./ inc -I./common" - 这解决了部分问题,但我觉得我做错了什么,不知何故.

有了那些(次优的?)设置,我可以建立和连接图书馆,这已经足够令人兴奋,但我在这里的真正原因是make install.

主要问题是:

common如果愿意,包含库的公共接口.需要构建源,但也需要安装.如果我包含它project/,那么automake会看到类似common/thing.hcommon/pkg/other.h的路径,并includedir在安装时弄错路径.我想把它递归到那个目录来构建一个只有安装头的项目,但这不仅闻起来很糟糕,而且在我尝试它时它不起作用.库头需要一个特定的树结构 - 如何维护lib头树结构,使它们可用于所有源文件,并根据它们安装它们common

另外,是否有一些更优雅的方式来处理包含而不是强制-I?我知道我必须指定它们HEADERS以便将它们放入分发包中,但实际上这似乎并不能使它们被包括在内,让我有点迷失.

我觉得automake(也许是一般的GNU)期待我的项目的一些结构,我只是没有看到. …

c automake gnu autotools

5
推荐指数
1
解决办法
2031
查看次数

autotools Makefile是否自动将包含的头文件视为依赖项?

我有一个autotools管理的项目(此处为sscce tar.gz包),具有以下结构:

./main.c
./foo.c
./foo/foo.h

configure.ac是:

AC_INIT([foo], [1.0], [foo@bar.ba])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])

AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)

Makefile.am是:

bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo.h
Run Code Online (Sandbox Code Playgroud)

它编译和运行完美......但后来我注意到我的Makefile.am不正确.它声明我的主要代码依赖foo.h,但真正的文件是foo/foo.h.我改变了它,编译按预期工作,就像之前一样:

bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo/foo.h
Run Code Online (Sandbox Code Playgroud)

然而,它让我想知道:当依赖关系错误时它是如何工作的?它工作得很好,我甚foo/foo.h至可以编辑并make重新编译依赖文件.实际上,我甚至可以从依赖项中删除头文件...

bin_PROGRAMS = main
main_SOURCES = main.c foo.c
Run Code Online (Sandbox Code Playgroud)

...它仍将被扫描,会触发重新编译相关文件.

所以,我的问题是:

  • autotools生成的如何Makefile知道foo/foo.hmake调用期间要分析的依赖项?
  • 我应该将头文件添加到main_SOURCES变量吗?
  • make在第一种情况下不应该失败,因为我声明一个不存在的文件是一个依赖项?

c automake makefile autotools

5
推荐指数
1
解决办法
2248
查看次数

使用autotools处理文件名中的空格

如何告诉automake使用名称中带有空格的文件?这似乎不起作用.

bin_PROGRAMS = prog
prog_SOURCES = "a file.c" "another file.c"
Run Code Online (Sandbox Code Playgroud)

automake autotools

5
推荐指数
1
解决办法
545
查看次数

automake 1.12 更改了 bison/yacc 输出名称,向后不兼容的更改?

我在https://github.com/Habbie/autoyacc-problem上发布了一个存储库来演示我的问题。

在 automake 1.11 及以下版本中,AC_PROG_YACC在 configure.ac 和AM_YFLAGS=-dMakefile.am 中使用,parser.yy 将变成 parser.cc 和 parser.h。使用 automake 1.12,我得到 parser.cc 和 parser.hh。因为 mybin.cc 有include "parser.h",这意味着 1.12 破坏了我的构建。

我感觉这是一个向后不兼容的更改,但我觉得应该有一种理智的方法来处理这个问题。

展示:

git clone https://github.com/Habbie/autoyacc-problem.git
cd autoyacc-problem/
autoreconf -i
./configure
make
Run Code Online (Sandbox Code Playgroud)

automake 1.11 的结果:mybin 被构建。automake 1.12 的结果:

mybin.cc:1:20: error: parser.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

帮助!

注意:本示例中没有实际的 C++ 代码,但对于我的实际问题,我确实需要 g++。

c++ automake autoconf yacc

5
推荐指数
1
解决办法
1320
查看次数

Automake不在子目录中生成Makefile.in

首先,我只是想说,我是Autotools的新手.

我有一个具有以下结构的项目:

+-src
  +-commands
    Makefile.am
    +-copy
      Makefile.am
      copy.h
      copy.cpp
    +-delete
      Makefile.am
      delete.h
      delete.cpp
  main.cpp
  Makefile.am
Makefile.am
Run Code Online (Sandbox Code Playgroud)

Makefile.am有SUBDIRS = src

src/Makefile.am有SUBDIRS =命令.

src/commands/Makefile.am有SUBDIRS = $(AUTODIRS)

当我在root中运行automake时,它会生成Makefile.in和src/Makefile.in,但不会生成命令和副本.

我究竟做错了什么?

c++ automake makefile autotools

5
推荐指数
1
解决办法
1403
查看次数

由于AM_INIT_AUTOMAKE中的subdir-objects选项,Autotools构建失败

我目前正在开发一个依赖于递归automake进行构建的C++项目.我想构建一个共享库,并Makefile.am在库的src目录中看起来像

# ...

# Library name
lib_LTLIBRARIES = libadapter-@MY_API_VERSION@.la

# Sources
libadapter_@MY_API_VERSION@_la_SOURCES = \
    $(top_builddir)/src/sourceA.cpp \
    $(top_builddir)/src/sourceB.cpp

# ...
Run Code Online (Sandbox Code Playgroud)

自1.14版本,automake的问题时,警告subdir-objects未指定的选项AM_INIT_AUTOMAKEconfigure.ac.但是,添加该subdir-objects选项似乎打破了构建过程,make抱怨丢失的.Plo文件.我已经在网上搜索了遇到类似问题的人,但没有找到任何合理的提示,如何在不将项目更改为非递归项的情况下解决问题.任何帮助是极大的赞赏.

编辑: 更深入地探讨这个问题,我注意到./configure创建了一个目录,名称$(top_builddir)在库的当前源目录下面,该目录包含.Plo构建库所需的所有文件.在Makefile,但是,我发现.Plo我的库源当量(sourceA.cppsourceB.cpp在本例中)由前缀include $(top_builddir)/src/$(DEPDIR)/$(top_builddir)被定义为一个变量的相对(即,路径../../../src/.deps/).现在很清楚为什么make找不到.Plo文件,因为它搜索错误的目录.这看起来像bug #16375的可能重复.任何解决方法?

编辑2: 在网络上进一步挖掘,揭示了另外两个线程来解决这个问题:#1327automake-bug.一个已知的解决方法似乎是将--disable-dependency-tracking选项传递给./configure.至少对我来说它有效.

automake autoconf autotools libtool

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

Luajit附近的PKG_CHECK_MODULES语法错误

我是GNU autotools的新手,在我尝试的项目中,./configure它会产生以下错误:

./configure: line 9852: syntax error near unexpected token `luajit,'
./configure: line 9852: `    PKG_CHECK_MODULES(luajit, luajit,LLUAJIT="yes",LLUAJIT="no")'
Run Code Online (Sandbox Code Playgroud)

Configure.in中

 PKG_CHECK_MODULES(luajit, luajit,LLUAJIT="yes",LLUAJIT="no")
    if test "x$LLUAJIT" = "xyes"; then
        CONFIGFLAGS="$CONFIGFLAGS -DHAVE_LIBLUAJIT"
        LUA_CFLAGS="$luajit_CFLAGS"
        LUA_LIBS="$luajit_LIBS"
        AC_SUBST(LUA_CFLAGS)
        AC_SUBST(LUA_LIBS)
        if test "x$macos" != "xno"; then
            LDFLAGS="${LDFLAGS} -pagezero_size 10000 -image_base 100000000"
        fi

    else
        echo
        echo "   ERROR!  LuaJIT library not found. For better performance, go get it from"
        echo "   http://www.luajit.org/."
        AC_MSG_ERROR("Fatal!")
    fi
Run Code Online (Sandbox Code Playgroud)

似乎autoconf(也许)无法找到PKG_CHECK_MODULES宏。我在Internet上搜索了解决方案,发现这是因为libtool未安装。重新安装后libtool,错误仍然存​​在。

希望有人认识到问题并迅速解决,希望能得到您的帮助。

c automake autoconf gnu autotools

5
推荐指数
2
解决办法
3006
查看次数

标签 统计

automake ×10

autotools ×6

autoconf ×5

c ×3

c++ ×2

gnu ×2

libtool ×2

makefile ×2

anjuta ×1

conditional ×1

emacs ×1

python ×1

yacc ×1