У меня есть Makefile со следующей строкой:
$(CXX) $(CXXFLAGS) $(INCL) -c -o $@ 'test -f '$<' || echo '$(SRCDIR)/''$<
Можете ли вы объяснить мне, что делает эта линия?
Примечание. Файл Makefile взят отсюда: https://projects.coin-or.org/BuildTools/wiki/user-examples
Эта страница определяет это:
Общие правила компиляции (например,.co) могут выглядеть несколько сложными. Но при этом Makefile также может использоваться людьми, которые работают с компиляторами MS (например, cl) под Cygwin, поскольку эти компиляторы не понимают пути каталога типа UNIX. В таком случае CYGPATH_W будет настроен на "cygpath -w" по настройке, иначе это будет просто "эхо".
Я не собираюсь работать с компиляторами MS.
test -f
- это Unix-ism, который вернет true, если указанный файл существует, а false - если нет. "$ <" - это исходный файл правила make. Итак, test -f '$<' || echo '$(SRCDIR)/'
test -f '$<' || echo '$(SRCDIR)/'
будет проверять наличие исходного файла, а если он не существует, будет эхо $(SRCDIR)/
за ним следует имя файла. Это будет вход для фактического компилятора.
Это в основном говорит: "Если файл X существует в локальном каталоге, тогда скомпилируйте его. В противном случае (это то, что делает ||
), скомпилируйте файл X, расположенный в каталоге $(SRCDIR)
". Таким образом, вы можете поместить весь ваш источник в подкаталог, а затем переопределить определенные файлы, поместив новые копии в тот же каталог, что и Makefile.
$(CXX) $(CXXFLAGS) $(INCL) -c -o $@ '$<'
.