#linux #makefile
#linux #makefile
Вопрос:
Мне нужно скомпилировать мою программу с некоторыми библиотеками или без них, в зависимости от того, на каком из двух хостов она запущена. Я не знаю, что использовать в правой части HOST=
моего makefile, чтобы заставить это работать так, как я хочу:
ifeq(${HOST},${ADDITIONAL_LIBS_HOST})
ADD_LIBS= ...
${ADDITIONAL_LIBS_HOST}
является ли имя хоста полученным из
echo ${HOSTNAME}
Ответ №1:
Несколько мыслей:
-
Именно для решения такой ситуации была разработана GNU autoconf. Запустите
./configure
, выясните, какие библиотеки доступны, и сгенерируйте соответствующий Makefile. -
Вы могли бы получить текущее имя хоста, выполнив что-то вроде:
HOST=$(shell hostname)
Затем вы могли бы использовать это в своем условном.
-
Вместо этого вы могли бы заставить свой Makefile делать что-то вроде:
include Makefile.local
А затем иметь другой Makefile.локальные файлы на каждом хосте.
Re: ваш комментарий, учитывая такой Makefile:
HOST=$(shell hostname)
all:
@echo $(HOST)
Сгенерирует следующий вывод:
$ make all
fafnir.local
(Предполагая, что ваш локальный хост «fafnir.local». Какой мой.)
Комментарии:
1.
HOST=$(shell HOSTNAME)
не работает, я уже пробовал это. Но я не знаю, как я мог пропустить директиву include. Большое вам спасибо.2.
HOST=$(shell hostname)
работает нормально. Обратите внимание, что вы по какой-либо причине решили использовать заглавную буквуHOSTNAME
, которая на самом деле не является названием команды.3. эмм, я пытался использовать переменную среды HOSTNAME, и поэтому я использовал $ (shell
HOSTNAME
),$(shell ${HOSTNAME})
,$(shell $${HOSTNAME})
и все, что приходило мне в голову. Я не знал, что на самом деле есть командаhostname
. И, конечно, вы правы,HOST=$(shell hostname)
работает нормально.4. Если вы используете переменную среды, вы бы не использовали директиву $(shell …), которая используется для запуска команды. Для переменной среды вы просто используете ее как обычную переменную make (например, $(HOME)).
5. Кажется, что
HOST=$(HOSTNAME)
не работает (пробовал на двух компьютерах * buntu). HOME, с другой стороны, делает.
Ответ №2:
hostname
Консольная команда присутствует не во всех дистрибутивах, особенно для дистрибутивов с systemd.
uname
Команда может быть использована в качестве альтернативы.
hostname := $(shell uname -n)
default:
@echo $(hostname)