0

我正在编写一个必须与 LINUX 和 HP-UX 操作系统兼容的 makefile。我知道 LINUX 中的某些 shell 命令与 HP-UX 不兼容。因此,我想知道是否可以有条件地声明宏,以便如果确定操作系统是 HP-UX,宏将以某种方式定义,如果操作系统是 LINUX,它会以不同的方式定义?

OS       = `uname`
myOS     = Linux


ifeq ($(OS),$(myOS))
    message = "HELLO LINUX"
else
    message = "HELLO FOO" 
endif

all: install

install:
    echo $(message)

我试过使用上面的方法;但是,似乎 ifeq 确定 OS 和 myOS 不一样。它们都应该是“Linux”,但它输出的是 else 块。

4

3 回答 3

2

是的,您可以在 makefiles中定义条件。

这个例子取自上面的链接

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

这显示了条件句的语法

鉴于此定义任何特定的东西都不应该成为问题。-D例如,可以通过C 程序的开关定义/传递 marcos 。

更新:要解决OS变量没有获得 shell 命令输出的问题,uname您需要使用shell 函数(正如@AraundF 正确指出的那样):引用我发布的链接:

“shell 函数执行的功能与反引号 (``) 在大多数 shell 中执行的功能相同......”

所以你在正确的轨道上。

于 2012-06-08T14:01:09.780 回答
2

您应该使用 $(shell ...) 来执行 SHELL 命令,这将起作用

OS       := $(shell uname)
myOS     := Linux


ifeq ($(OS),$(myOS))
    message := "HELLO LINUX"
else
    message := "HELLO FOO" 
endif

all: install

install:
    echo $(message)
于 2012-06-08T14:43:22.417 回答
0

我们在这里所做的是ARCH在我们构建东西的所有系统上定义一个环境变量,在 Linux 系统上它将具有 value linux,在 AIXaix等上,Makefile我们有:

include make.$(ARCH)

对于每个平台,我们创建一个名为make.linux,make.aix等的文件,其中包含特定于该平台的定义,例如make.linux包含:

抄送=g++

make.aix包含

CC=xlC_r

这是一个非常好的和干净的方法,但是我们现在正在迁移到 cmake ( http://www.cmake.org/ )。

于 2012-06-08T14:23:29.847 回答