Условное выполнение в Makefile

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

GEN_C_FILES: GEN_C_FLS
    $(shell  cat $(DESIGN_TOP).c.tmp c_template.c.tmp > $(DESIGN_TOP).c ) 


$(DESIGN_TOP).c: 
    $(MAKE) GEN_C_FILES
    @(echo $(DESIGN_TOP).c created and modify it to suit the design before running COMPILE)
    exit 1

COMPILE: $(DESIGN_TOP).c
    @(echo bsub -I compile_script-batch $(DESIGN_TOP).c -log $(DESIGN_TOP).log)
    @(bsub -I compile_script -batch $(DESIGN_TOP).c -log $(DESIGN_TOP).log)

Я могу выполнить то, что хочу, но при выходе появляется сообщение об ошибке. Я хочу, чтобы он завершился, если выполняется рецепт $ (DESIGN_TOP) .c, но если рецепт не выполняется, файл существует, поэтому его не нужно создавать, а остальная часть цели COMPILE должна завершиться путем запуска компиляции на bsub. Есть ли лучший способ сделать это без генерации ошибки при выходе? Спасибо


person user9906612    schedule 12.06.2020    source источник


Ответы (1)


Вы не можете заставить его работать так, как хотите, при запуске make COMPILE. Единственный способ заставить make остановиться в середине процесса сборки и не продолжать дальше - это потерпеть неудачу. Но вместо этого вы можете изменить то, что make хочет построить в первую очередь, например:

GOAL = $(if $(wildcard $(DESIGN_TOP).c),COMPILE,$(DESIGN_TOP).c)

all: $(GOAL)

$(DESIGN_TOP).c:
        cat $(DESIGN_TOP).c.tmp c_template.c.tmp > $@
        @echo $@ created and modify it to suit the design

COMPILE: $(DESIGN_TOP).c
        bsub -I compile_script -batch $< -log $(DESIGN_TOP).log

Теперь, если вы запустите make или make all, а исходный файл не существует, предварительным условием для all будет исходный файл и ничего больше, поэтому он будет построен, а затем make остановится.

Если исходный файл существует, то предварительным условием all будет COMPILE, и он будет построен.

person MadScientist    schedule 12.06.2020
comment
Спасибо. Это элегантное решение. - person user9906612; 12.06.2020
comment
Если вас устраивает этот ответ, проверьте его, чтобы другие знали, что на него ответили. - person MadScientist; 14.06.2020