【问题标题】:How to check if a file exists in a makefile如何检查makefile中是否存在文件
【发布时间】:2010-09-19 23:43:46
【问题描述】:

我有一个生成文件模板来编译单个 DLL(用于插件系统)。 用户的 makefile 如下所示:

EXTRA_SRCS=file1 file2
include makefile.in

makefile.in我有:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))

plugin.os 是要编译的主要 C++ 文件。顺便说一句,以.os 结尾的文件是为共享库编译的目标文件(即使用-fpic 选项和gcc

现在,问题是额外的来源可能(但不一定)是头文件。理想情况下,我想将它们添加为目标 plugin.osfile.cpp 的依赖项,但前提是它们存在。

该方法应该适用于 windows 和 linux,或者至少适用于两者。但是,我只使用 GNU 版本的 make。

【问题讨论】:

    标签: file makefile compilation testing gnu-make


    【解决方案1】:

    使用“通配符”功能:

    $(wildcard *.h)
    

    编辑:为了匹配特定列表,请执行

    $(wildcard $(HEADER_FILES))
    

    不需要使用$(filter ...),通配符功能会自动过滤不存在​​的文件。

    【讨论】:

    • 没关系,你不需要使用通配符。使用 $(通配符 $(HEADER_FILES))
    【解决方案2】:

    您没有指定正在使用的编译器,但如果您可以访问 gcc/g++,则可以使用 -MM 选项。

    我所做的是为每个 .c 或 .cpp 文件创建一个扩展名为 .d 的文件,然后“包含”这些 .d 文件。我在我的 Makefile 中使用了类似的东西:

    %.d: %.c
            gcc $(INCS) $(CFLAGS) -MM $< -MF $@
    
    %.d: %.cpp
            g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
    

    然后我像这样创建依赖项:

    C_DEPS=$(C_SRCS:.c=.d)
    CPP_DEPS=$(CPP_SRCS:.cpp=.d)
    DEPS=$(C_DEPS) $(CPP_DEPS)
    

    这个在 Makefile 的底部:

    include $(DEPS)
    

    这是你想要的那种行为吗?这种方法的美妙之处在于,即使您使用非 GNU 编译器进行实际编译,GNU 编译器也能很好地计算依赖关系。

    【讨论】:

      【解决方案3】:

      简单吗

      $(filter $(wildcard *.h),$(HEADER_FILES))
      

      做你想做的事?

      【讨论】:

      • mmhh .. 我不知道这个过滤器命令!它有什么作用?
      • 阅读 Make 的文档(信息页,而不是手册页):$(filter PATTERNS,TEXT) 是 TEXT 中至少匹配一个 PATTERNS 的单词。 (PATTERN 是制作文件模式,而不是正则表达式,因此纯文件名必须完全匹配。)
      猜你喜欢
      • 1970-01-01
      • 2019-09-02
      • 2011-07-30
      • 2016-02-10
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多