2

我有一个 C++ 程序,它将在几台使用网络文件系统的机器上运行。对于我的程序使用的每个 C++ 库,我在 ~/program_files/machinename/libraryname 下为每台机器安装了一个版本。

“机器名”是通过 bash 命令“主机名”获得的。在我使用的机器上,“主机名”输出类似“io21.aaa.bbb.edu”的内​​容,我只将“io21”作为库路径的“机器名”。在 bash 中,我了解到

$ HOST= hostname# 现在 HOST 的值为 "io21.aaa.bbb.edu"

$ HOST=${HOST%%.*} # 从“io21.aaa.bbb.edu”中提取“io21”

$ 回声 ${主机}

io21

在我的程序的 Makefile 中,我想调用这些 bash 命令来根据当前机器指定库的路径:

HOST := $(shell 主机名)

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

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

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

第一行有效,即 HOST 是“io21.aaa.bbb.edu”,但提取“io21”的第二行不起作用,HOST 仍然是“io21.aaa.bbb.edu”。

我想知道我应该如何解决这个问题?

谢谢并恭祝安康!

4

2 回答 2

3

或者,您可以使用

HOST := $(shell echo $(HOST) | cut -d . -f 1)
于 2009-08-19T23:45:47.553 回答
3

试试这个:

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

make根据您拥有的版本,默认值/bin/sh可能不支持该构造。$(var%%string)此外,混合make变量和bash变量有点挑战性。

于 2009-08-21T04:06:20.217 回答