2016-11-22 8 views
1

Как я могу обнаружить оболочку, которая будет использоваться gnu make? Я хочу, чтобы мой макияж должен быть запущен на следующих платформах:Как обнаружить оболочку, используемую в GNU make?

  • Линукс
  • окна
  • окна с Cygwin (Заметим, что на окнах с Cygwin марку использует Cygwin оболочки)

Тогда я как обнаружить, если gcc присутствует в системе независимо от ОС.

ответ

1

До сих пор я пришел к этому решению:

# detect what shell is used 
ifeq ($(findstring cmd.exe,$(SHELL)),cmd.exe) 
$(info "shell Windows cmd.exe") 
DEVNUL := NUL 
WHICH := where 
else 
$(info "shell Bash") 
DEVNUL := /dev/null 
WHICH := which 
endif 

# detect platform independently if gcc is installed 
ifeq ($(shell ${WHICH} gcc 2>${DEVNUL}),) 
$(error "gcc is not in your system PATH") 
else 
$(info "gcc found") 
endif 

необязательно, когда мне нужно, чтобы обнаружить больше инструментов можно использовать:

EXECUTABLES = ls dd 
K := $(foreach myTestCommand,$(EXECUTABLES),\ 
     $(if $(shell ${WHICH} $(myTestCommand) 2>${DEVNUL}),\ 
      $(myTestCommand) found,\ 
      $(error "No $(myTestCommand) in PATH))) 
$(info ${K})   
+0

Просто чтобы быть ясно, «не cmd.exe» делает НЕ подразумевает bash. Это может означать POSIX sh, но это не одно и то же. Во-вторых, если вы хотите узнать, доступен ли GCC, почему бы вам просто не запустить его и посмотреть, не сработает ли он: 'ifneq (, $ (shell gcc -version))'? – MadScientist

+0

Я знаю, что могут быть другие снаряды. Но обычно оболочки linux ведут себя совершенно аналогично. По крайней мере, с точки зрения поддержки 'which' и'/dev/null', которые я использую. Что касается не выполнения только 'ifneq (, $ (shell gcc -version)), это потому, что я хочу избавить BFU от сумасшедших сообщений. Например, я бы получил что-то вроде: 'process_begin: CreateProcess (NULL, gccx --version, ...) не удалось. сделать: M: 32: pipe: Bad file descriptor'. На самом деле с make я alergic, когда ppl оставил меня с каким-то автоматическим сообщением, который говорит мне простым языком, что не так ... –

+1

Хорошо, но на самом деле у bash есть много дополнительных функций, которые недоступны в POSIX sh и make всегда запускает POSIX sh, никогда не bash (если вы не установите переменную SHELL). Очень часто люди пишут рецепты make, используя расширения bash, а затем не могут понять, почему они не работают. Итак, лучше понять это. – MadScientist

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

  • Нет связанных вопросов^_^