c ++ makefile项目如何创建具有相同basename加后缀和相同扩展名的文件列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c ++ makefile项目如何创建具有相同basename加后缀和相同扩展名的文件列表相关的知识,希望对你有一定的参考价值。
对不起,如果标题错误引导,我不能说得对。
基本上我使用RTI DDS生成器来获取* .idl文件并生成* .cxx和* .h文件。
所以这一代正在发挥作用,但我正在尝试添加清除所有生成文件的规则。
从单个* .idl文件中,我得到以下生成的文件:
在test.idl
上运行rtiddsgenerate产量:
test.cxx
test.h
testPlugin.cxx
testPlugin.h
testSupport.cxx
testSupport.h
所以我需要一个干净的规则来删除它们。我开始制作列表,这里是我的伪代码(未经测试,因为我必须将其手工复制到我的电子邮件PC):
# Generate my lists of files
DDS_FILES = $(wildcard *.idl)
DDS_GEN_CXX = (DDS_FILES:.idl=.cxx)
DDS_GEN_H = (DDS_FILES:.idl=.h)
# Main rule - doesn't really do anything for the moment except call the DDS_GEN_CXX rule
run: $(DDS_GEN_CXX)
# rule for generating cxx files:
%.cxx: %.idl
rtiddsgen.bat $<
# Rule to clean
clean:
rm -f $(DDS_GEN_CXX) $(DDS_GEN_H)
所以在这里你可以看到我已经为cxx和h文件制作了文件列表,但是它们只包含与.idl文件同名的文件(即test.cxx和test.h),但不包含带有test.cxx的文件和test.h - 后缀是Plugin
和Support
。
真的有两个问题:1。如何创建更多具有这些额外文件的变量,例如: DDS_GEN_SUPPORT_CXX=?
,DDS_GEN_PLUGIN_CXX=?
,DDS_GEN_SUPPORT_H=?
等... 2.有没有更好/更清晰/更有效的方式在make文件中做同样的事情?
您可以使用$(shell ...)
来获取生成的文件。要获取带有后缀插件和支持的文件,请执行以下操作
GEN_FILES=$(shell ls test* | grep -v '.idl' | grep -E 'Plugin|Support')
你干净的规则看起来像
clean:
rm $(GEN_FILES)
有点偏离主题,但为了使你的Makefile
健壮,它应该使用具有多个输出的规则(仅适用于模式规则):
%.cxx %.h %Plugin.cxx %Plugin.h %Support.cxx %Support.h: %.idl
rtiddsgen.bat $<
以上说rtiddsgen.bat
从输入%.idl
生成5个文件。
不确定你是否已经完全解决了这个问题,但是在一条评论中你说...
可能有任何数量的这些具有任何名称(test1.idl,something.idl等...)所以我不能使用这个规则,因为它站立
您可以使用make的foreach
内置函数来解决这个问题。
# Start with the list of .idl files in the current directory.
#
DDS_FILES := $(wildcard *.idl)
# Strip the .idl extension from the .idl files.
#
DDS_FILES_BASES := $(patsubst %.idl,%,$(DDS_FILES))
# Specify the list of suffixes that will be used by rtiddsgen.bat. Depending on
# the specifics of the problem it may be desirable to split this into multiple
# variables: e.g. one for .h files and one for .cxx files. The principle
# remains the same regardless.
#
DDS_FILES_SUFFIXES := .h .cxx Plugin.h Plugin.cxx Support.h Support.cxx
# idl_generated_files
#
# Simple function/macro which, given the base name of an idl file will generate
# the names of generated files.
#
define idl_generated_files =
$(foreach suffix,$(DDS_FILES_SUFFIXES),$(1)$(suffix))
endef
# Now use idl_generated_files in conjunction with `foreach' to generate the
# names of all files generated by rtiddsgen.bat for all .idl files.
#
DDS_FILES_GENERATED := $(foreach idl_file,$(DDS_FILES_BASES),
$(call idl_generated_files,$(idl_file))
)
# This pattern rule tells make how to build any of the generated files derived
# from a .idl file. We use idl_generated_files with a parameter of `%' to
# create the target patterns for us.
#
$(call idl_generated_files,%): %.idl
rtiddsgen.bat $<
# Rule to clean
clean:
-rm -f $(DDS_FILES_GENERATED)
# Simple target for printing the value of a variable. Useful for testing.
#
print-%:
@printf '[$*] = [$($*)]
'
通过一些简单的测试,我在一个目录中创建了两个文件 - test_a.idl
和test_b.idl
。快速检查生成的文件名会给出...
ps1> make print-DDS_FILES_GENERATED
[DDS_FILES_GENERATED] = [test_b.h test_b.cxx test_bPlugin.h test_bPlugin.cxx test_bSupport.h test_bSupport.cxx test_a.h test_a.cxx test_aPlugin.h test_aPlugin.cxx test_aSupport.h test_aSupport.cxx]
以上是关于c ++ makefile项目如何创建具有相同basename加后缀和相同扩展名的文件列表的主要内容,如果未能解决你的问题,请参考以下文章