代码之家  ›  专栏  ›  技术社区  ›  PierreBdR

如何检查makefile中是否存在文件

  •  13
  • PierreBdR  · 技术社区  · 17 年前

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

    EXTRA_SRCS=file1 file2
    include makefile.in
    

    makefile.in 我有:

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

    在哪里? plugin.os 是编译的主要C++文件。顺便说一句,文件结尾是 .os 是否为共享库编译对象文件(即使用 -fpic 选项与 gcc )

    现在,问题是额外的源可能(但不一定)是头文件。理想情况下,我希望添加它们作为目标的依赖项 插件 以及 file.cpp ,但前提是它们存在。

    该方法应该适用于Windows和Linux,或者至少适用于每种方法。但是,我只使用make的GNU版本。

    3 回复  |  直到 17 年前
        1
  •  18
  •   JesperE    17 年前

    使用“通配符”功能:

    $(wildcard *.h)
    

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

    $(wildcard $(HEADER_FILES))
    

    不需要使用$(filter…),通配符函数会自动筛选不存在的文件。

        2
  •  4
  •   m0j0    17 年前

    您没有指定要使用的编译器,但是如果您有权访问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
  •  2
  •   ephemient    17 年前

    简单吗

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

    做你想做的?