2016-12-08 16 views
1

私はlinuxのmakefileの使い方を学ぼうとしています。リンクする前にメークファイルクリーニングオブジェクトを防ぐ方法(-jオプションを使用)

私は次の2つのファイルがあります。

makefile.config

# Project Configurations 

    # Project Name 

    PROJECT_NAME    =   myapp 

    # Project Version 

    PROJECT_VERSION   =   0.1 

    # Program or Shared Library 

    IS_LIBRARY     =   no 

    # Source Files Directory 

    SRC_DIRECTORY    =   src 

    # Header Files Directory 

    INC_DIRECTORY    =   inc 

    # Library Header Files Directory 

    LIB_DIRECTORY    =   lib 

    # Build Output Directory 

    BIN_DIRECTORY    =   ../Executable 

    # Installation Directory Exec 

    INS_DIRECTORY    =   /usr/local/bin/ 

    # Installation Directory Headers 

    INS_HEARERS_DIRECTORY  =   /usr/local/include/ 

    # Installation Directory SO  

    INS_SO_DIRECTORY   =   /usr/local/lib/ 

    # C Flags 

    CFLAGS      =   -O3 -D_GNU_SOURCE -Wfatal-errors 

    # C++ Flags 

    CXXFLAGS     =   $(CFLAGS) 

    # Linker Flags 

    LDFLAGS     =   $(shell dpkg-buildflags --get LDFLAGS) 

    # Linker Libraries 

    LDLIBS      =   -fno-inline 

    # Debug Yes/No 

    DEBUG      =   yes 

    # C Compiler 

    CC       =   gcc 

    # C++ Compiler 

    CXX      =   g++ 

Makefileの

$(info Starting building process) 

# include configurations 

include makefile.conf 

$(info - Makefile.conf loaded) 

# find project files 

H_FILES := $(shell find -L ./ -name '*.h' -exec dirname {} \; | sed 's/ /\\ /g' | uniq) 

C_FILES := $(shell find ./ -name '*.c' -type f | sed 's/ /\\ /g' | uniq) 

CXX_FILES := $(shell find ./ -name '*.cpp' -type f | sed 's/ /\\ /g' | uniq) 

O_FILES := $(C_FILES:.c=.o) 

O_FILES += $(CXX_FILES:.cpp=.o) 

H_FILES := $(notdir $(H_FILES)) 

C_FILES := $(notdir $(C_FILES)) 

CXX_FILES := $(notdir $(CXX_FILES)) 

INCLUDES := $(H_FILES:%=-I%) 

$(info - Project Files Loaded) 


ifeq ($(DEBUG),yes) 

    $(info - Debug flag added [makefile.conf DEBUG = yes]) 

    CFLAGS := -g3 $(CFLAGS) 

endif 


ifeq ($(IS_LIBRARY),yes) 

    $(info - Set Parameters for Shared Library build process) 

    ALL_PARAMETERS = lib$(PROJECT_NAME).so.$(PROJECT_VERSION) clean 

    ALL_TYPE = lib$(PROJECT_NAME).so.$(PROJECT_VERSION): $(O_FILES) 

    LIBFLAGS = -shared -Wl,-soname,lib$(PROJECT_NAME).so 

    CFLAGS := -fPIC $(CFLAGS) 

    CXXFLAGS := -fPIC $(CXXFLAGS) 

else 

    $(info - Set Parameters for Application build process) 

    ALL_PARAMETERS = $(PROJECT_NAME) clean 

    ALL_TYPE = $(PROJECT_NAME): $(O_FILES) 

    LIBFLAGS = 

endif 

# Build Process 

all: $(ALL_PARAMETERS) 

$(ALL_TYPE) 
    @echo - [OUTPUT][CXX] [email protected] @[$(BIN_DIRECTORY)] 
    @$(CXX) $(CFLAGS) $(INCLUDES) $(LDFLAGS) $(LIBFLAGS) -o $(BIN_DIRECTORY)/[email protected] $^ $(LDLIBS) 

%.o: %.c 
    @echo - [CC] [email protected] 
    @$(CC) $(CFLAGS) -c $(INCLUDES) -o [email protected] $< $(LFLAGS) 

%.o: %.cpp 
    @echo - [CXX] [email protected] 
    @$(CXX) $(CXXFLAGS) -c $(INCLUDES) -o [email protected] $< $(LFLAGS) 

