【发布时间】:2014-08-03 18:33:54
【问题描述】:
我正在尝试使用 autotools(autoconf、automake、libtool)作为构建系统来创建一个库。该库必须是可交叉编译的,但构建它的步骤之一是在整个过程中通过从源构建的可执行文件生成源。
问题是我不能使用 automake 的系统来构建中间二进制文件,因为当它交叉编译时,它不会在“--build”上运行来生成源代码。
解决这个问题的一种方法是创建单独的 autools 项目来构建中间二进制文件,但我想避免它,因为中间可执行文件和最终库有很多头文件和其他“数据”文件,所以我想保留它一个地方,除了那些中间二进制文件应该是“noinst”。
有没有其他方法可以让它正常工作并保持可移植性?我尝试使用ax_prog_cxx_for_build,但在交叉编译时找不到--build的EXEEXT。
这是一个问题示例,只是为了说明我的问题:
配置.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.68])
AC_INIT([libfoobar], [0.1.0], [<NOBUGS>])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
AC_CONFIG_SRCDIR([src/bar.cpp])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_FILES([Makefile
src/Makefile])
# Checks for programs.
AC_PROG_CXX
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
Makefile.am
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src
src/Makefile.am
bin_PROGRAMS = bar
lib_LTLIBRARIES = libfoo.la
noinst_bar_SOURCES = bar.cpp
libfoo_la_SOURCES = foo.cpp
nodist_libfoo_la_SOURCES = foobar.h
BUILT_SOURCES: foobar.h
foobar.h: bar$(EXEEXT) Makefile
./$< >$@
CLEANFILES = foobar.h
src/foo.cpp
#include "foobar.h"
extern "C" int foo() {
return foobar_value;
}
src/bar.cpp
#include <iostream>
int main() {
std::cout << "#ifndef FOOBAR_H" << std::endl;
std::cout << "#define FOOBAR_H" << std::endl;
std::cout << std::endl;
std::cout << "static const int foobar_value = 0xdeadbeef;" << std::endl;
std::cout << std::endl;
std::cout << "#endif" << std::endl;
}
【问题讨论】:
标签: cross-compiling gnu autotools autoconf automake