2012-01-24 2 views
2

내가 바꿀 메이크 파일을 만들었습니다. make을 실행할 때 하나 이상의 타겟을 생성합니다. 내 프로그램에서여러 타겟을위한 메이크 파일 만들기

내가 자기 미리 정의 된 매크로 (예 : TIME, REG_DEBUG)를 사용하고 난 내 메이크 나는 그것이 하나 명 밖으로 사전 정의 된 매크로와 대상, REG 하나와 REG 또 다른 하나를 생성하는 것으로 그 방법을 가지고 싶습니다 및 TIME.

나는 희망하는 것이 Makefile의 합당한 소원이며, 그렇지 않다면 알려 주시기 바랍니다.

PS :

권고 기꺼이 내가 여기 를 사용하여 내 메이크입니다입니다

를 제외 될 것이다 :

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