2015-06-25 4 views
1

Я следующий файл сборки, с помощью правила, которое проверяет наличие зависимостей:команда эхо в Makefile не печатает

#!/usr/bin/make -f 

dependencies: 
    $(info START-info) 
    @echo "START-echo" 
    $(call assert-command-present,fastqc) 
    $(call assert-command-present,cutadapt) 
    $(call assert-command-present,bowtie2) 
    $(call assert-command-present,samtools) 
    $(call assert-command-present,bedtools) 
    $(call assert-command-present,fetchChromSizes) 
    $(call assert-command-present,bedGraphToBigWig) 
    $(info END-info) 
    @echo "END-echo" 

pipeline: dependencies 

assert-command-present = $(info Checking for $1) && $(if $(shell which $1),$(info OK.),$(error ERROR: could not find '$1'. Exiting)) 

определяемого пользователем функции утверждают, командно-настоящее проверяет команду на пути, и возвращается если он не найден. Когда я запускаю этот файл сборку, команды эха и информации не возвращаются в порядке, я ожидаю:

START-info 
Checking for fastqc 
OK. 
Checking for cutadapt 
OK. 
Checking for bowtie2 
OK. 
Checking for samtools 
OK. 
Checking for bedtools 
OK. 
Checking for fetchChromSizes 
OK. 
Checking for bedGraphToBigWig 
OK. 
END-info 
START-echo 
END-echo 

С-эхо и С-инфо команды должны работать до того, как утверждает,-команду-подарки функция запуска, но Команда echo запускается после вызова функций.

+1

Похоже, 'make' оценивает свои функции' info' и 'warning' раньше, чем вызовы' echo'. –

ответ

2

Eugeniu Rosca является правильным. В более общем плане сначала выполняются «делать» встроенные функции, затем запускается вся последовательность команд.

Один из способов увидеть это, используя GNU make debugger remake. Вы можете остановиться на целевых «зависимостях» и выписать команды, которые будут выполняться в оболочке.

Например:

$ remake -X -f /tmp/Makefile dependencies 
GNU Make 4.1+dbg0.91 
... 
Updating goal targets.... 
-> (/tmp/Makefile:3) 
dependencies: 
remake<0> write 
START-info 
END-info 
File "/tmp/dependencies.sh" written. 
remake<1> 

Посмотрите на файл /tmp/dependencies.sh, и вы увидите все функции Make удалены или расширяемые с каким-либо значением, они вернулись в моем случае было пустых строк.

+0

Как в стороне, как я связал два вызова функций в одну пользовательскую функцию правильно? – jma1991

+1

«Правильно» - очень загруженный термин, и даже без этого я не совсем уверен, какой код вы говорите. Но вы можете сами проверить ситуацию, снова перейдя в римейк цели, которую вы хотите проверить («break * targetname *), а затем используйте команду« expand », чтобы оценить любое выражение, которое вы хотите. – rocky

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