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



我正在尝试创建一个可以在OSX和Linux上运行的makefile。

我的问题是,我需要根据执行makefile的操作系统更改cflagsldflags,但我无法使其工作。这是我的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)

但当我运行此代码时,cflagsldflagsCC都不会在ifeq条件块中更新。我得到以下结果:

$ 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:....

正如您所看到的,OS被检测到是因为我们进入了ifeq条件块,但CC没有更新,并保持未初始化的值cc。最后,链接器进程失败,因为在ldflags中没有引用OpenCL。

还有一点,如果我不在LDFLAGS="-lm -framework OpenCL"中加引号,我会得到错误:

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

基于多个例子(这里是stackoverflow),我应该不加引号地做这件事。

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

我认为ifeq块不应该进入make目标,而应该只进入makefile的前面(在所有之前:)。

例如:

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"目标,使用信息而不是回波)

最新更新