有没有一种工具可以通过扫描目录中的源文件生成makefile?
这可能有点幼稚:
- 不需要检测外部依赖关系
- 使用默认的编译器/链接器设置
你可以编写一个 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
不是很熟悉,也许有更简单的方法可以实现。)
file(GLOB sources *.h *.c *.cxx *.cpp *.hxx)
add_executable(Foo ${sources})
接下来进入一个空白目录并键入:
cmake /path/to/project/
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)
有一个非常古老的脚本叫做“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
makedepend
只是生成依赖关系,而不是构建文件的规则。 - mtvec
- 无需检测外部依赖项
- 使用默认的编译器/链接器设置
那么为什么要脚本呢?只要您的项目源文件都是 *.cpp
并且在当前目录中:
all: $(notdir $(CURDIR))
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp))
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile 会使用默认的编译器 / 链接程序设置将所有源文件构建为一个可执行文件,并以当前目录的名称命名。
否则,我通常建议人们尝试 SCons 而不是 Make ,其中 SCons 更简单直观。额外的好处是无需手动编写“clean”目标,源/头依赖性检查已内置在其中,它本质上是递归的并且支持正确的库。
如链接讨论所述,HWUT是一款工具,可以生成漂亮的Makefiles,并在您指定的目录中搜索依赖项和包含文件。在Windows上,您需要安装MinGW和Ctags。在Linux下,gcc和ctags可能已经存在。它是开源和免费使用的。
特别是在为一些已经存在于某个较大项目中的模块生成单元测试时,这些功能可以轻松地为您节省数小时甚至数天的时间,尤其是当该项目具有不良内聚性时。
通配符
函数不能用于递归搜索文件。 - mtvec