Как упростить следующий make-файл tenorRT? Makefile кажется настолько сложным, как его упростить, чтобы сделать его более читабельным? - PullRequest
0 голосов
/ 21 апреля 2020

make-файл tenorRT 0.5.2 выглядит следующим образом: как его упростить или преобразовать в CMakeLists.txt am Я запутался в файле .d или .o, любая помощь приветствуется. Заранее спасибо.

.SUFFIXES:
TRIPLE=x86_64-linux
CUDA_INSTALL_DIR=/usr/local/cuda
CUDNN_INSTALL_DIR=$(CUDA_INSTALL_DIR)

CUDNN_LIBDIR=lib64
CUDA_LIBDIR=lib64
CC = g++
CUCC =$(CUDA_INSTALL_DIR)/bin/nvcc -m64

AT=

ECHO = @echo

SHELL=/bin/sh

ROOT_PATH=./
OUT_PATH=$(ROOT_PATH)/bin
OUTDIR=$(OUT_PATH)


#$(call make-depend,source-file,object-file,depend-file)
define make-depend
  $(AT)$(CC) -MM -MF $3 -MP -MT $2 $(COMMON_FLAGS) $1
endef

#########################

INCPATHS    =-I"$(CUDA_INSTALL_DIR)/include" -I"/usr/local/include" -I"/usr/local/include/opencv" -I"../include" -I"../common" -I"$(CUDNN_INSTALL_DIR)/include" -I"../../include" $(TGT_INCLUDES)
LIBPATHS    =-L"$(CUDA_INSTALL_DIR)/targets/$(TRIPLE)/$(CUDA_LIBDIR)" -L"/usr/local/lib" -L"../lib" -L"$(CUDA_INSTALL_DIR)/$(CUDA_LIBDIR)" -L"$(CUDNN_INSTALL_DIR)/$(CUDNN_LIBDIR)" -L"../../lib" $(TGT_LIBS)


.SUFFIXES:
vpath %.h $(EXTRA_DIRECTORIES)
vpath %.cpp $(EXTRA_DIRECTORIES)

COMMON_FLAGS += -Wall -std=c++11 $(INCPATHS)
COMMON_FLAGS += -D_REENTRANT
COMMON_LD_FLAGS += $(LIBPATHS) -L$(OUTDIR)

OBJDIR    =$(OUTDIR)/chobj
DOBJDIR   =$(OUTDIR)/dchobj

COMMON_LIBS = -lcudnn -lcublas -lcudart_static -lnvToolsExt -lcudart -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core


COMMON_LIBS += -lrt -ldl -lpthread

