标签: autotools

“HOSTCC”和 ./configure --host 中“主机”一词的含义是什么?

假设我有某个程序的源代码,该源代码使用 GNU 自动工具,为了简单起见,假设该程序绝不是任何类型的开发工具。如果我有一个方便的交叉工具链,我可以使用以下选项configure为平台进行交叉编译:fooproc-barvendor-bazos--host

./configure --host=fooproc-barvendor-bazos
Run Code Online (Sandbox Code Playgroud)

然而,在包括 Linux 2.6 在内的各种源代码构建所采用的安静(呃)输出风格中,

HOSTCC foo.c
Run Code Online (Sandbox Code Playgroud)

意味着 foo.c 是使用我正在构建的系统的本机编译器构建的,以区别于

CC bar.c
Run Code Online (Sandbox Code Playgroud)

这意味着 bar.c 正在使用交叉编译器为我正在为其构建程序的系统构建。

我是否在某个地方感到困惑,或者“主机”是否HOSTCC只是意味着“主机”意义上的主机./configure --host

autotools configure cross-compiling

2
推荐指数
1
解决办法
5801
查看次数

通过automake检查make中的环境变量

有没有办法让条件通过 automake,以便稍后将其传递到生成的 Makefile.in 和 Makefile?

我检查 JAVA_HOME 是否在 Makefile 的环境中定义

ifeq (undefined,$(origin JAVA_HOME))
#CALL with defaults
else
#CALL according to the variable
endif
Run Code Online (Sandbox Code Playgroud)

但是当我使用 automake 在 Makefile.am 中处理这个问题时,出现两个错误:

else without if
endif without if
Run Code Online (Sandbox Code Playgroud)

看起来 automake 没有消化 ifeq。有没有办法通过它传递这个(如果这样做有意义的话),或者是否有另一种自动工具友好的方式来获得相同的结果?

这个想法还允许在运行 make 之前设置/更改变量,以轻松针对不同的 JDK。

automake makefile autotools environment-variables

2
推荐指数
1
解决办法
3157
查看次数

使用 mingw-w64 和 autotools 编译 Windows

我有一个名为librsync 的项目。安装了名为mingw-w64的 ubuntu 软件包。看了 automake手册页

我想做的是构建在 Windows 或 Windows 上运行的可执行文件dll,无论我可以工作。

./configure --host "what do i put here?"

通过查看 ubuntu 软件包我无法弄清楚。来自 automake 手册页 - 如果我有的mingw32话应该是i586-mingw32msvc. 但我首先要如何自己解决这个问题呢?至少,hosts如果我有 mingw-w64,我应该在参数中输入什么?

c mingw autotools cross-compiling mingw-w64

2
推荐指数
1
解决办法
4077
查看次数

Autotools - libtool:链接:MacOS 上的 -rpath 和 @executable_path

我正在尝试在 MacOS 上使用 Autotools 构建一个框架。该框架包含一个库(我们称之为 libmytools.dylib)和一个使用该库的可执行文件。我想要的是在运行时动态链接这个库。

可执行文件通常安装到/Library/Frameworks/mytools.Framework/Versions/Current/Commands/mytools 库通常安装到 /Library/Frameworks/mytools.Framework/Versions/Current/Libraries/libmytools.dylib

如果框架安装在该位置,一切正常,但是当框架未安装在计算机上而是仅嵌入到另一个项目中时,则无法找到该库。

我需要的是所谓的“Runpath Dependent Library”,如下所述: https ://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html

所以我所做的就是添加mytools_LDFLAGS = -rpath @executable_path/../Libraries到 makefile 中。

但不幸的是 libtool 拒绝将我的可执行文件与动态 -rpath 链接并显示以下错误:libtool: link: only absolute run-paths are allowed.

我也尝试过mytools_LDFLAGS = -dynamic -rpath @executable_path/../Libraries,但结果是一样的......

我究竟做错了什么??

macos autotools rpath libtool

2
推荐指数
1
解决办法
1221
查看次数

使用 autotools 安装 systemd 服务

