一个 Makefile 中的多个编译器

Multiple compilers in one Makefile

我在这里找到 this question,这正是我想要的。但是,作为 makefile 的新手,我很难理解如何在我当前的设置中实现第二个答案。

我有一个简单的 makefile,我想在编译 Linux 或交叉编译 Windows 时使用不同的编译器。如图所示,下面的文件有效。为了 Linux,我只输入 make,而为了 windows,我输入 make os=win。为了学习 makefile 如何更好地工作,我希望能够在当前的 Makefile 中实现链接的答案,这样我就可以通过键入 make win 或 [=14] 来生成 windows =] 如链接问题中所述。

有人可以帮助我理解链接答案中呈现的结构如何在我这里的具体案例中实现吗?大概有一种比拥有 native:cross: 目标并在两者之间复制几乎全部代码更优雅的方法。

也欢迎任何关于清理 Makefile 的建议。

ifeq ($(os),win)
    CC=x86_64-w64-mingw32-gcc
    OUT=cusum.exe
else
    CC=gcc
    OUT=cusum
endif

CFLAGS=-D_GNU_SOURCE -O3 -Wall -Wextra -lm --static
DEPS=bessel.h detector.h io.h stepfit.h lmmin_int64.h utils.h
ODIR=obj
_OBJ=main.o bessel.o detector.o io.o lmmin_int64.o stepfit.o utils.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
LIBS=-lm


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

$(OUT): $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS)

.PHONY: clean

clean:
    rm -f $(OUT) $(ODIR)/*.o *~ core $(INCDIR)/*~ 

你只需要介绍一个上层目标即可。特定于目标的变量由其先决条件继承,因此您不必更改所有目标。

但是,您无法使用此方法更新目标或先决条件的内容,因此您无法删除 OUT 的分配。这意味着您无法摆脱 OS 变量赋值。

一个简单的方法是使用 make 的递归调用。正常编写您的 makefile:

O = o
E =
CC = gcc
OUT = cusum$E
CFLAGS = -D_GNU_SOURCE -O3 -Wall -Wextra -lm --static
DEPS = bessel.h detector.h io.h stepfit.h lmmin_int64.h utils.h
ODIR = obj
_OBJ = main.$O bessel.$O detector.$O io.$O lmmin_int64.$O stepfit.$O utils.$O
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
LIBS = -lm

$(ODIR)/%.$O: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

$(OUT): $(OBJ)
        $(CC) -o $@ $^ $(CFLAGS)

.PHONY: clean

clean:
        rm -rf $(OUT)* obj wobj *~ core $(INCDIR)/*~

然后添加一个递归调用make覆盖相关变量的目标(一定要放在最后或者至少在$(OUT)目标之后):

win:
        $(MAKE) CC=x86_64-w64-mingw32-gcc E=.exe O=obj ODIR=wobj

现在您可以 运行 make win 它将递归调用 make 覆盖适当的变量。