Make игнорирует флаги компилятора - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть проект, который я могу собрать без проблем в Ubuntu.Makefile в https://github.com/avalon-lang/avaloni/blob/master/Makefile - это тот, который я пытаюсь адаптировать для Windows 10.
У меня установлен MingW-w64 и GNU Make-32.
Когда я запускаю make для Makefile, CFLAGS идругие флаги, передаваемые компилятору, не отображаются, оставляя пробелы в отраженном выводе вместо флагов компилятора.Поэтому файлы, необходимые для успешной компиляции, не найдены.

Я попытался заменить переменные CFLAGS, SYSINC и INC их содержимым, но ничего не изменилось.Они просто игнорируются, как будто make удалил их.

cc          := g++
cflags      := -std=c++11 -g -Wall -pedantic -DDEBUG -fopenmp
ldpaths     := -LC:/Boost/lib
rdpaths     := -Wl,-rpath=C:/Boost/lib
ldflags     := -lboost_filesystem-mgw81-mt-x64-1_68 -lboost_system-mgw81-mt-x64-1_68 -fopenmp
src_dir     := src
inc         := -Isrc -Ideps/qpp
sysinc      := -isystem deps/boost -isystem deps/eigen
build_dir   := build
bin_dir     := bin
target      := $(bin_dir)/avaloni.exe

src_ext     := cpp
sources     := $(shell dir $(src_dir)\*.$(src_ext) /b /s)
objects     := $(patsubst $(src_dir)\%,$(build_dir)\%,$(sources:.$(src_ext)=.o))

install_dir := C:/Avalon
sdk_path    := C:/Avalon/AvalonSdk


.PHONY: all
all: setup $(target)

$(target): $(objects)
    $(cc) $^ -o $(target) $(ldpaths) $(ldflags) $(rdpaths)

$(build_dir)\%.o: $(src_dir)\%.$(src_ext)
    @if not exist "$(dir $@)" mkdir $(dir $@)
    $(cc) $(cflags) $(sysinc) $(inc) -c -o $@ $< #!!! This is the problem line.

Во время компиляции я ожидаю строку, подобную следующей:

g++ -std=c++11 -g -Wall -pedantic -DDEBUG -fopenmp -isystem deps/boost -isystem deps/eigen -Isrc -Ideps/qpp -c -o file.o file.cpp

Но я получаю:

g++    -c -o file.o file.cpp

1 Ответ

0 голосов
/ 22 декабря 2018

Причина этого в том, что (а) вы используете нестандартные переменные для хранения флагов вашего компилятора, и (б) ваше правило шаблона не соответствует.

Из-за (б),make выбирает встроенное правило для создания объектного файла, и из-за (a) ни один из ваших флагов не используется во встроенном правиле.

Причина, по которой ваше правило шаблона не соответствует, заключается в том, что GNUmake не поддерживает обратную косую черту в путевых именах.Вы должны использовать косую черту во всех своих правилах:

$(build_dir)/%.o: $(src_dir)/%.$(src_ext)
  ...
...