Обновление цели при изменении переданной переменной - PullRequest
1 голос
/ 12 октября 2011

Мой make-файл:

ifndef VEC_LEN
        VEC_LEN = 1
endif

my_target: a.c
        gcc a.c -DVEC_LEN=$(VEC_LEN)

Есть ли способ сказать, что my_target должен обновляться , когда VEC_LEN меняет ?

Обновление:

Мои сценарии теперь выглядят так (и они работают): Makefile

SHELL := /bin/bash

# Define the answer if not defined yet
ANSWERTOLIFETHEUNIVERSEANDEVERYTHING ?= 42

# Update the header file if the answer has changed
# := always executes the shell command, = does not! Quote from http://www.gnu.org/software/make/manual/make.html:
#      immediate = deferred
#      immediate := immediate
DUMMY := $(shell ./updateAnswer.sh $(ANSWERTOLIFETHEUNIVERSEANDEVERYTHING) >logMakefile.txt)

answer : answer.h 
    echo "Updated!"
    touch answer

updateAnswer.sh

#!/bin/bash

# Check if the definition of the answer has changed in the header file
# If yes, re-write it. If not, do not touch it to avoid an updated timestamp.
if grep -q "ANSWER ${1}" answer.h
then
    echo "ANSWER unchanged, is still ${1}."
else
    echo "#define ANSWER ${1}" >answer.h
    echo 'Answer has changed:'
    cat answer.h
fi

Пример вывода:

simon@x220:~$ make
echo "Updated!"
Updated!
touch answer
simon@x220:~$ make
make: `answer' is up to date.
simon@x220:~$ make ANSWERTOLIFETHEUNIVERSEANDEVERYTHING=3
echo "Updated!"
Updated!
touch answer
simon@x220:~$ make ANSWERTOLIFETHEUNIVERSEANDEVERYTHING=3
make: `answer' is up to date.

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Я думаю, что это будет сделано в make-файле:

-include old_vec_len

VEC_LEN ?= 1

ifneq ($(VEC_LEN),$(OLD_VEC_LEN))
target: marker
endif

target:
    @echo run_script_to_make_target with VEC_LEN=$(VEC_LEN)

.PHONY:marker
marker:
    @echo OLD_VEC_LEN=$(VEC_LEN) > old_vec_len
1 голос
/ 12 октября 2011

Предполагая, что язык C, Я думаю, что самый простой способ, вероятно, это:

  1. Готовит vec_len.h, в котором есть строка #define VEC_LEN 1
  2. Добавляет #include "vec_len.h" в a.c
  3. Если значение VEC_LEN необходимо обновить, переписать vec_len.h
  4. Сборки с использованием обычной .c зависимости файла и заголовочного файла

EDIT
Хотя это немного наивно, работает ли следующее изменение в вашем ситуация

Готовит скрипт (define.sh), как показано ниже:

#!/usr/bin/bash
echo '#define VEC_LEN' $1 > vec_len.h

И добавляет следующие строки в начале make-файла:

VEC_LEN ?= 1
DUMMY := $(shell define.sh $(VEC_LEN))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...