2015-08-10 2 views
0

Я объявил переменную в файле макияжем, как this-Как определить глобальную переменную в Makefile

var_COVERAGE_FLAGS?= 

Я присвоенного значение переменной в целевой называется охват

coverage:var_COVERAGE_FLAGS = -MDevel::Cover=-silent,on,+select,/home/scratch.ataur_gpu/run_steps/client/dev1/dev/inf/run/mainline/lib,+ignore,^\\w+ 
coverage:var_COVERAGE_POST=2>&1 | grep -v "Can't"; 
coverage:var_COVERAGE_PRE = @echo "Running coverage for [email protected]"; 
coverage:clean_coverage 
    $(call run_with_perl,$*) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST) 
    @echo "$*" 
    @echo "$(var_COVERAGE_FLAGS)" 
    @echo "=====================" 
    $(exec_COVER) 

Я определил

define run_with_perl 
$(PERL_RUNNER) $1 $(TEST_ARGS) 
endef 

и переменная PERL_RUNNER определен ниже

PERL_RUNNER        := $(exec_PERL) $(PERL_ARGS) $(env_PERLINCLUDE) $(var_COVERAGE_FLAGS) 

и остальная часть переменной правильно Определена вопрос всякий раз, когда я звоню run_with_perl значение $(var_COVERAGE_FLAGS) сбрасывается на нуль или вы можете сказать, что это Target Specific Variable. Так как я могу сделать это глобальной переменной?

+0

Присвоить значения требуемой переменной после покрытия «**»: clean_coverage ** «без» ** охвата: **. –

+0

Как назначить значения? Посмотрите здесь: http://stackoverflow.com/a/1909390/2706918 –

ответ

1

Все переменные в make, которые не являются целевыми, являются «глобальными». Поэтому, если вам нужна глобальная переменная, вы просто удалите целевую часть (например, coverage:) и установите переменную без нее.

Однако вам действительно не нужно это делать. Ваша проблема в том, что вы используете простое назначение для PERL_RUNNER. Это означает, что правая часть задания разворачивается сразу по мере анализа файла makefile. Это происходит за пределами любого целевого контекста, поэтому целевое значение не доступно.

Если изменить назначение PERL_RUNNER использовать = вместо := тогда ваша проблема исчезнет без необходимости менять что-либо другое (использовать глобальные переменные):

PERL_RUNNER = $(exec_PERL) $(PERL_ARGS) $(env_PERLINCLUDE) $(var_COVERAGE_FLAGS) 

Теперь расширение с левой стороны будет отложено до тех пор, пока не будет использована переменная, внутри рецепта coverage, где целевые переменные находятся в области видимости.

Однако я даже не знаю, почему вы добавляете это здесь. Вы уже добавили это как часть рецепта, на самом деле это правильный способ сделать это, а не добавлять вещи в PERL_RUNNER. Этот рецепт линия:

$(call run_with_perl,$*) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST) 

расширяет это:

$(PERL_RUNNER) $* $(TEST_ARGS) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST) 

, которая расширяется к этому:

$(exec_PERL) $(PERL_ARGS) $(env_PERLINCLUDE) $(var_COVERAGE_FLAGS) $* $(TEST_ARGS) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST) 

Вы можете увидеть var_COVERAGE_FLAGS уже есть. Это просто потому, что флаги вышли из строя? Вы можете изменить порядок, изменив аргументы на функцию call; например:

$(call run_with_perl,$(var_COVERAGE_FLAGS) $*) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST) 

наведет в правильном порядке, и это гораздо лучшее решение, чем пытаться добавить целевые специфические флаги общей переменной как PERL_RUNNER; что, если вы хотите использовать PERL_RUNNER в другой цели в дополнение к цели coverage?

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