LIBS  =-lnvinfer -lnvparsers -lnvinfer_plugin -lnvonnxparser $(COMMON_LIBS)
DLIBS =-lnvinfer -lnvparsers -lnvinfer_plugin -lnvonnxparser $(COMMON_LIBS)
OBJS   =$(patsubst %.cpp, $(OBJDIR)/%.o, $(wildcard *.cpp $(addsuffix /*.cpp, $(EXTRA_DIRECTORIES))))
DOBJS  =$(patsubst %.cpp, $(DOBJDIR)/%.o, $(wildcard *.cpp $(addsuffix  /*.cpp, $(EXTRA_DIRECTORIES))))
CUOBJS =$(patsubst %.cu, $(OBJDIR)/%.o, $(wildcard *.cu $(addsuffix  /*.cu, $(EXTRA_DIRECTORIES))))
CUDOBJS =$(patsubst %.cu, $(DOBJDIR)/%.o, $(wildcard *.cu $(addsuffix  /*.cu, $(EXTRA_DIRECTORIES))))

CFLAGS=$(COMMON_FLAGS)
CFLAGSD=$(COMMON_FLAGS) -g
LFLAGS=$(COMMON_LD_FLAGS)
LFLAGSD=$(COMMON_LD_FLAGS)

all: release
release : $(OUTDIR)/$(OUTNAME_RELEASE)

$(OUTDIR)/$(OUTNAME_RELEASE) : $(OBJS) $(CUOBJS)
    $(ECHO) Linking: $@
    $(AT)$(CC) -o $@ $^ $(LFLAGS) -Wl,--start-group $(LIBS) -Wl,--end-group
    # Copy every EXTRA_FILE of this sample to bin dir
    $(foreach EXTRA_FILE,$(EXTRA_FILES), cp -f $(EXTRA_FILE) $(OUTDIR)/$(EXTRA_FILE); )

$(OUTDIR)/$(OUTNAME_DEBUG) : $(DOBJS) $(CUDOBJS)
    $(ECHO) Linking: $@
    $(AT)$(CC) -o $@ $^ $(LFLAGSD) -Wl,--start-group $(DLIBS) -Wl,--end-group

$(OBJDIR)/%.o: %.cpp
    $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi
    $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(OBJDIR)/$(XDIR) ]; then mkdir -p $(OBJDIR)/$(XDIR); fi;) :
    $(call make-depend,$<,$@,$(subst .o,.d,$@))
    $(ECHO) Compiling: $<
    $(AT)$(CC) $(CFLAGS) -c -o $@ $<

$(DOBJDIR)/%.o: %.cpp
    $(AT)if [ ! -d $(DOBJDIR) ]; then mkdir -p $(DOBJDIR); fi
    $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(OBJDIR)/$(XDIR) ]; then mkdir -p $(DOBJDIR)/$(XDIR); fi;) :
    $(call make-depend,$<,$@,$(subst .o,.d,$@))
    $(ECHO) Compiling: $<
    $(AT)$(CC) $(CFLAGSD) -c -o $@ $<

######################################################################### CU
$(OBJDIR)/%.o: %.cu
    $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi
    $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(OBJDIR)/$(XDIR) ]; then mkdir -p $(OBJDIR)/$(XDIR); fi;) :
    $(call make-depend,$<,$@,$(subst .o,.d,$@))
    $(ECHO) Compiling CUDA release: $<
    $(AT)$(CUCC) $(CUFLAGS) -c -o $@ $<

$(DOBJDIR)/%.o: %.cu
    $(AT)if [ ! -d $(DOBJDIR) ]; then mkdir -p $(DOBJDIR); fi
    $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(DOBJDIR)/$(XDIR) ]; then mkdir -p $(DOBJDIR)/$(XDIR); fi;) :
    $(call make-depend,$<,$@,$(subst .o,.d,$@))
    $(ECHO) Compiling CUDA debug: $<
    $(AT)$(CUCC) $(CUFLAGSD) -c -o $@ $<

clean:
    $(ECHO) Cleaning...
    $(AT)-rm -rf $(OBJDIR) $(DOBJDIR) $(OUTDIR)/$(OUTNAME_RELEASE) $(OUTDIR)/$(OUTNAME_DEBUG)

ifneq "$(MAKECMDGOALS)" "clean"
  -include $(OBJDIR)/*.d $(DOBJDIR)/*.d

ifeq ($(DO_CUDNN_CHECK), 1)
# To display newlines in the message.
define _cudnn_missing_newline_5020fd0


endef
SHELL=/bin/bash
CUDNN_CHECK = $(shell echo -e '\#include <cudnn.h>\nint main(){ cudnnCreate(nullptr); return 0; }' | $(CC) -xc++ -o /dev/null $(CFLAGS) $(LFLAGS) - $(COMMON_LIBS) 2> /dev/null && echo 'passed_cudnn_exists_check')
ifneq ($(CUDNN_CHECK), passed_cudnn_exists_check)
$(error $(_cudnn_missing_newline_5020fd0)$(_cudnn_missing_newline_5020fd0)This sample requires CUDNN, but it could not be found.$(_cudnn_missing_newline_5020fd0)Please install CUDNN from https://developer.nvidia.com/cudnn or specify CUDNN_INSTALL_DIR when compiling.$(_cudnn_missing_newline_5020fd0)For example, `make CUDNN_INSTALL_DIR=/path/to/CUDNN/` where /path/to/CUDNN/ contains include/ and lib/ subdirectories.$(_cudnn_missing_newline_5020fd0)$(_cudnn_missing_newline_5020fd0))
endif # ifneq ($(CUDNN_CHECK), passed_cudnn_exists_check)
endif # ifeq ($(DO_CUDNN_CHECK), 1)
endif # ifneq "$(MAKECMDGOALS)" "clean"

Как понять Makefile? Что означает OBJ / DOBJ? И почему мы должны скомпилировать файл CUDA отдельно? Как сделать make-файл более читабельным и легким для понимания?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...