| PROJECT := openpose | |
| CONFIG_FILE := Makefile.config | |
| # Explicitly check for the config file, otherwise make -k will proceed anyway. | |
| ifeq ($(wildcard $(CONFIG_FILE)),) | |
| $(error $(CONFIG_FILE) not found. See $(CONFIG_FILE).example.) | |
| endif | |
| include $(CONFIG_FILE) | |
| BUILD_DIR_LINK := $(BUILD_DIR) | |
| ifeq ($(RELEASE_BUILD_DIR),) | |
| RELEASE_BUILD_DIR := .$(BUILD_DIR)_release | |
| endif | |
| ifeq ($(DEBUG_BUILD_DIR),) | |
| DEBUG_BUILD_DIR := .$(BUILD_DIR)_debug | |
| endif | |
| DEBUG ?= 0 | |
| ifeq ($(DEBUG), 1) | |
| BUILD_DIR := $(DEBUG_BUILD_DIR) | |
| OTHER_BUILD_DIR := $(RELEASE_BUILD_DIR) | |
| else | |
| BUILD_DIR := $(RELEASE_BUILD_DIR) | |
| OTHER_BUILD_DIR := $(DEBUG_BUILD_DIR) | |
| endif | |
| # All of the directories containing code. | |
| SRC_DIRS := $(shell find * -type d -exec bash -c "find {} -maxdepth 1 \ | |
| -name '*.cpp' | grep -q ." \; -print) | |
| # The target shared library name | |
| LIBRARY_NAME := $(PROJECT) | |
| LIB_BUILD_DIR := $(BUILD_DIR)/lib | |
| STATIC_NAME := $(LIB_BUILD_DIR)/lib$(LIBRARY_NAME).a | |
| DYNAMIC_VERSION_MAJOR := 1 | |
| DYNAMIC_VERSION_MINOR := 7 | |
| DYNAMIC_VERSION_REVISION := 0 | |
| DYNAMIC_NAME_SHORT := lib$(LIBRARY_NAME).so | |
| #DYNAMIC_SONAME_SHORT := $(DYNAMIC_NAME_SHORT).$(DYNAMIC_VERSION_MAJOR) | |
| DYNAMIC_VERSIONED_NAME_SHORT := $(DYNAMIC_NAME_SHORT).$(DYNAMIC_VERSION_MAJOR).$(DYNAMIC_VERSION_MINOR).$(DYNAMIC_VERSION_REVISION) | |
| DYNAMIC_NAME := $(LIB_BUILD_DIR)/$(DYNAMIC_VERSIONED_NAME_SHORT) | |
| COMMON_FLAGS += -DOPEN_POSE_VERSION=$(DYNAMIC_VERSION_MAJOR).$(DYNAMIC_VERSION_MINOR).$(DYNAMIC_VERSION_REVISION) | |
| ############################## | |
| # Enable profiler | |
| ############################## | |
| PROFILER_ENABLED ?= 0 | |
| ifneq ($(PROFILER_ENABLED), 0) | |
| COMMON_FLAGS += -DPROFILER_ENABLED=$(PROFILER_ENABLED) | |
| endif | |
| ############################## | |
| # Deep net selection | |
| ############################## | |
| DEEP_NET ?= caffe | |
| # TensorFlow | |
| ifeq ($(DEEP_NET), tensorflow) | |
| # COMMON_FLAGS += -DUSE_TENSOR_FLOW | |
| # Torch | |
| else ifeq ($(DEEP_NET), torch) | |
| # COMMON_FLAGS += -DUSE_TORCH | |
| # Caffe | |
| else | |
| COMMON_FLAGS += -DUSE_CAFFE | |
| LIBRARIES += caffe | |
| LDFLAGS += -Wl,-rpath=$(CAFFE_DIR)/lib | |
| INCLUDE_DIRS += $(CAFFE_DIR)/include | |
| LIBRARY_DIRS += $(CAFFE_DIR)/lib | |
| endif | |
| # Faster GUI display | |
| WITH_OPENCV_WITH_OPENGL ?= 0 | |
| ifneq ($(WITH_OPENCV_WITH_OPENGL), 0) | |
| COMMON_FLAGS += -DUSE_OPENCV_WITH_OPENGL | |
| # FreeGLUT | |
| LIBRARIES += glut | |
| # LIBRARIES += GLU GL glut | |
| endif | |
| # 3-D | |
| # 3-D renderer | |
| WITH_3D_RENDERER ?= 0 | |
| ifneq ($(WITH_3D_RENDERER), 0) | |
| COMMON_FLAGS += -DUSE_3D_RENDERER | |
| # FreeGLUT | |
| LIBRARIES += glut | |
| # LIBRARIES += GLU GL glut | |
| endif | |
| # Ceres support | |
| WITH_CERES ?= 0 | |
| ifneq ($(WITH_CERES), 0) | |
| COMMON_FLAGS += -DUSE_CERES | |
| # Ceres | |
| LIBRARIES += ceres | |
| INCLUDE_DIRS += $(EIGEN_DIR) | |
| # If Ceres was built with Suitesparse: | |
| LIBRARIES += lapack camd amd ccolamd colamd cholmod | |
| # If Ceres was built with CXSparse: | |
| LIBRARIES += cxsparse | |
| # If Ceres was built with OpenMP: | |
| LIBRARIES += pthread gomp m | |
| CXXFLAGS += -fopenmp | |
| LINKFLAGS += -fopenmp | |
| endif | |
| # Eigen support | |
| WITH_EIGEN ?= 0 | |
| ifneq ($(WITH_EIGEN), 0) | |
| COMMON_FLAGS += -DUSE_EIGEN | |
| INCLUDE_DIRS += $(EIGEN_DIR) | |
| endif | |
| # Spinnaker SDK | |
| WITH_FLIR_CAMERA ?= 0 | |
| ifneq ($(WITH_FLIR_CAMERA), 0) | |
| COMMON_FLAGS += -DUSE_FLIR_CAMERA | |
| # Spinnaker SDK | |
| LIBRARIES += Spinnaker | |
| # INCLUDE_DIRS += $(SPINNAKER_DIR) | |
| COMMON_FLAGS += -isystem $(SPINNAKER_DIR) # Remove warnings from this library | |
| endif | |
| ############################## | |
| # Get all source files | |
| ############################## | |
| # CXX_SRCS are the source files excluding the test ones. | |
| # CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp") | |
| CXX_SRCS := $(shell find src ! -name "test_*.cpp" -name "*.cpp") | |
| # CU_SRCS are the cuda source files | |
| # CU_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cu" -name "*.cu") | |
| CU_SRCS := $(shell find src ! -name "test_*.cu" -name "*.cu") | |
| # EXAMPLE_SRCS are the source files for the example binaries | |
| EXAMPLE_SRCS := $(shell find examples -name "*.cpp") | |
| # BUILD_INCLUDE_DIR contains any generated header files we want to include. | |
| BUILD_INCLUDE_DIR := $(BUILD_DIR)/src | |
| # NONGEN_CXX_SRCS includes all source/header files except those generated | |
| # automatically (e.g., by proto). | |
| NONGEN_CXX_SRCS := $(shell find \ | |
| src/$(PROJECT) \ | |
| include/$(PROJECT) \ | |
| examples \ | |
| -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") | |
| LINT_SCRIPT := scripts/cpp_lint.py | |
| LINT_OUTPUT_DIR := $(BUILD_DIR)/.lint | |
| LINT_EXT := lint.txt | |
| LINT_OUTPUTS := $(addsuffix .$(LINT_EXT), $(addprefix $(LINT_OUTPUT_DIR)/, $(NONGEN_CXX_SRCS))) | |
| EMPTY_LINT_REPORT := $(BUILD_DIR)/.$(LINT_EXT) | |
| NONEMPTY_LINT_REPORT := $(BUILD_DIR)/$(LINT_EXT) | |
| ############################## | |
| # Derive generated files | |
| ############################## | |
| # The objects corresponding to the source files | |
| # These objects will be linked into the final shared library, so we | |
| # exclude the example objects. | |
| CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o}) | |
| CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${CU_SRCS:.cu=.o}) | |
| OBJS := $(CXX_OBJS) $(CU_OBJS) | |
| # example objects | |
| EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o}) | |
| # Output files for automatic dependency generation | |
| DEPS := ${EXAMPLE_OBJS:.o=.d} ${CXX_OBJS:.o=.d} ${CU_OBJS:.o=.d} | |
| EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} | |
| ############################## | |
| # Derive compiler warning dump locations | |
| ############################## | |
| WARNS_EXT := warnings.txt | |
| CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.$(WARNS_EXT)}) | |
| CU_WARNS := $(addprefix $(BUILD_DIR)/cuda/, ${CU_SRCS:.cu=.o.$(WARNS_EXT)}) | |
| EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.$(WARNS_EXT)}) | |
| ALL_CXX_WARNS := $(CXX_WARNS) $(EXAMPLE_WARNS) | |
| ALL_CU_WARNS := $(CU_WARNS) | |
| ALL_WARNS := $(ALL_CXX_WARNS) $(ALL_CU_WARNS) | |
| EMPTY_WARN_REPORT := $(BUILD_DIR)/.$(WARNS_EXT) | |
| NONEMPTY_WARN_REPORT := $(BUILD_DIR)/$(WARNS_EXT) | |
| ############################## | |
| # Derive include and lib directories | |
| ############################## | |
| CUDA_INCLUDE_DIR := $(CUDA_DIR)/include | |
| CUDA_LIB_DIR := | |
| # add <cuda>/lib64 only if it exists | |
| ifneq ("$(wildcard $(CUDA_DIR)/lib64)","") | |
| CUDA_LIB_DIR += $(CUDA_DIR)/lib64 | |
| endif | |
| CUDA_LIB_DIR += $(CUDA_DIR)/lib | |
| INCLUDE_DIRS += $(BUILD_INCLUDE_DIR) ./src ./include | |
| ifeq ($(USE_CUDA), 1) | |
| INCLUDE_DIRS += $(CUDA_INCLUDE_DIR) | |
| LIBRARY_DIRS += $(CUDA_LIB_DIR) | |
| LIBRARIES += cudart cublas curand | |
| endif | |
| LIBRARIES += glog gflags m hdf5_hl hdf5 | |
| # handle IO dependencies | |
| USE_LEVELDB ?= 1 | |
| USE_LMDB ?= 1 | |
| USE_OPENCV ?= 1 | |
| ifeq ($(USE_LEVELDB), 1) | |
| LIBRARIES += leveldb snappy | |
| endif | |
| ifeq ($(USE_LMDB), 1) | |
| LIBRARIES += lmdb | |
| endif | |
| ifeq ($(USE_OPENCV), 1) | |
| LIBRARIES += opencv_core opencv_highgui opencv_imgproc opencv_objdetect opencv_video opencv_calib3d | |
| ifeq ($(OPENCV_VERSION), 3) | |
| LIBRARIES += opencv_imgcodecs opencv_videoio | |
| # Cuda warping removed for TX2 compatibility (PR #989) | |
| # LIBRARIES += opencv_imgcodecs opencv_videoio opencv_cudawarping | |
| else | |
| LIBRARIES += opencv_contrib opencv_gpu | |
| endif | |
| endif | |
| ############################## | |
| # OpenPose extra code: commented | |
| ############################## | |
| # WARNINGS := -Wall -Wno-sign-compare | |
| ############################## | |
| # Set build directories | |
| ############################## | |
| DISTRIBUTE_DIR ?= distribute | |
| DISTRIBUTE_SUBDIRS := $(DISTRIBUTE_DIR)/bin $(DISTRIBUTE_DIR)/lib | |
| DIST_ALIASES := dist | |
| ifneq ($(strip $(DISTRIBUTE_DIR)),distribute) | |
| DIST_ALIASES += distribute | |
| endif | |
| ALL_BUILD_DIRS := $(sort $(BUILD_DIR) $(addprefix $(BUILD_DIR)/, $(SRC_DIRS)) \ | |
| $(addprefix $(BUILD_DIR)/cuda/, $(SRC_DIRS)) \ | |
| $(LIB_BUILD_DIR) $(LINT_OUTPUT_DIR)) | |
| ############################## | |
| # Set directory for Doxygen-generated documentation | |
| ############################## | |
| DOXYGEN_CONFIG_FILE ?= ./.Doxyfile | |
| # should be the same as OUTPUT_DIRECTORY in the .Doxyfile | |
| DOXYGEN_OUTPUT_DIR ?= ./doxygen | |
| DOXYGEN_COMMAND ?= doxygen | |
| # All the files that might have Doxygen documentation. | |
| DOXYGEN_SOURCES := $(shell find \ | |
| src/$(PROJECT) \ | |
| include/$(PROJECT) \ | |
| examples \ | |
| -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") | |
| DOXYGEN_SOURCES += $(DOXYGEN_CONFIG_FILE) | |
| ############################## | |
| # OpenPose extra code: added flags | |
| ############################## | |
| # Automatic dependency generation (nvcc is handled separately) | |
| CXXFLAGS += -march=native | |
| # Complete build flags. | |
| CXXFLAGS += -fopenmp -Wpedantic -Wall -Wextra | |
| CXXFLAGS += -Wfatal-errors | |
| COMMON_FLAGS += -std=c++11 | |
| LINKFLAGS += -fopenmp | |
| ############################## | |
| # Configure build | |
| ############################## | |
| # Determine platform | |
| UNAME := $(shell uname -s) | |
| ifeq ($(UNAME), Linux) | |
| LINUX := 1 | |
| else ifeq ($(UNAME), Darwin) | |
| OSX := 1 | |
| OSX_MAJOR_VERSION := $(shell sw_vers -productVersion | cut -f 1 -d .) | |
| OSX_MINOR_VERSION := $(shell sw_vers -productVersion | cut -f 2 -d .) | |
| endif | |
| # Linux | |
| ifeq ($(LINUX), 1) | |
| CXX ?= /usr/bin/g++ | |
| GCCVERSION := $(shell $(CXX) -dumpversion | cut -f1,2 -d.) | |
| # We will also explicitly add stdc++ to the link target. | |
| LIBRARIES += stdc++ | |
| VERSIONFLAGS += -Wl,-soname,$(DYNAMIC_VERSIONED_NAME_SHORT) -Wl,-rpath,$(ORIGIN)/../lib | |
| endif | |
| # OS X: | |
| # clang++ instead of g++ | |
| # libstdc++ for NVCC compatibility on OS X >= 10.9 with CUDA < 7.0 | |
| ifeq ($(OSX), 1) | |
| CXX := /usr/bin/clang++ | |
| ifeq ($(USE_CUDA), 1) | |
| CUDA_VERSION := $(shell $(CUDA_DIR)/bin/nvcc -V | grep -o 'release [0-9.]*' | tr -d '[a-z ]') | |
| ifeq ($(shell echo | awk '{exit $(CUDA_VERSION) < 7.0;}'), 1) | |
| CXXFLAGS += -stdlib=libstdc++ | |
| LINKFLAGS += -stdlib=libstdc++ | |
| endif | |
| # clang throws this warning for cuda headers | |
| WARNINGS += -Wno-unneeded-internal-declaration | |
| # 10.11 strips DYLD_* env vars so link CUDA (rpath is available on 10.5+) | |
| OSX_10_OR_LATER := $(shell [ $(OSX_MAJOR_VERSION) -ge 10 ] && echo true) | |
| OSX_10_5_OR_LATER := $(shell [ $(OSX_MINOR_VERSION) -ge 5 ] && echo true) | |
| ifeq ($(OSX_10_OR_LATER),true) | |
| ifeq ($(OSX_10_5_OR_LATER),true) | |
| LDFLAGS += -Wl,-rpath,$(CUDA_LIB_DIR) | |
| endif | |
| endif | |
| endif | |
| # we need to explicitly ask for the rpath to be obeyed | |
| ORIGIN := @loader_path | |
| VERSIONFLAGS += -Wl,-install_name,@rpath/$(DYNAMIC_VERSIONED_NAME_SHORT) -Wl,-rpath,$(ORIGIN)/../../build/lib | |
| else | |
| ORIGIN := \$$ORIGIN | |
| endif | |
| # Custom compiler | |
| ifdef CUSTOM_CXX | |
| CXX := $(CUSTOM_CXX) | |
| endif | |
| # Static linking | |
| ifneq (,$(findstring clang++,$(CXX))) | |
| STATIC_LINK_COMMAND := -Wl,-force_load $(STATIC_NAME) | |
| else ifneq (,$(findstring g++,$(CXX))) | |
| STATIC_LINK_COMMAND := -Wl,--whole-archive $(STATIC_NAME) -Wl,--no-whole-archive | |
| else | |
| # The following line must not be indented with a tab, since we are not inside a target | |
| $(error Cannot static link with the $(CXX) compiler) | |
| endif | |
| # Debugging | |
| ifeq ($(DEBUG), 1) | |
| COMMON_FLAGS += -DDEBUG -g -O0 | |
| NVCCFLAGS += -G | |
| else | |
| COMMON_FLAGS += -DNDEBUG -O3 | |
| endif | |
| # configure IO libraries | |
| ifeq ($(USE_OPENCV), 1) | |
| COMMON_FLAGS += -DUSE_OPENCV | |
| endif | |
| ifeq ($(USE_LEVELDB), 1) | |
| COMMON_FLAGS += -DUSE_LEVELDB | |
| endif | |
| ifeq ($(USE_LMDB), 1) | |
| COMMON_FLAGS += -DUSE_LMDB | |
| ifeq ($(ALLOW_LMDB_NOLOCK), 1) | |
| COMMON_FLAGS += -DALLOW_LMDB_NOLOCK | |
| endif | |
| endif | |
| # CPU-only configuration | |
| ifeq ($(USE_CUDA), 1) | |
| COMMON_FLAGS += -DUSE_CUDA | |
| else | |
| COMMON_FLAGS += -DCPU_ONLY # For Caffe | |
| COMMON_FLAGS += -DUSE_CPU_ONLY | |
| endif | |
| LIBRARY_DIRS += $(LIB_BUILD_DIR) | |
| # Automatic dependency generation (nvcc is handled separately) | |
| CXXFLAGS += -MMD -MP | |
| # Complete build flags. | |
| COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) | |
| CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) | |
| NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) | |
| LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) | |
| USE_PKG_CONFIG ?= 0 | |
| ifeq ($(USE_PKG_CONFIG), 1) | |
| PKG_CONFIG := $(shell pkg-config opencv --libs) | |
| else | |
| PKG_CONFIG := | |
| endif | |
| LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) $(PKG_CONFIG) \ | |
| $(foreach library,$(LIBRARIES),-l$(library)) | |
| ############################## | |
| # Define build targets | |
| ############################## | |
| .PHONY: all lib clean docs linecount lint lintclean examples $(DIST_ALIASES) \ | |
| warn everything | |
| all: lib examples | |
| lib: $(STATIC_NAME) $(DYNAMIC_NAME) | |
| everything: $(EVERYTHING_TARGETS) | |
| linecount: | |
| cloc --read-lang-def=$(PROJECT).cloc \ | |
| src/$(PROJECT) include/$(PROJECT) examples | |
| lint: $(EMPTY_LINT_REPORT) | |
| lintclean: | |
| @ $(RM) -r $(LINT_OUTPUT_DIR) $(EMPTY_LINT_REPORT) $(NONEMPTY_LINT_REPORT) | |
| docs: $(DOXYGEN_OUTPUT_DIR) | |
| @ cd ./docs ; ln -sfn ../$(DOXYGEN_OUTPUT_DIR)/html doxygen | |
| $(DOXYGEN_OUTPUT_DIR): $(DOXYGEN_CONFIG_FILE) $(DOXYGEN_SOURCES) | |
| $(DOXYGEN_COMMAND) $(DOXYGEN_CONFIG_FILE) | |
| $(EMPTY_LINT_REPORT): $(LINT_OUTPUTS) | $(BUILD_DIR) | |
| @ cat $(LINT_OUTPUTS) > $@ | |
| @ if [ -s "$@" ]; then \ | |
| cat $@; \ | |
| mv $@ $(NONEMPTY_LINT_REPORT); \ | |
| echo "Found one or more lint errors."; \ | |
| exit 1; \ | |
| fi; \ | |
| $(RM) $(NONEMPTY_LINT_REPORT); \ | |
| echo "No lint errors!"; | |
| $(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % $(LINT_SCRIPT) | $(LINT_OUTPUT_DIR) | |
| @ mkdir -p $(dir $@) | |
| @ python $(LINT_SCRIPT) $< 2>&1 \ | |
| | grep -v "^Done processing " \ | |
| | grep -v "^Total errors found: 0" \ | |
| > $@ \ | |
| || true | |
| examples: $(EXAMPLE_BINS) | |
| warn: $(EMPTY_WARN_REPORT) | |
| $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) | |
| @ cat $(ALL_WARNS) > $@ | |
| @ if [ -s "$@" ]; then \ | |
| cat $@; \ | |
| mv $@ $(NONEMPTY_WARN_REPORT); \ | |
| echo "Compiler produced one or more warnings."; \ | |
| exit 1; \ | |
| fi; \ | |
| $(RM) $(NONEMPTY_WARN_REPORT); \ | |
| echo "No compiler warnings!"; | |
| $(ALL_WARNS): %.o.$(WARNS_EXT) : %.o | |
| $(BUILD_DIR_LINK): $(BUILD_DIR)/.linked | |
| # Create a target ".linked" in this BUILD_DIR to tell Make that the "build" link | |
| # is currently correct, then delete the one in the OTHER_BUILD_DIR in case it | |
| # exists and $(DEBUG) is toggled later. | |
| $(BUILD_DIR)/.linked: | |
| @ mkdir -p $(BUILD_DIR) | |
| @ $(RM) $(OTHER_BUILD_DIR)/.linked | |
| @ $(RM) -r $(BUILD_DIR_LINK) | |
| @ ln -s $(BUILD_DIR) $(BUILD_DIR_LINK) | |
| @ touch $@ | |
| $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) | |
| @ mkdir -p $@ | |
| $(DYNAMIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) | |
| @ echo LD -o $@ | |
| $(Q)$(CXX) -shared -o $@ $(OBJS) $(VERSIONFLAGS) $(LINKFLAGS) $(LDFLAGS) | |
| @ cd $(LIB_BUILD_DIR); rm -f $(DYNAMIC_NAME_SHORT); ln -s $(DYNAMIC_VERSIONED_NAME_SHORT) $(DYNAMIC_NAME_SHORT) | |
| $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) | |
| @ echo AR -o $@ | |
| $(Q)ar rcs $@ $(OBJS) | |
| $(BUILD_DIR)/%.o: %.cpp | $(ALL_BUILD_DIRS) | |
| @ echo CXX $< | |
| $(Q)$(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ | |
| || (cat $@.$(WARNS_EXT); exit 1) | |
| @ cat $@.$(WARNS_EXT) | |
| $(BUILD_DIR)/cuda/%.o: %.cu | $(ALL_BUILD_DIRS) | |
| @ echo NVCC $< | |
| $(Q)$(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -M $< -o ${@:.o=.d} \ | |
| -odir $(@D) | |
| $(Q)$(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ | |
| || (cat $@.$(WARNS_EXT); exit 1) | |
| @ cat $@.$(WARNS_EXT) | |
| $(EXAMPLE_BINS): %.bin : %.o | $(DYNAMIC_NAME) | |
| @ echo CXX/LD -o $@ | |
| $(Q)$(CXX) $< -o $@ $(LINKFLAGS) -l$(LIBRARY_NAME) $(LDFLAGS) \ | |
| -Wl,-rpath,$(ORIGIN)/../../lib | |
| clean: | |
| @- $(RM) -rf $(ALL_BUILD_DIRS) | |
| @- $(RM) -rf $(OTHER_BUILD_DIR) | |
| @- $(RM) -rf $(BUILD_DIR_LINK) | |
| @- $(RM) -rf $(DISTRIBUTE_DIR) | |
| $(DIST_ALIASES): $(DISTRIBUTE_DIR) | |
| $(DISTRIBUTE_DIR): all | |
| @ mkdir -p $(DISTRIBUTE_SUBDIRS) | |
| # add include | |
| cp -r include $(DISTRIBUTE_DIR)/ | |
| # add example binaries | |
| cp $(EXAMPLE_BINS) $(DISTRIBUTE_DIR)/bin | |
| # add libraries | |
| cp $(STATIC_NAME) $(DISTRIBUTE_DIR)/lib | |
| install -m 644 $(DYNAMIC_NAME) $(DISTRIBUTE_DIR)/lib | |
| cd $(DISTRIBUTE_DIR)/lib; rm -f $(DYNAMIC_NAME_SHORT); ln -s $(DYNAMIC_VERSIONED_NAME_SHORT) $(DYNAMIC_NAME_SHORT) | |
| -include $(DEPS) | |