制作目标和依赖项名称格式

时间:2012-01-28 21:36:49

标签: c++ makefile gnu-make

你可以看到第一个问题here,它已经解决了,Eldar Abusalimov。现在我需要为uic.exe调用放置正确的目标和依赖项。 代码的开头是:

ui_files := $(wildcard $(SUBDIRS:%=%/*.ui))
ui_headers := $(foreach ui_files,$(ui_files),$(dir $(ui_files))ui_$(notdir $(ui_files:.ui=.h)))
ui_cpp := $(patsubst %.h, %.cpp, $(ui_headers))

首先,我需要做的是通过此代码生成标题:

<directory/ui_<ui_file_name>.h>: <ui_file_path>
    $(QT_BIN)/uic -o $@ $< 

其次,我生成了cpps:

<directory/ui_<ui_file_name>.cpp>: <ui_file_path> <header_file_path>
$(QT_BIN)/uic -i <header_file_path> -o <target> <ui_file_path>

请帮助我,通过make语法填充这个非make语法或给我一个合适的方法。

感谢。

1 个答案:

答案 0 :(得分:1)

我想它应该是这样的(但是,我不确定,Make将如何处理文件的目录部分):

$(ui_headers) : ui_%.h : %.ui
    $(QT_BIN)/uic -o $@ $< 

$(ui_cpp) : %.cpp : %.ui ui_%.h
    $(QT_BIN)/uic -i $(word 2,$^) -o $@ $<

这两条规则都是static pattern规则。

UPD。

静态模式规则在这里并不好,因为模式应用于整个文件名(带路径)。相反,应该使用常规pattern rules

ui_%.h : %.ui
    $(QT_BIN)/uic -o $@ $< 

%.cpp : %.ui ui_%.h
    $(QT_BIN)/uic -i $(word 2,$^) -o $@ $<

How Patterns Match章解释了它是如何运作的:

  

当目标模式不包含斜杠(通常不包含斜杠)时,文件名中的目录名将从文件名中删除,然后再与目标前缀和后缀进行比较。在将文件名与目标模式进行比较之后,目录名以及结束它们的斜杠将添加到从模式规则的先决条件模式和文件名生成的先决条件文件名中。仅为了查找要使用的隐式规则而忽略目录,而不是在该规则的应用程序中。