2012-01-24 93 views
2

我已經創建了一個Makefile,我將會改變這種情況,當我運行make時它會生成多個目標。爲多個目標創建一個makefile

在我的節目我用自己的預定義宏(如TIMEREG_DEBUG),我想有我的Makefile我這樣,它會產生一個目標使用了預定義的宏,一個與REG和另一個REGTIME

我希望我希望從Makefile中獲得一個合理的希望,如果沒有的話,請讓我知道。

PS:

建議將樂意除外

我使用 這裏是我的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 [email protected] 

.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 

編輯

基於@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) 

而不是寫每一個具體的?

+0

你考慮過CMake嗎?這真的很擅長這種事情。 – spraff

+0

@spraff,不,我沒有想過CMake,因爲我不熟悉它。 – Eagle

+0

好吧,我強烈建議您嘗試一下。我從未回頭。 – spraff

回答

2

這裏是我正在尋找:

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 [email protected] 

random_%.o : random.cpp $(DEPS) 
    $(CXX) $(INCFLAGS) $(CXXFLAGS) $($*_CXXFLAGS) -c $< -o [email protected] 

.PHONY: clean 
clean: 
    rm -rf $(OBJECTS) $(EXECUTABLES) *~ p1 *.o 
在此解決方案

有一個使用的變量,而不是每次都寫的所有文字

關於

0

您需要從random.cpp和3個不同的可執行文件生成3個不同版本的目標文件。注意$(CXXFLAGS)包含所有3個目標公用的標誌,並且我還將$(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 [email protected] 

random_reg: random_reg.o 
    $(CXX) $(LDFLAGS) $(LIBPATH) random_reg.o -o [email protected] 

random_reg_time: random_reg_time.o 
    $(CXX) $(LDFLAGS) $(LIBPATH) random_reg_time.o -o [email protected] 

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 
0

對於每個文件,爲每個編譯標誌變量創建一個目標。

假設你有一個程序依賴於兩個文件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

我的程序不依賴於兩個文件。我想創建兩個目標。 – Eagle