根据当前操作系统在makefile中更新CFLAGS或LDFLAGS

6

我正在尝试创建一个适用于OSX和Linux的makefile。

我的问题是,我需要根据执行makefile的操作系统更改 cflags 和 ldflags ,但我无法使其起作用。以下是我的makefile:

OS:=$(shell uname)
DST=hello
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
CFLAGS=

all: clean DetectOS $(DST)

DetectOS:
ifeq ($(OS),Darwin)
    @echo OS : $(OS)
    CC=g++
    LDFLAGS="-lm -framework OpenCL"
    CFLAGS+=-O3
endif

ifeq ($(OS),Linux)
    #Coming soon...
endif

$(DST): $(OBJ)
    $(CC) -o $@ $^ $(LDFLAGS)

%.o: %.cpp
    $(CC) -o $@ -c $< $(CFLAGS)

clean:
    rm -rf *.o $(DST)

然而,当我运行这段代码时,在 ifeq 条件块中,cflagsldflagsCC 都没有更新。我得到了以下结果:

$ make
rm -rf *.o hello
OS : Darwin
CC=g++
LDFLAGS="-lm -framework OpenCL"
CFLAGS+=-O3
cc -o opencl.o -c opencl.cpp 
cc -o hello opencl.o 
Undefined symbols for architecture x86_64:....

如您所见,操作系统已被检测到,因为我们进入了ifeq条件块,但是CC没有更新,并保留了一个未初始化的值cc。最后,链接器过程失败,因为OpenCL未在ldflags中引用。

另外一个小问题是,如果我在LDFLAGS="-lm -framework OpenCL"中不加引号,则会出现错误:

LDFLAGS=-lm -framework OpenCL
/bin/sh: -framework: command not found
make: *** [DetectOS] Error 127

根据多个例子(例如stackoverflow上的例子),我应该不使用引号进行操作。

我目前使用的是Mac OS X Yosemite系统。

1个回答

4

我认为ifeq代码块不应该放到make目标中,而是放在Makefile的开头(在all:之前)。

即像这样:

OS:=$(shell uname)
DST=hello
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
CFLAGS=

ifeq ($(OS),Darwin)
    $(info OS is $(OS))
    CC=g++
    LDFLAGS=-lm -framework OpenCL
    CFLAGS+=-O3
endif

ifeq ($(OS),Linux)
    #Coming soon...
endif

all: clean $(DST)

...

没有“DetectOS”目标,使用信息而不是回显


通过使用 info,我遇到了 makefile: commands commence before first target. 错误,但是如果我删除它,它似乎可以正常工作,并且解决了引号问题。 - Kantium
也许这是MacOS make的不兼容性问题,因为info命令通常在GNU make中运行。或者,如果$(info前面有制表符而不是空格,那可能就是问题所在(制表符在makefile中有时是特殊的)。您还可以尝试将info语句放在ifeq之外(块之前),没有任何空格/制表符。 - EmDroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接