我正在编写一个必须与LINUX和HP-UX操作系统兼容的makefile。我知道LINUX中的某些shell命令与HP-UX不兼容。因此,我想知道是否有可能有条件地声明宏,以便如果确定操作系统是HP-UX,宏将以某种方式定义,如果操作系统是LINUX,它将被定义为不同? / p>
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块。
答案 0 :(得分:2)
是的,您可以定义conditionals in 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。
更新:要解决操作系统变量无法获取shell命令uname
输出的问题,您需要使用shell function(正如@AraundF正确指出的那样:引用我发布的链接:
“shell函数执行与反引号(``)相同的功能 在大多数贝壳中表演......“
所以你走在正确的轨道上。
答案 1 :(得分:2)
你应该使用$(shell ...)来执行SHELL命令,这将起作用
OS := $(shell uname)
myOS := Linux
ifeq ($(OS),$(myOS))
message := "HELLO LINUX"
else
message := "HELLO FOO"
endif
all: install
install:
echo $(message)
答案 2 :(得分:0)
我们以前在这里做的是在我们构建的所有系统上定义一个环境变量ARCH
,在Linux系统上它将具有值linux
,在AIX aix
上,在Makefile
我们有:
include make.$(ARCH)
并为每个平台创建一个名为make.linux
,make.aix
等的文件,其中包含特定于该平台的定义,例如make.linux
包含:
CC =克++
和make.aix
包含
CC = xlC_r
这是一个非常好的干净方法,但我们现在正在迁移到cmake(http://www.cmake.org/)。