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 - 后缀是PluginSupport

真的有两个问题: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.idltest_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加后缀和相同扩展名的文件列表的主要内容,如果未能解决你的问题,请参考以下文章

C#如何创建一个具有多个相同命名项目的解决方案?

如何使用子目录中的源代码为 C 和 C++ 创建 makefile

C#如何创建具有多个相同键的字典? [复制]

具有 2 个源目录的 makefile 使包含保护失败

具有共享相同配方的多个规则的 Makefile

如何更改以下LINUX的Makefile,使其也可在MACOS上使用[关闭]