【发布时间】:2011-04-04 08:26:08
【问题描述】:
有没有人知道通过扫描目录中的源文件来生成 makefile 的工具?
可能太天真了:
- 无需检测外部依赖项
- 使用默认编译器/链接器设置
【问题讨论】:
有没有人知道通过扫描目录中的源文件来生成 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 才能工作)。
(请注意,我对Makefileish 不流利,所以也许这可以更容易完成。)
【讨论】:
wildcard函数不能用于递归搜索文件。
CMake 会做到这一点,它甚至会创建 makefile 和 Visual Studio 项目。 http://www.cmake.org/
您需要做的就是创建一个包含以下行的 CMakeLists.txt 文件:
file(GLOB sources *.h *.c *.cxx *.cpp *.hxx)
add_executable(Foo ${sources})
然后进入一个干净的目录并输入:
cmake /path/to/project/
这将在干净的构建目录上创建 makefile。
【讨论】:
这是我将用于一个简单项目的内容:
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(我放 main 的地方)。
【讨论】:
有一个非常古老的脚本叫做'makedepend',它用来制作非常简单的makefile。从那以后,我几乎所有东西都改用 cmake。
这是 wiki 文章 http://en.wikipedia.org/wiki/Makedepend,请注意底部的替代列表,包括 automake 中的 depcomp 和 gcc 中的 -M 标志。
编辑:正如有人在另一个问题中向我指出的那样,gcc -MM *.cpp > Makefile 产生了一个相当不错的简单生成文件。您只需在前面添加 CPPFLAGS 和构建整个二进制文件的规则......它将采用以下形式:
CPPFLAGS=-Wall
LDFLAGS=-lm
all: binary_name
binary_name: foo.o bar.o baz.o biff.o
【讨论】:
makedepend 只是生成依赖项,而不是生成文件的规则。
- 无需检测外部依赖项
- 使用默认编译器/链接器设置
那么为什么要编写脚本呢?前提是您所有的项目源文件都是*.cpp 并且在当前目录中:
all: $(notdir $(CURDIR))
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp))
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile 会将所有具有默认编译器/链接器设置的源文件构建到以当前目录名称命名的可执行文件中。
否则,我通常建议人们尝试SCons,而不是在更简单和直观的地方使用make。额外的好处是不需要手动编码clean 目标,源/头依赖检查是内置的,它是本机递归并支持正确的库。
【讨论】:
如链接的discussion 中所述,HWUT 是一种工具 可以生成漂亮的 Makefile,搜索依赖项并在您告诉它的目录中包含文件。在 Windows 上,您需要安装 MinGW 和 Ctags。在 Linux 下 gcc 和 ctags 很可能存在。它是开源的,可以免费使用。
特别是,当为某些内聚性较差的大型项目的一些已经存在的模块生成单元测试时,此功能很容易为您节省数小时甚至数天的时间。
【讨论】: