【问题标题】:Simple makefile generation utility?简单的makefile生成实用程序?
【发布时间】:2011-04-04 08:26:08
【问题描述】:

有没有人知道通过扫描目录中的源文件来生成 makefile 的工具?

可能太天真了:

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

【问题讨论】:

    标签: c++ makefile


    【解决方案1】:

    你可以写一个 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 不流利,所以也许这可以更容易完成。)

    【讨论】:

    • 另外make还有查找文件的通配符功能。
    • +1 为什么不使用标准名称。并且标准规则适用于目标,无需做任何特别的事情。
    • @Martin:我认为wildcard函数不能用于递归搜索文件。
    • 并查看:stackoverflow.com/questions/2481269/…,以更详细地解释 Martin 链接到的简短 GNU makefile 中发生的事情。此外,还有许多其他相当不错的“基本 makefile”答案散布在整个网站上。
    【解决方案2】:

    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。

    【讨论】:

      【解决方案3】:

      这是我将用于一个简单项目的内容:

      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 的地方)。

      【讨论】:

      • +1 从一个简单的模板生成文件开始 IMO 并不是一个坏主意。我不知道为什么有人决定对此投反对票。
      • 至少对于 GNU make,函数是 $(wildcard) 而不是 $(wildcards)
      【解决方案4】:

      有一个非常古老的脚本叫做'makedepend',它用来制作非常简单的makefile。从那以后,我几乎所有东西都改用 cmake。

      这是 wiki 文章 http://en.wikipedia.org/wiki/Makedepend,请注意底部的替代列表,包括 automake 中的 depcomp 和 gcc 中的 -M 标志。

      编辑:正如有人在另一个问题中向我指出的那样,gcc -MM *.cpp &gt; Makefile 产生了一个相当不错的简单生成文件。您只需在前面添加 CPPFLAGS 和构建整个二进制文件的规则......它将采用以下形式:

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

      【讨论】:

      • 这如何做 OP 想要的? AFAIK,makedepend 只是生成依赖项,而不是生成文件的规则。
      • 我正在使用的makedepend版本实际上创建了一个功能性的makefile。
      • 99% 的情况下,隐式规则也会处理除最终二进制文件之外的所有内容。
      【解决方案5】:
      • 无需检测外部依赖项
      • 使用默认编译器/链接器设置

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

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

      Makefile 会将所有具有默认编译器/链接器设置的源文件构建到以当前目录名称命名的可执行文件中。

      否则,我通常建议人们尝试SCons,而不是在更简单和直观的地方使用make。额外的好处是不需要手动编码clean 目标,源/头依赖检查是内置的,它是本机递归并支持正确的库。

      【讨论】:

        【解决方案6】:

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

        特别是,当为某些内聚性较差的大型项目的一些已经存在的模块生成单元测试时,此功能很容易为您节省数小时甚至数天的时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多