c ++ makefile проект, как я могу создать список файлов с тем же базовым именем плюс суффикс и то же расширение

Извините, если название ошибочно, я не могу сформулировать это совершенно правильно.

В основном я использую генератор RTI DDS для получения файлов * .idl и генерации файлов * .cxx и * .h.

Итак, генерация работает, но я пытаюсь добавить правило, которое очищает все сгенерированные файлы.

Из одного * .idl файла я получаю следующие сгенерированные файлы:

работает rtiddsgenerate на test.idl выходы:

test.cxx
test.h
testPlugin.cxx
testPlugin.h
testSupport.cxx
testSupport.h

Поэтому мне нужно чистое правило, чтобы удалить их. Я начал создавать списки, вот псевдокод, который у меня есть (не проверенный, потому что я должен вручную скопировать его на мой почтовый ПК):

# 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-файлах?

0

Решение

Вы можете использовать $(shell ...) чтобы получить сгенерированные файлы. Чтобы получить файлы с суффиксом Plugin и Support, сделайте следующее

GEN_FILES=$(shell ls test* | grep -v '\.idl' | grep -E 'Plugin|Support')

Ваше чистое правило будет выглядеть

clean:
rm $(GEN_FILES)
2

Другие решения

Немного не по теме, но чтобы ваш Makefile Надежный, он должен использовать правило с несколькими выходами (возможно только с шаблонными правилами):

%.cxx %.h %Plugin.cxx %Plugin.h %Support.cxx %Support.h: %.idl
rtiddsgen.bat $<

Выше сказано, что rtiddsgen.bat генерирует 5 файлов из входа %.idl,

1

Не уверен, что вы уже решили это полностью, но в одном комментарии вы заявляете …

может быть любое число с любым именем (test1.idl,
что-то .idl и т. д.), поэтому я не могу использовать это правило в его нынешнем виде

Вы, вероятно, можете решить эту проблему с помощью make’s 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 '[$*] = [$($*)]\n'

Путем простого тестирования я создал два файла в каталоге: test_a.idl а также test_b.idl, Быстрая проверка сгенерированных имен файлов дает …

ps1> сделать печать-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]
0
По вопросам рекламы [email protected]