Я уверен, что это совершенно нормальная вещь, но я не могу понять, как заставить make сделать это.
У меня есть компилятор, который генерирует зависимости make обычной формы:
M/A.o : M/A.hs
M/B.o : M/A.o
Поэтому я пишу правило для компиляции% .hs в% .o, добавляю правило для связывания двоичного файла, включаю файл зависимостей, и все хорошо.Но я хочу иметь несколько бинарных целей с разными флагами.Например, я хочу собрать / протестировать с помощью -DTESTING и построить / профиль с помощью -prof.Поэтому мне нужно хранить файлы .o в отдельном дереве, где они будут компилироваться со специальными флагами.
Простой способ, которым я могу придумать, - это иметь зависимости, которые выглядят примерно так:
build/test/M/A.o : M/A.hs
build/test/M/B.o : build/test/M/A.o
build/profile/M/A.o : M/A.hs
... etc.
И затем правила так, что% .hs для сборки / test /%. O компилируется с -DTESTING и т. Д. Я думаю, что это будет работать, но это неуклюже, означает предварительную обработку файла deps, чтобы добавить все эти сборки /независимо от префикса и преумножения его размера на сколько угодно типов.
VPATH, похоже, предназначен для такого рода вещей, и моя идея заключалась в том, чтобы я мог установить флаги VPATH и компилятора в зависимости от цели, и это почти работает, но:
%.o: %.hs
@mkdir -p build/M
cp $< build/$@
VPATH = build
main: M/A.o M/B.o
cat $^ >$@
M/A.o : M/A.hs
M/B.o : M/B.hs
Первый раз, когда главная цель хочет запустить 'cat M / Ao M / Bo> main', что, кажется, противоречит документации GNU Make, в которой написано, что $ ^включите каталог VPATH, в котором была найдена зависимость.Любопытно, что если я удаляю «main» и делаю снова, на этот раз он использует правильный путь.Это GNU make, 3.81.
Что здесь происходит?Есть ли лучший способ построить с разными флагами?VPATH кажется неуклюжим инструментом, наверняка есть лучший способ?