Makefile для программы, работающей на разных машинах

У меня есть программа на C++, которая будет работать на нескольких машинах, использующих сетевую файловую систему. Для каждой библиотеки C++, которую использует моя программа, я установил версию для каждой машины в каталоге ~/program_files/machinename/libraryname.

имя машины получается с помощью имени хоста команды bash. На машинах, которые я использую, имя хоста выводит что-то вроде io21.aaa.bbb.edu, и я беру только io21 в качестве имени машины для пути к библиотекам. В bash я узнал, что

$ HOST=hostname # теперь значение HOST равно io21.aaa.bbb.edu

$ HOST=${HOST%%.*} # извлечь io21 из io21.aaa.bbb.edu

$ эхо $ {ХОСТ}

io21

В Makefile моей программы я хочу вызвать эти команды bash, чтобы указать путь к библиотеке в соответствии с текущей машиной:

HOST := $(имя хоста оболочки)

ХОСТ := $(оболочка ${HOST%.*})

LDFLAGS=-L${HOME}/program_files/${HOST}/имя_библиотеки/lib

CXXFLAGS=-Wall -I${HOME}/program_files/${HOST}/libraryname/include

Первая строка работает, то есть HOST — это io21.aaa.bbb.edu, но вторая строка, которая извлекает io21, не работает, а HOST по-прежнему io21.aaa.bbb.edu.

Меня интересует, как мне решить эту проблему?

Спасибо и привет!


person Tim    schedule 19.08.2009    source источник


Ответы (2)


В качестве альтернативы вы можете использовать

HOST := $(shell echo $(HOST) | cut -d . -f 1)
person hlovdal    schedule 19.08.2009

Попробуйте это:

SHELL = /bin/bash
HOST := $(shell hostname)
HOST := $(shell host=$(HOST);echo $${host%%.*})

make по умолчанию имеет значение /bin/sh, которое может не поддерживать конструкцию $(var%%string) в зависимости от вашей версии. Кроме того, смешивание make переменных и bash переменных немного сложнее.

person Dennis Williamson    schedule 21.08.2009