Вы хотите разрешить два различных действия: создание файла xml из внутреннего файла и создание внутреннего файла из файла xml. Поскольку Make знает только времена модификации, она знает, какая цель старше, но не знает, нужно ли ее переделывать. Поэтому вставьте другой файл в качестве флага, чтобы записать, когда было выполнено последнее действие, и сделайте это своей основной целью; если какая-либо цель новее, чем флаг, она была изменена чем-то иным, чем эти действия, и make должна перестроить более старую цель (а затем коснуться флага).
Есть несколько способов реализовать это. В некоторых версиях Make (например, в последних версиях GNUMake) вы можете написать правила с двойным двоеточием, чтобы Make по-разному перестраивала цель, в зависимости от того, какой preq ее вызвал:
%.flag:: %.internal
# convert $*.internal to $*.xml
touch $@
%.flag:: %.xml
# rewrite $*.internal based on $*.xml
touch $@
Менее элегантный, но более портативный способ - смотреть на $? и перестройте файл other :
%.flag: %.xml %.internal
ifeq ($?,$*.internal)
# convert $*.internal to $*.xml
else
# rewrite $*.internal based on $*.xml
endif
touch $@