Makefile для программы, работающей на разных машинах - PullRequest
2 голосов
/ 20 августа 2009

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

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

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

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

$ echo $ {HOST}

io21

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

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

HOST: = $ (shell $ {HOST %%. *})

* * 1 022 LDFLAGS = -L $ {HOME} / program_files / $ {HOST} / LibraryName / Библиотека

CXXFLAGS = -Wall -I $ {HOME} / program_files / $ {HOST} / имя библиотеки / include

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

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

Спасибо и всего наилучшего!

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Попробуйте:

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

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

3 голосов
/ 20 августа 2009

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

HOST := $(shell echo $(HOST) | cut -d . -f 1)
...