CXXFLAGS не добавляется в make-файл - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть make-файл, который я хочу иметь как для сборки выпуска, так и для сборки отладки.Когда я просто запускаю:

make 

, я хочу, чтобы CXXFLAGS был:

-std=c++11 -Isrc/includes -c -Os

, а когда я запускаю

make debug

, я хочу, чтобы CXXFLAGS был

-std=c++11 -Isrc/includes -c -g

Я пытаюсь сделать это, используя фальшивые цели и добавляя дополнительные флаги в переменную CXXFLAGS, однако эти дополнительные флаги никогда не добавляются.почему make debug по-прежнему выдает:

g++ -std=c++11 -Isrc/includes -c  src/file.cpp -o build/obj/file.o

, а не ожидаемое

g++ -std=c++11 -Isrc/includes -c -g src/file.cpp -o build/obj/file.o

при запуске?

содержимое make-файла:

vpath %.cpp src/macro
vpath %.cpp src/data_types
vpath %.hpp src/includes
vpath %.cpp src

CXX := g++
CXXFLAGS := -std=c++11 -Isrc/includes -c 
LXX = g++
LXXFLAGS := 

BUILDDIR := build
OBJDIR := $(BUILDDIR)/obj

SRCS := $(notdir $(shell find -name '*.cpp'))
OBJS := $(patsubst %.cpp, $(OBJDIR)/%.o, $(SRCS))

all: release aval

aval: builddir $(OBJS) $(SRCS) 
    $(LXX) $(LXXFLAGS) $(OBJS) -o $(BUILDDIR)/aval

$(OBJDIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) $^ -o $@

.PHONY: release
release: CXXFLAGS += -Os
release: LXXFLAGS += -s -Os

.PHONY: debug
debug:  clean db aval

.PHONY: db
db: CXXFLAGS += -g 


.PHONY: builddir
builddir:
    @mkdir -p $(OBJDIR)

.PHONY: clean
clean:
    @rm -f -r build/obj/*.o
    @rm -f build/avalanche

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

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

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

CXXFLAGS = defaults

ifneq (,$(findstring release,$(MAKECMDGOALS)))
  CXXFLAGS += release
else ifneq (,$(findstring debug,$(MAKECMDGOALS)))
  CXXFLAGS += debug
endif

all:
    @echo CXXFLAGS = $(CXXFLAGS)

# Rules for release / debug. The `; @:` part means the body of the rule is empty (do nothing). It just "calls" the dependency rule `all`.
release: all ; @:
debug: all ; @:

Итак, мы смотрим на цели команд и "разбираем их", ищем ваши варианты и добавляем флаги.

Мытакже нужны правила для отладки и выпуска для вызова правила сборки (которое я сейчас называю all).

Вот вывод:

admin@osboxes:~/sandbox/flags$ make
    CXXFLAGS = defaults
admin@osboxes:~/sandbox/flags$ make release
    CXXFLAGS = defaults release
admin@osboxes:~/sandbox/flags$ make debug
    CXXFLAGS = defaults debug
0 голосов
/ 08 февраля 2019

Выбранный вами подход не работает, потому что

db: CXXFLAGS += -g

означает, что переменная CXXFLAGS обновлена ​​и теперь включает -g для цели db, но никакой другой цели.Т.е. это изменение не является глобальным, как вы предполагали.


Ниже будет один способ реализации того, что вы намеревались:

.PHONY: all release
# NOTE: must be first goal in Makefile to be default goal
all release:
    $(MAKE) -f $(lastword $(MAKEFILE_LIST)) BUILD_CXXFLAGS="-Os" BUILD_LXXFLAGS="-s -Os" build

.PHONY: debug
debug:
    $(MAKE) -f $(lastword $(MAKEFILE_LIST)) BUILD_CXXFLAGS="-g" BUILD_LXXFLAGS="-g" build

.PHONY: build
build: clean aval

CXX := g++
CXXFLAGS := $(BUILD_CXXFLAGS) -std=c++11 -Isrc/includes -c 
LXX = g++
LXXFLAGS := $(BUILD_LXXFLAGS)

# ... and the rest of your original Makefile ...

Сbuild реализованный как фиктивное эхо, я получаю следующий вывод из вышеприведенного:

$ make -s
CXX '-Os -std=c++11 -Isrc/includes -c' LXX '-s -Os'

$ make -s all
CXX '-Os -std=c++11 -Isrc/includes -c' LXX '-s -Os'

$ make -s release
CXX '-Os -std=c++11 -Isrc/includes -c' LXX '-s -Os'

$ make -s debug
CXX '-g -std=c++11 -Isrc/includes -c' LXX '-g'

Кстати: вам также нужно добавить -g к LXXFLAGS, иначе вы не получите отладкудвоичный файл.

...