# Clear Objects 

clean: 
    $(info - Remove all .o [object] files) 
    @find . -name \*.o -type f -delete 

# Clear Objects & Executables 

cleanall: 
    $(info - Remove all .o [object] files) 
    @find . -name \*.o -type f -delete 
    $(info - Remove all files in $(BIN_DIRECTORY)) 
    @find $(BIN_DIRECTORY) -name \*.* -type f -delete 

# Install Project 

install: 
    @cp -r $(BIN_DIRECTORY)/lib$(PROJECT_NAME).so.$(PROJECT_VERSION) $(INS_SO_DIRECTORY) 
    @cp -r $(LIB_DIRECTORY)/* $(INS_HEARERS_DIRECTORY) 
    @ln -s $(INS_SO_DIRECTORY)/lib$(PROJECT_NAME).so.$(PROJECT_VERSION) $(INS_SO_DIRECTORY)/lib$(PROJECT_NAME).so 
    @ldconfig 
    $(info - Installation completed) 

# Uninstall Project 

uninstall: 
    @rm $(INS_SO_DIRECTORY)/lib$(PROJECT_NAME).so 
    @rm $(INS_SO_DIRECTORY)/lib$(PROJECT_NAME).so.*.* 
    @rm $(INS_HEARERS_DIRECTORY)/$(PROJECT_NAME).h 
    @ldconfig 
    $(info - Uninstallation completed) 

すべてがうまく、少なくとも私はそれを使用しています何のために...完璧な作品をしかし、makefileを-jオプションで実行しようとすると(例)

$ make -j4 

プロシージャは、オブジェクト(.o)をリンクする前にそのオブジェクトをクリーンアップします。

[email protected]:Source Code$ make -j4 
Starting building process 
- Makefile.conf loaded 
- Project Files Loaded 
- Debug flag added [makefile.conf DEBUG = yes] 
- Set Parameters for Shared Library build process 
- [CXX] src/isca-streamer.o 
- [CXX] src/isca-streamer-pause.o 
- [CXX] src/isca-streamer-thread-image.o 
- [CXX] src/isca-streamer-initialize.o 
- [CXX] src/isca-streamer-start.o 
- [CXX] src/isca-streamer-stop.o 
- [CXX] src/isca-streamer-thread-socket.o 
- [CXX] src/isca-streamer-clear.o 
- Remove all .o [object] files 
- [CXX] src/isca-streamer-settings.o 
- [OUTPUT][CXX] libisca-streamer.so.0.1 @[../Executable] 
g++: error: src/isca-streamer.o: No such file or directory 
g++: error: src/isca-streamer-initialize.o: No such file or directory 
g++: error: src/isca-streamer-thread-image.o: No such file or directory 
g++: error: src/isca-streamer-pause.o: No such file or directory 
g++: error: src/isca-streamer-start.o: No such file or directory 
g++: error: src/isca-streamer-stop.o: No such file or directory 
Makefile:71: recipe for target 'libisca-streamer.so.0.1' failed 
make: *** [libisca-streamer.so.0.1] Error 1 

この問題を解決するにはどうすればよいですか? (オブジェクトがステップをリンクする前に実行するステップのクリーニング防ぐ)

答えて

2

あなたが-jを使用している場合、それは、リンカと並行して実行されますので、ごallターゲットのための前提条件としてcleanを追加し、ファイルを削除することははるかに高速であることはできませんそれらをリンクするよりも。

ALL_PARAMETERS変数からcleanターゲットを削除する必要があるため、リンク行の途中にあるオブジェクトは削除されません。

毎回実行後にすべてのオブジェクトを削除したい理由はまったくありません。毎回最初からすべてを再構築する場合は、makeやmakefilesを必要としません。シェルスクリプトを作成するだけです。 makefileを使用することの全ポイントは、変更されていないプロジェクトの部分を再構築しないようにすることです。

しかし、実際にやりたければ、もっとも簡単な方法はおそらく再帰的なmakeを使うことです。例えば:allのすべての前提条件が完全に構築された後

all: $(ALL_PARAMETERS) 
     $(MAKE) clean 

は今まであなたが-jで実行しても、きれいになります。

+0

ありがとうございます。あなたは正しいです。毎回実行後にオブジェクトを削除しないでください。 – iikem

関連する問題