Несколько компиляторов в одном Makefile - PullRequest
0 голосов
/ 23 января 2019

Я нашел этот вопрос здесь, который делает именно то, что я хочу. Однако, будучи новичком в make-файлах, мне трудно понять, как реализовать второй ответ в моей текущей настройке.

У меня есть простой make-файл, для которого я хотел бы использовать разные компиляторы при компиляции для Linux или кросс-компиляции для Windows. Как представлено, файл ниже работает. Для Linux я просто набираю make, а для Windows - make os=win. В интересах изучения того, как make-файлы работают немного лучше, я хотел бы иметь возможность реализовать связанный ответ в текущем Make-файле, чтобы я мог сделать для окон просто набрав make win или make cross, как представлено в связанном вопросе. ,

Может ли кто-нибудь помочь мне понять, как структура, представленная в связанном ответе, может быть реализована в конкретном случае, который у меня здесь? Предположительно, есть более элегантный способ, чем иметь цели 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)/*~ 

1 Ответ

0 голосов
/ 23 января 2019

Вам нужно только ввести цель верхнего уровня. Переменные, специфичные для цели, наследуются по их предварительным условиям, поэтому вам не нужно менять все цели.

Однако вы не можете обновить содержимое целей или предварительных условий, используя этот метод, поэтому вы не можете удалить назначение OUT. Это означает, что вы не можете избавиться от присваивания переменной OS.

Один простой способ сделать это - использовать рекурсивные вызовы make. Напишите свой make-файл как обычно:

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)/*~

Затем добавьте цель, которая рекурсивно вызывает переопределение соответствующих переменных (обязательно ставьте ее в конце или хотя бы после цели $(OUT)):

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

Теперь вы можете запустить make win, и он будет рекурсивно вызывать make, переопределяя соответствующие переменные.

...