我有一个 autotools 项目,它成功地构建和测试了一个应用程序(https://github.com/goglecm/AutoBrightnessCam)。该应用程序安装在 bin 目录中(以用户指定的任何前缀开头)。这很简单。我现在需要创建一个 systemd 服务以在启动时启动它。我已经创建了服务文件并手动运行它,它工作正常。

最后一点是告诉 configure.ac 和 Makefile.am 用正确的应用程序路径修补 *.service.in 文件(就像从 config.h.in 创建 config.h 一样)。

使用 AC_CONFIG_HEADERS 是否适合将 *.service.in 修补到 *.service?是否有另一个用于“非标题”的宏?

另外,我如何指定服务文件应该放在(即安装)在 /etc/systemd/system 中?

在没有 systemd 的情况下,是否有更好的方法在启动时启动这个应用程序?

autotools systemd

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

如何将自动工具配置为仅在安装依赖项时才构建可选组件?

我有一个使用 autotools 作为构建系统的 C++ 项目。

我的程序涉及一个抽象接口,其中有多个实现,每个实现都在单独的源文件中。这些实现取决于可能安装也可能不安装的库,具体取决于用户偏好和平台。

我想配置自动工具来跳过构建缺乏底层依赖项的实现。我想以用户和包维护者通常期望的任何方式来这样做。

举个例子,假设我的程序输出音频,它可以使用OSSALSAJACK来实现。oss_output.cc这些分别在、alsa_output.cc和中实现jack_output.cc

目前我的Makefile.am包含(以及其他一些内容):

myprog_SOURCES = \
    src/oss_output.cc \
    src/alsa_output.cc \
    src/jack_output.cc

myprog_LDFLAGS = [...some other stuff...] -ljack
Run Code Online (Sandbox Code Playgroud)

不幸的是,尝试在未安装 JACK 的系统上构建此程序会失败,因为链接器找不到 libjack 和/或编译器因缺少 JACK 的头文件而失败。如果未安装 JACK,我宁愿src/jack_output.cc从中删除myprog_SOURCES,然后-ljack从 中删除myprog_LDFLAGS。ALSA 和 OSS 也类似。

在这些依赖项(OSS、ALSA 和 JACK)中,其中一些库使用pkg-config. 有些没有,但我仍然可以通过头文件和库的存在来检测它们的存在。

如何使用自动工具来实现这一点,并注意遵循最佳实践和惯例?

autotools

2
推荐指数
1
解决办法
581
查看次数

修改make distclean,使其删除.deps或*~备份文件

make distclean在我的项目上做了一个,认为它真的会删除所有内容,但它留下了一个.deps目录,并留下了我所有的编辑器备份文件。

我想扩充我的“Makefile.am in my project directory so that these are also deleted, but it's not clear to me how to do that. What additional things should I put inMakefile.am”,以便删除以下内容:

.deps/
./autom4te.cache/
*~ (in every directory)
{project-name}-{majorversion}.{minorversion}.{release}. (releases that were attempted to be built)
Run Code Online (Sandbox Code Playgroud)

automake autoconf autotools

2
推荐指数
1
解决办法
1036
查看次数

在哪里放置带有automake的预制二进制文件?

我正在根据有关辅助脚本相关问题部分编写此问题.

我有一个用autotools构建的C++软件系统.对于其功能的一小部分,我的系统使用闭源预构建二进制文件:AMPL.我是他们软件的免费学生版.假设我在C++代码中调用的AMPL二进制文件的名称是ampl-student.我通过system(...)调用在我的代码中运行它.

当运行"make install"时,我想与我编译的C++代码的二进制文件一起ampl-student移动/usr/bin.我应该在Makefile.am中添加哪些内容ampl-student.我应该将它添加到bin_PROGRAMS变量吗?

一个相关的问题是我应该甚至把ampl-student/usr/bin.是否有更适合"辅助二进制"的地方?

我认为这通常是一个坏主意,因为将预先构建的二进制文件与代码一起分发并不能保证二进制文件将在最终用户的计算机上运行.但在这种情况下,用户群非常小,我碰巧知道他们都使用相同的系统配置.因此,我们实际上使用deb软件包来保持每个人都对软件系统的新版本进行更新.

编辑1:我应该强调,问题首先是要求ampl-student在autotools使用的Makefile.am文件中指定的位置.

c++ automake packaging autotools ampl

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

尝试在我的映像中打包符号链接时,yocto构建中出现质量检查问题

我试图在继承自动工具后使用yocto构建我的库。我需要在最终映像中打包“ .so”文件,因为我的应用程序在运行时会动态链接该库。但是我在最终图像中找不到我的.so文件,相反,我可以看到“ .so.0”和“ .so.0.0.0”。因此,我尝试在食谱中添加以下规则。

FILES_SOLIBSDEV = ""
FILES_${PN} += "${libdir}/"
Run Code Online (Sandbox Code Playgroud)

加上这个给我一个错误。

ERROR: QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so:
Run Code Online (Sandbox Code Playgroud)

我可以理解“ .so”文件是符号链接,我无法将它们打包在映像中,因为它们是供开发人员软件包使用的。但是我不知何故需要目标图像中的“ .so”文件。有没有出路?

注意:可以将应用程序源代码修改为采用“ .so.0.0.0”,但这是最不推荐的选择。

linux build autotools embedded-linux yocto

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

Autotools-使用不同的名称构建静态和共享库

在构建静态和共享库的cmake的Windows我不得不追加“-static”的静态库名(在Windows中,静态的共享库可以有.LIB扩展名),所以产生的文件名的静态库LIBlib-static.lib。在任何正在运行的系统上,如何使用automake + libtool(即指示libtool将“ -static ” 附加到生成的静态库文件名之后)来实现它?

linux windows autotools shared-libraries static-libraries

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