2013-12-16 4 views
0

Вот часть из моих makefile:Систематически чистые файлы перед компиляцией

all: $(CMX_DOMAIN) 
     analyze 

clean: 
    rm -rf */*.o */*.cmo */*.cmi */*.cmx */*.cma */*.cmxa */*.cmo */*.cmi */*.annot \ 
     $(AUTOGEN) */*~ */*.log */*.output depend analyze print batch 

После изменения кода, мне нужно набрать make cleanmake перед запуском. В противном случае очень часто возникает проблема несогласованных зависимостей.

Теперь я хотел бы внести поправки в makefile, так что clean делается систематически перед каждым звонком all. Затем я пишу

all: clean 
     $(CMX_DOMAIN) 
     analyze 

Когда я запускаю make, после очистки файлов, он дает мне ошибку /bin/bash: values/consts_bool.cmx: No such file or directory, где values/consts_bool является первым компонентом в списке файлов. Это странно, потому что это нормально, что этот файл не существует, который должен быть сгенерирован впоследствии.

Может ли кто-нибудь помочь?

+1

Вы должны исправлять «проблему несогласованных зависимостей», не пытаясь добавить правило 'clean'. Правильный make-файл всегда будет восстанавливать точно то, что устарело, и не восстанавливать то, что не устарело. Если ваш make-файл не делает этого, то он написан неправильно. Как говорит tripleee, если вы хотите каждый раз чистить все, то makefile совершенно бесполезен для вас. Просто напишите сценарий оболочки, который каждый раз компилирует ваш код с нуля и забывает о том, чтобы сделать вообще. – MadScientist

ответ

1

Вы имеете в виду

all: clean $(CMX_DOMAIN) 

на одной линии.

Я не особо рекомендую это, потому что удаление всех встроенных файлов отрицает основную цель Make. Если вы не хотите хранить файлы, почему вы используете Make?

Как временное исправление, работая над сборкой Infra, возможно, это имеет смысл.

+0

Я не уверен, что работает ... Я думал, что 'clean' удаляет все, что достаточно хорошо ... добавление' $ (CMX_DOMAIN) $ 'в одну строку означает только удаление' .cmx' или удаление evertying, кроме '.cmx' ? – SoftTimur

+0

Нет, это совсем не то, что значит добавить две предпосылки к цели. Это означает, что до того, как цель «все» может считаться актуальной, должны быть созданы как «чистые», так и «$ (CMX_DOMAIN)» цели. Хотя это решение будет отлично работать для серийных сборок, оно будет сильно нарушаться для параллельных сборок. – MadScientist

Смежные вопросы