简单的Makefile生成工具?

9

有没有一种工具可以通过扫描目录中的源文件生成makefile?

这可能有点幼稚:

  • 不需要检测外部依赖关系
  • 使用默认的编译器/链接器设置
6个回答

11

你可以编写一个 Makefile 来自动完成这个任务:

SOURCES=$(shell find . -name "*.cpp")
OBJECTS=$(SOURCES:%.cpp=%.o)
TARGET=foo

.PHONY: all
all: $(TARGET)

$(TARGET): $(OBJECTS)
        $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

.PHONY: clean
clean:
        rm -f $(TARGET) $(OBJECTS)

只需将此放置在源代码层次结构的根目录中,并运行make(这需要GNU Make工具才能正常工作)。

(请注意,我对Makefile不是很熟悉,也许有更简单的方法可以实现。)


2
还要为查找文件添加通配符功能。 - Martin York
1
为什么不使用标准名称呢?并且标准规则适用于目标,无需进行任何特殊处理。+1 - Martin York
1
@Martin:我认为通配符函数不能用于递归搜索文件。 - mtvec
1
请参见以下链接:https://dev59.com/bnA65IYBdhLWcg3w5y_B#3576355 - Martin York
2
请参见:https://dev59.com/E3E95IYBdhLWcg3wDpgG#2481326,以了解类似Martin链接的简短GNU makefile中正在进行的操作的更详细解释。此外,网站上还有许多其他相当不错的“基本makefile”答案。 - dmckee --- ex-moderator kitten
显示剩余8条评论

7
CMake可以做到这一点,它甚至可以创建makefiles和Visual Studio项目。http://www.cmake.org/ 您只需要创建一个包含以下行的CMakeLists.txt文件即可:
file(GLOB sources *.h *.c *.cxx *.cpp *.hxx)
add_executable(Foo ${sources})

接下来进入一个空白目录并键入:

cmake /path/to/project/

那将在干净的构建目录中创建makefiles。

5
这是我在简单项目中会使用的方法:
CC               = $(CXX)
CXXFLAGS        += -ansi -pedantic -W -Wall -Werror
CPPFLAGS        += -I<Dir Where Boost Lives>


SOURCES          = $(wildcard *.cpp)
OBJECTS          = $(patsubst %.cpp,%.o,$(SOURCES))

all:             myApp
myApp:           $(OBJECTS)

唯一的限制是,如果你正在构建一个名为myApp的可执行文件,那么其中一个源文件应该被命名为myApp.cpp(这就是我放置主函数的地方)。

从一个简单的模板makefile开始不是个坏主意,在我看来。我不知道为什么有人决定给它点踩。 - StackedCrooked
至少对于GNU make,函数是$(wildcard),而不是$(wildcards)。 - Simon Kissane

3

有一个非常古老的脚本叫做“makedepend”,可以制作非常简单的makefile。但我现在几乎所有的东西都已经转向了cmake。

这里是维基百科文章http://en.wikipedia.org/wiki/Makedepend,请注意底部的备选列表,包括automake中的depcomp和gcc中的-M标志。

编辑:正如其他问题中的某个人指出的那样,gcc -MM *.cpp > Makefile会生成一个相当不错的简单makefile。你只需要添加你的CPPFLAGS和一个构建整个二进制文件的规则......它将采取以下形式:

CPPFLAGS=-Wall
LDFLAGS=-lm
all: binary_name
binary_name: foo.o bar.o baz.o biff.o

这个怎么实现了OP想要的功能?据我所知,makedepend只是生成依赖关系,而不是构建文件的规则。 - mtvec
我使用的 makedepend 版本实际上创建了一个可用的 makefile。 - jkerian
99%的时候,隐式规则会处理除最终二进制以外的所有内容。 - jkerian

1
  • 无需检测外部依赖项
  • 使用默认的编译器/链接器设置

那么为什么要脚本呢?只要您的项目源文件都是 *.cpp 并且在当前目录中:

all: $(notdir $(CURDIR))
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp))
        $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

Makefile 会使用默认的编译器 / 链接程序设置将所有源文件构建为一个可执行文件,并以当前目录的名称命名。

否则,我通常建议人们尝试 SCons 而不是 Make ,其中 SCons 更简单直观。额外的好处是无需手动编写“clean”目标,源/头依赖性检查已内置在其中,它本质上是递归的并且支持正确的库。


0

如链接讨论所述,HWUT是一款工具,可以生成漂亮的Makefiles,并在您指定的目录中搜索依赖项和包含文件。在Windows上,您需要安装MinGW和Ctags。在Linux下,gcc和ctags可能已经存在。它是开源和免费使用的。

特别是在为一些已经存在于某个较大项目中的模块生成单元测试时,这些功能可以轻松地为您节省数小时甚至数天的时间,尤其是当该项目具有不良内聚性时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接