2009-08-19 13 views
2

J'ai un programme C++ qui s'exécutera sur plusieurs machines utilisant un système de fichiers réseau. Pour chacune des bibliothèques C++ que mon programme utilise, j'ai installé une version pour chaque machine, sous ~/program_files/machinename/libraryname. "Nom_machine" est obtenu via la commande bash "nom_hôte"Makefile pour le programme exécuté sur différentes machines

Sur les machines que j'utilise, "hostname" sort quelque chose comme "io21.aaa.bbb.edu" et je prends seulement "io21" comme "machinename" pour le chemin vers les librairies. En bash, j'ai appris que

$ HOST = hostname # maintenant la valeur d'accueil est "io21.aaa.bbb.edu"

$ HOST = $ {HOST %%. *} # Extrait " io21" de "io21.aaa.bbb.edu"

$ echo $ {HOST}

io21

Dans le Makefile de mon programme, je veux appeler ces commandes bash pour spécifier le chemin à la bibliothèque en fonction de la machine actuelle:

HOST: = $ (nom d'hôte shell)

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

LDFLAGS = -L $ {HOME}/program_files/$ {HOST}/libraryname/lib

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

La première ligne est travailler c'est-à-dire HOST est "io21. aaa.bbb.edu ", mais la deuxième ligne qui extrait" io21 "ne fonctionne pas et HOST est toujours" io21.aaa.bbb.edu ". Je me demande comment je devrais résoudre ce problème?

Merci pour votre intérêt!

Répondre

3

Vous pouvez également utiliser

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

pour cette solution:

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

make par défaut /bin/sh qui ne peuvent pas soutenir la construction $(var%%string) selon la version que vous avez. En outre, mélanger make variables et bash variables est un peu difficile.