Правила шаблона в GNU make не будут учитываться, если их предварительные требования не разрешаются в существующие файлы, либо напрямую, либо рекурсивно через другие правила шаблона[1]:
$ make -f <(echo '%.foo: %.bar file.txt;') a.foo
make: *** No rule to make target 'a.foo'. Stop.
$ touch a.bar
$ make -f <(echo '%.foo: %.bar file.txt;') a.foo
make: *** No rule to make target 'a.foo'. Stop.
$ touch a.bar file.txt
$ make -f <(echo '%.foo: %.bar file.txt;') a.foo
make: 'a.foo' is up to date.
Поскольку ваш макрос TestNeededObjectFile
включает ложные +
s, и у вас, вероятно, нет ни одного файла с таким именем, это нарушит правило $(TestDir)/%.out:
.
[1] согласно руководству GNU make :
In order for the pattern rule to apply, its target pattern must match the file name under consideration and all of its prerequisites (after pattern substitution) must name files that exist or can be made. These files become prerequisites of the target.
Да, ваши рассуждения верны, так как tar не сортирует файлы по расширениям (, что могло бы сильно помочь в достижении более высоких степеней сжатия ), а gzip
— очень старый алгоритм сжатия с относительно скромным словарь, всего 32 КБ.
Попробуйте вместо этого использовать xz
или p7zip
.
Вот строка сжатия, которая позволяет мне добиться максимальной степени сжатия под Linux:
7za a -mx=9 -myx=9 -mfb=273 -bt -slp -mmt4 -md=1536m -mqs archive.7z [list of files]
Для этого требуется тонна памяти (как минимум 32 ГБ ОЗУ ). Если вы удалите -mmmt4
и уменьшите размер словаря до 1024 м, 16 ГБ будет достаточно.
Говоря о сортировке файлов для tar
. Я написал скрипт, который делает именно это несколько лет назад:https://github.com/birdie-github/useful-scripts/blob/master/tar_sorted