4

我是 Automake 的新手,我试图在不链接的情况下进行编译。我的目标是使用 Automake 生成一个简单的 Makefile,如下所示。

CFLAG = -Wall

build: Thread.o

Thread.o: Thread.cc Thread.h
    g++ $(CFLAG) -c Thread.cc

clean:
    rm -f *.o

到目前为止,我的尝试将我带到了以下 Makefile.ac。

noinst_PROGRAMS = thread

thread_SOURCES = Thread.cc

EXTRA_DIST= Thread.h

如何模拟我的原始 Makefile?

4

4 回答 4

3

一种方法是通过提供不链接的链接命令来欺骗 Automake:

thread_LINK = true

除此之外,如果 Automake 没有这样的功能,我不会感到惊讶。

于 2009-06-12T05:31:38.160 回答
2

Automake is not designed to produce object. It will build either programs or libraries. It's hard to answer your question without knowing why you'd want to compile a single object file and not something else. Maybe there is a cleaner answer to your "real" problem.

A Makefile.am you could write is

noinst_LIBRARIES = libThread.a
libThread_a_SOURCES = Thread.cc Thread.h   # No need to put headers in EXTRA_DIST

The resulting Makefile would build a library libThread.a containing only libThread.o, ans because *.a libraries are just a collection of object files there is no linking involved. The above Makefile.am also causes the emitted Makefile to contain rules to compile libThread.o, so you can add a build: rule if you like.

If you really want Automake to emit this compile rule, but not build the library, you could go with

EXTRA_LIBRARIES = libThread.a  # EXTRA here means "output build rules but don't
                               # build unless something depends on it".
libThread_a_SOURCES = Thread.cc Thread.h
build: Thread.$(OBJEXT)

Now you are explicitely requiring the file Thread.$(OBJEXT) to be built only when you type make build, as in your original Makefile.

(Automake uses .$(OBJEXT) rather than .o to support extensions like .obj in DOS variants.)

于 2009-06-15T16:33:10.900 回答
2

对于您的示例,您可以只要求 Automake 直接构建您的.o文件,例如

$ make Thread.o

我相信这是一个隐含的规则,所以你不会在输出 Makefile 中看到它。

通常,Automake 生成的变量包含每个可执行文件或库目标所需的所有对象。在您的 中使用它们非常简单Makefile,因为它只是通过将 _OBJECTS 附加到目标名称来生成它们的名称。您可以像这样制作自己的目标Makefile.am

build-thread: $(thread_OBJECTS)

然后你可以像这样构建 Thread.o (以及所需的任何其他对象thread):

$ make build-thread

或者,如果您有多个目标foobarbaz,您可以像这样使您的仅编译目标Makefile.am

build: $(foo_OBJECTS) $(bar_OBJECTS) $(baz_OBJECTS)

这里唯一的痛苦是您需要根据Makefile.am. 您可以像这样在命令行中调用它:

$ make build
于 2009-06-12T17:39:10.423 回答
0

首先,automake 是一个自动制作 Makefile 的工具;make 本身就是一个完全不同的野兽(我很确定您正在寻找的是一个 make 解决方案)。

这是完成您想要的最简单的基于 GNU 的 Makefile:

all: Thread.o

这会填充一些内容(默认情况下),如下所示(请将 4 空格空格更改为硬制表符):

all: Thread.o

Thread.o: Thread.cc
     $(COMPILE.cpp) $(OUTPUT_OPTION) $<

COMPILE.cpp 和 OUTPUT_OPTION 宏当然默认扩展为 GNU 生成指定值并且不可移植;尽管根据 pmake(1) 的联机帮助页,$< 是 AT&T Make 标准语法。

GNU make 有一个可以使用的隐式与显式规则、模式、后缀等的概念,但这并不适用于所有版本的 make,因此这就是为什么所有 Makefile 都以目标和变量的形式明确说明为POSIX 没有描述如何编写 Makefile 所需的许多场景。

运行 gmake -p 以获取更多详细信息,并查看 gmake 的 texinfo 手册,主题为隐式、显式规则、模式、后缀等。

于 2010-06-09T22:55:00.753 回答