Расширение простого make-файла для поддержки различных неявных флагов компилятора

Я очень новичок в make-файлах — поэтому, пожалуйста, держите меня в покое и то, как я задаю этот вопрос.

Я использовал make-файл, который был довольно простым. Я определил OBJS со списком файлов .cc. Я установил зависимости и включил флаги и добавил их в $ CXXFLAGS. Это выглядит примерно так:

SRCS = file1.cc file2.cc file3.cc
OBJS = $(SRCS:.cc=.o)
CXXFLAGS=some flags
CXXFLAGS+=some include dirs
$(mylib.so): $OBJS
$CXX -shared -o $@ $^

mylib.so использует CXXFLAGS (неявно), и все прекрасно работает.

У меня недавно была потребность иметь mylib_1.so и mylib_2.so, в дополнение к mylib.so. Каждый .so зависит от всех одинаковых файлов .cc, но все флаги компилятора различны (включая каталоги включения).

Как мне получить его, чтобы я мог установить флаги компилятора на основе цели .so? Проблема, которая у меня есть, состоит в том, что, если я устанавливаю CXXFLAGS более одного раза, он перезаписывается. Это почти как если бы мне нужна ситуация if / else.

Я попытался сделать что-то вроде установки трех разных флагов, $ CXXFLAGS1, $ CXXFLAGS2, $ CXXFLAGS3 и использования их в строке

$(mylib1.so): $OBJS
$CXX $(CXXFLAGS1) -shared -o $@ $^

но это не работает.

Как мне выполнить то, что я пытаюсь сделать? Лучше иметь 3 отдельных make-файла? Я нашел способ заставить его работать. Я могу прекратить использовать $ OBJS и явно указывать флаги для каждого исходного файла, но это кажется ужасной идеей с точки зрения масштабирования по размеру.

1

Решение

Ваш CXXFLAGS1 в вашем примере используется только на этапе создания .so файла, не для компиляции реальных источников C ++ (что я и пытаюсь сделать).

Чтобы достичь вышеизложенного, рассмотрите возможность создания Makefile 3 раза для 3 различных целей и передачи CXXFLAGS (с разными значениями) как часть MAKEFLAGS или в командной строке.

Обновить: вот пример

все: build-lib1 build-lib2 build-lib3

строить-lib1:
$ (MAKE) $ (MAKEFLAGS) CXXFLAGS = "$ (CXXFLAGS1)" lib1.so

строить-Lib2:
$ (MAKE) $ (MAKEFLAGS) CXXFLAGS = "$ (CXXFLAGS2)" lib2.so

строить-lib3:
$ (MAKE) $ (MAKEFLAGS) CXXFLAGS = "$ (CXXFLAGS3)" lib3.so

$ (lib1.so): $ OBJS
$ (CXX) -расход -o $ @ $ ^

так далее...

2

Другие решения

Makefiles может иметь целевые значения переменных. Что-то вроде:

$(mylib1.so): CXXFLAGS += -lib1flags
$(mylib2.so): CXXFLAGS += -lib2flags
$(mylib3.so): CXXFLAGS += -lib3flags

Согласно документации, флаги будут распространяться до обязательных целей.

Есть еще одна особенность целевых переменных: когда
Вы определяете целевую переменную, значение которой также находится в
эффект для всех предпосылок этой цели, и все их
предварительные условия и т. д. (если эти предварительные условия не переопределяют эту переменную
с их собственной целевой переменной значение). Так, например,
утверждение как это:

 prog : CFLAGS = -g
prog : prog.o foo.o bar.o

установит для CFLAGS значение «-g» в рецепте для prog, но также установит
Помечайте «to -g» в рецептах, которые создают prog.o, foo.o и bar.o,
и любые рецепты, которые создают свои предпосылки.

2

Я бы сделал это с помощью рекурсивного вызова. Я бы использовал два make-файла:

В Makefile:

все: mylib1.so mylib2.so

SRCS: = file1.cc file2.cc file3.cc

mylib1.so: $ (SRCS)
test -d mylib1 || mkdir mylib1
$ (MAKE) -f ../lib.mak -C mylib1 TARGET = mylib1.so CXXFLAGS = -DMYLIB = 1
cp mylib1 / mylib1.so mylib1.so

mylib2.so: $ (SRCS)
test -d mylib2 || mkdir mylib2
$ (MAKE) -f ../lib.mak -C mylib2 TARGET = mylib2.so CXXFLAGS = -DMYLIB = 2
cp mylib2 / mylib2.so mylib2.so

В lib.makв том же каталоге:

VPATH = ..

SRCS: = file1.cc file2.cc file3.cc
OBJS: = $ (SRCS: .cc = .o)

$ (TARGET): $ (OBJS)
$ (CXX) -расход -o $ @ $ ^

Второй make-файл фактически собирает библиотеку, но использует только один набор CXXFLAGS, Основной make-файл вызывает первый make-файл для каждой версии с отдельным CXXFLAGS и в отдельном каталоге. VPATH облегчает компиляцию исходных файлов, которые не находятся в одном каталоге.

Я проверил эту установку с пробным прогоном,

test -d mylib1 || mkdir mylib1
make -f ../lib.mak -C mylib1 TARGET = mylib1.so CXXFLAGS = -DMYLIB = 1
make [1]: вход в каталог `/ home / depp / Maketest2 / mylib1 '
g ++ -DMYLIB = 1 -c -o file1.o ../file1.cc
g ++ -DMYLIB = 1 -c -o file2.o ../file2.cc
g ++ -DMYLIB = 1 -c -o file3.o ../file3.cc
g ++ -shared -o mylib1.so file1.o file2.o file3.o
make [1]: выход из каталога `/ home / depp / Maketest2 / mylib1 '
cp mylib1 / mylib1.so mylib1.so
test -d mylib2 || mkdir mylib2
make -f ../lib.mak -C mylib2 TARGET = mylib2.so CXXFLAGS = -DMYLIB = 2
make [1]: вход в каталог `/ home / depp / Maketest2 / mylib2 '
g ++ -DMYLIB = 2 -c -o file1.o ../file1.cc
g ++ -DMYLIB = 2 -c -o file2.o ../file2.cc
g ++ -DMYLIB = 2 -c -o file3.o ../file3.cc
g ++ -shared -o mylib2.so file1.o file2.o file3.o
make [1]: выход из каталога `/ home / depp / Maketest2 / mylib2 '
cp mylib2 / mylib2.so mylib2.so
2
По вопросам рекламы [email protected]