создание make-файла для нескольких целей - PullRequest
2 голосов
/ 24 января 2012

Я создал Makefile, который я бы изменил так, чтобы он генерировал более одной цели при запуске make.

В моей программе я использую предопределенные макросы (например, TIME, REG и _DEBUG), и я хотел бы, чтобы мой Makefile i был таким, чтобы он генерировал одну цель без предопределенных макросов, другую с REG и еще один с REG и TIME.

Я надеюсь, что то, что я хочу, это разумное желание от Makefile, если нет, то, пожалуйста, дайте мне знать.

P.S:.

рекомендации будут с удовольствием исключены

Я использую Вот мой Makefile:

CXX = g++
SOURCES = random.cpp
OBJECTS = $(SOURCES:.cpp=.o) 
EXECUTABLE = random-64bit
DEBUG = -g -p -ggdb
CXXFLAGS = -Wall -ansi -pedantic -W -pipe -O3 -std=gnu++0x -march=native \
    --fast-math -ftree-vectorize -ffast-math -D NDEBUG \
    -D TIME -D REG -D _DEBUG
#CXXFLAGS+=$(DEBUG)
DEPS = def_type.hpp \
    ls_regression.hpp \
    network.hpp \
    statistics.hpp \
    knot.hpp \
    nachbarn.hpp \
    $(SOURCES:.cpp=.hpp) \
    zufallszahlengenerator.hpp 
INCLUDES = -I/home/phymihsa/eigen/ -I/home/phymihsa/boost_1_48_0
LIBPATH = -L/usr/local/lib64
LDFLAGS = -lm

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) $(DEPS) 
    $(CXX) $(LIBPATH) $(OBJECTS) -o $@

.cpp.o: $<
    $(CXX) $(LIBPATH) $(INCLUDES) $(LDFLAGS) $(CXXFLAGS) -c $<

%.o: %.cpp
    $(CXX) $(LIBPATH) $(INCLUDES) $(LDFLAGS) $(CXXFLAGS) -c $<


.PHONY: clean

clean:
    rm -rf $(OBJECTS) $(EXECUTABLE) *~ p1 *.o 

EDIT

Исходя из ответа @trojanfoe, я хотел бы знать, возможно ли использовать массивы

OBJECTS = $(SOURCES:.cpp=_none.o) $(SOURCES:.cpp=_reg.o) $(SOURCES:.cpp=_reg_time.o)
EXECUTABLE = $(SOURCES:.cpp=_none) $(SOURCES:.cpp=_reg) $(SOURCES:.cpp=_reg_time)

вместо того, чтобы каждый писал каждый конкретный?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Вот то, что я искал:

CXX = g++
OPTIONS := none reg reg_inter reg_time
    none_CXXFLAGS  :=
     reg_CXXFLAGS  := -D REG
reg_inter_CXXFLAGS := $(reg_CXXFLAGS) -D INTERMEDIATE_STEP
 reg_time_CXXFLAGS := $(reg_CXXFLAGS) -D TIME
EXECUTABLES = $(addprefix random_,$(OPTIONS))
DEBUG = -g3 -p -ggdb
CXXFLAGS = -Wall -ansi -pedantic -W -pipe -O3 -std=gnu++0x -march=core2 -mtune=core2 \
           --fast-math -ftree-vectorize -ffast-math -D NDEBUG
CXXFLAGS+=$(DEBUG)
DEPS = def_type.hpp \
       ls_regression.hpp \
       network.hpp \
       statistics.hpp \
       knot.hpp \
       nachbarn.hpp \
       zufallszahlengenerator.hpp
INCFLAGS = -I/usr/include/eigen3 -I/usr/include/boost_1_48
LIBPATH = -L/usr/lib64
LDFLAGS = -lm

.PHONY: all
all: $(EXECUTABLES)

random_%: random_%.o
    $(CXX) $(LDFLAGS) $(LIBPATH) $^ -o $@

random_%.o : random.cpp $(DEPS)
    $(CXX) $(INCFLAGS) $(CXXFLAGS) $($*_CXXFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm -rf $(OBJECTS) $(EXECUTABLES) *~ p1 *.o

В этом решении вместо использования записи каждый раз весь текст

regards

использует переменные
0 голосов
/ 24 января 2012

Для каждого файла создайте одну цель для каждого варианта флага компиляции.

Допустим, у вас есть программа, которая зависит от двух файлов: foo.cc и bar.cc.Вы хотите скомпилировать отладочную и выпускную версию.Вы будете делать что-то вроде этого:

DEBUG = -g -Wall -D DEBUG
RELEASE = ...

foo_debug.o: foo.cc
    g++ -o foo_debug.o -c foo.cc $(DEBUG)
foo_release.o: foo.cc
    g++ -o foo_release.o -c foo.cc $(RELEASE)

# Same thing for bar ...

main_debug: foo_debug.o bar_debug.o
    g++ -o main_debug foo_debug.o bar_debug.o

main_release: foo_release.o bar_release.o
    g++ -o main_release foo_release.o bar_release.o
0 голосов
/ 24 января 2012

Вам потребуется сгенерировать 3 разные версии объектного файла из random.cpp и 3 разных исполняемых файла. Примечание $ (CXXFLAGS) содержит флаги, общие для всех трех целей, и я также переместил $ (DEPS) в зависимость от объектных файлов, а не от исполняемого файла.

CXX = g++
SOURCES = random.cpp
OBJECTS = $(SOURCES:.cpp=.o) 
EXECUTABLE = random-64bit
DEBUG = -g -p -ggdb
CXXFLAGS = -Wall -ansi -pedantic -W -pipe -O3 -std=gnu++0x -march=native \
    --fast-math -ftree-vectorize -ffast-math -D NDEBUG -D _DEBUG
#CXXFLAGS+=$(DEBUG)
DEPS = def_type.hpp \
    ls_regression.hpp \
    network.hpp \
    statistics.hpp \
    knot.hpp \
    nachbarn.hpp \
    $(SOURCES:.cpp=.hpp) \
    zufallszahlengenerator.hpp 
INCLUDES = -I/home/phymihsa/eigen/ -I/home/phymihsa/boost_1_48_0
LIBPATH = -L/usr/local/lib64
LDFLAGS = -lm

all: random_none random_reg random_reg_time

random_none: random_none.o
    $(CXX) $(LDFLAGS) $(LIBPATH) random_none.o -o $@

random_reg: random_reg.o
    $(CXX) $(LDFLAGS) $(LIBPATH) random_reg.o -o $@

random_reg_time: random_reg_time.o
    $(CXX) $(LDFLAGS) $(LIBPATH) random_reg_time.o -o $@

random_none.o: random.cpp $(DEPS)
    $(CXX) $(INCLUDES) $(CXXFLAGS) -c $<

random_reg.o: random.cpp $(DEPS)
    $(CXX) $(INCLUDES) $(CXXFLAGS) -D REG -c $<

random_reg_time.o: random.cpp $(DEPS)
    $(CXX) $(INCLUDES) $(CXXFLAGS) -D REG -D TIME -c $<

.PHONY: clean

clean:
    rm -rf *.o random_none random_reg random_reg_time *~ p1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...