Как сделать makefile зависимым от хоста?

#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)