2013-09-30 2 views
0

Я хочу, чтобы другая версия чистой цели запускалась в зависимости от того, запущены ли в файле make make dev или make prod.Как вы условно вызываете цель на основе целевой переменной (Makefile)?

Я ничего по себе не компиляции, просто хочу условно назвать конкретную цель или набор целей, основанный на переменной, например:

ifeq ($(BUILD_ENV),"development") 
clean: -clean 
else 
clean: -clean-info 
endif 

#--------------------------------- 
dev: BUILD_ENV = development 
dev: dev-setup which-env 

#--------------------------------- 
prod: BUILD_ENV = production 
prod: prod-setup which-env 

#--------------------------------- 


which-env: clean 
    @echo -e "$(GREEN)$(BUILD_ENV)!$(CLEAR)" 

-clean: -clean-info -clean-logs | silent 
    @echo -e "$(GREEN)</CLEAN>$(CLEAR)" 

-clean-info: 
    @echo -e "$(GREEN)<CLEAN>...$(CLEAR)" 

-clean-logs: 
    @echo -e " $(GREY)Removing log and status files $(CLEAR)"; 
    @if [ -d .stat ]; then rm -rf .stat; fi 
    @rm -f *.log || true 

Есть ли способ сделать это с Makefiles? Я еще ничего не нашел, что иллюстрирует этот вариант использования.

Я не пытаюсь конкретно чистить что-либо или что-либо строить, это всего лишь пример того, что я пытаюсь условно назвать набор целей. Фактические цели могут быть чем угодно.

+0

Я не совсем понимаю, чего вы хотите. Вы хотите запустить соответствующую «чистую» цель при запуске 'make dev' или' make prod'? Но разве это не просто очистит то, что вы только что создали? Или вы пытаетесь сказать, что при запуске 'make clean' вы хотите запустить версию цели на основе того, что вы написали последним, либо« make dev », либо« make prod »? – MadScientist

+0

@MadScientist - это просто пример - не добирайтесь до особых команд, я только написал это, чтобы продемонстрировать, что я пытаюсь сделать с целями. В этом случае я хочу только запустить чистую цель, если переменная BUILD_ENV настроена на разработку, или просто clean_info в противном случае. (Мне просто нужен способ вызова определенного набора целей на основе значения переменной.) – qodeninja

ответ

2

Это не совсем понятно, что то, что вы просите действительно то, что вы хотите, но здесь идет:

all: 

ifeq ($(BUILD_ENV),development) 
all: clean-dev 
else 
all: clean-other 
endif 

clean-dev: 
    @echo running [email protected], doing something 

clean-other: 
    @echo running [email protected], doing something else 

Если вы запустите make BUILD_ENV=development, вы получите что-то; если вы запустите make или make BUILD_ENV=production, вы получите что-то еще.

+0

Возможно, код вводит в заблуждение - все, что я хочу, это запустить условную цель dang! Я попытался сделать то, что вы указали выше, но это не сработало. Возможно, это версия make, которую я запускаю (osx/homebrew) – qodeninja

+0

@qodeninja: [facepalm] Вышеописанное работает с GNUMake 3.81, но да, если вы используете самодельный инструмент Make, вы можете получить странные результаты. Похоже, что единственный человек, который может ответить на вопросы о вашей версии make, - это вы. – Beta

+0

Спасибо! GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. Это бесплатное программное обеспечение; см. источник условий копирования. НЕТ гарантии; даже для КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ A ОПРЕДЕЛЕННАЯ ЦЕЛЬ. Эта программа, созданная для i386-apple-darwin11.3.0 – qodeninja

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