Advertisement
Guest User

Untitled

a guest
Jul 11th, 2014
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.49 KB | None | 0 0
  1. # The makefile for caffe. Pretty hacky.
  2. PROJECT := caffe
  3.  
  4. CONFIG_FILE := Makefile.config
  5. include $(CONFIG_FILE)
  6.  
  7. # The target static library and shared library name
  8. LIB_BUILD_DIR := $(BUILD_DIR)/lib
  9. NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so
  10. STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a
  11.  
  12. ##############################
  13. # Get all source files
  14. ##############################
  15. # CXX_SRCS are the source files excluding the test ones.
  16. CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp")
  17. # HXX_SRCS are the header files
  18. HXX_SRCS := $(shell find include/$(PROJECT) -name "*.hpp")
  19. # CU_SRCS are the cuda source files
  20. CU_SRCS := $(shell find src/$(PROJECT) -name "*.cu")
  21. # TEST_SRCS are the test source files
  22. TEST_MAIN_SRC := src/$(PROJECT)/test/test_caffe_main.cpp
  23. TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp")
  24. TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS))
  25. GTEST_SRC := src/gtest/gtest-all.cpp
  26. # TEST_HDRS are the test header files
  27. TEST_HDRS := $(shell find src/$(PROJECT) -name "test_*.hpp")
  28. # TOOL_SRCS are the source files for the tool binaries
  29. TOOL_SRCS := $(shell find tools -name "*.cpp")
  30. # EXAMPLE_SRCS are the source files for the example binaries
  31. EXAMPLE_SRCS := $(shell find examples -name "*.cpp")
  32. # BUILD_INCLUDE_DIR contains any generated header files we want to include.
  33. BUILD_INCLUDE_DIR := $(BUILD_DIR)/src
  34. # PROTO_SRCS are the protocol buffer definitions
  35. PROTO_SRC_DIR := src/$(PROJECT)/proto
  36. PROTO_SRCS := $(wildcard $(PROTO_SRC_DIR)/*.proto)
  37. # PROTO_BUILD_DIR will contain the .cc and obj files generated from
  38. # PROTO_SRCS; PROTO_BUILD_INCLUDE_DIR will contain the .h header files
  39. PROTO_BUILD_DIR := $(BUILD_DIR)/$(PROTO_SRC_DIR)
  40. PROTO_BUILD_INCLUDE_DIR := $(BUILD_INCLUDE_DIR)/$(PROJECT)/proto
  41. # NONGEN_CXX_SRCS includes all source/header files except those generated
  42. # automatically (e.g., by proto).
  43. NONGEN_CXX_SRCS := $(shell find \
  44.     src/$(PROJECT) \
  45.     include/$(PROJECT) \
  46.     python/$(PROJECT) \
  47.     matlab/$(PROJECT) \
  48.     examples \
  49.     tools \
  50.     -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh")
  51. LINT_REPORT := $(BUILD_DIR)/cpp_lint.log
  52. FAILED_LINT_REPORT := $(BUILD_DIR)/cpp_lint.error_log
  53. # PY$(PROJECT)_SRC is the python wrapper for $(PROJECT)
  54. PY$(PROJECT)_SRC := python/$(PROJECT)/_$(PROJECT).cpp
  55. PY$(PROJECT)_SO := python/$(PROJECT)/_$(PROJECT).so
  56. # MAT$(PROJECT)_SRC is the matlab wrapper for $(PROJECT)
  57. MAT$(PROJECT)_SRC := matlab/$(PROJECT)/mat$(PROJECT).cpp
  58. ifneq ($(MATLAB_DIR),)
  59.     MAT_SO_EXT := $(shell $(MATLAB_DIR)/bin/mexext)
  60. endif
  61. MAT$(PROJECT)_SO := matlab/$(PROJECT)/$(PROJECT).$(MAT_SO_EXT)
  62.  
  63. ##############################
  64. # Derive generated files
  65. ##############################
  66. # The generated files for protocol buffers
  67. PROTO_GEN_HEADER_SRCS := $(addprefix $(PROTO_BUILD_DIR)/, \
  68.         $(notdir ${PROTO_SRCS:.proto=.pb.h}))
  69. PROTO_GEN_HEADER := $(addprefix $(PROTO_BUILD_INCLUDE_DIR)/, \
  70.         $(notdir ${PROTO_SRCS:.proto=.pb.h}))
  71. HXX_SRCS += $(PROTO_GEN_HEADER)
  72. PROTO_GEN_CC := $(addprefix $(BUILD_DIR)/, ${PROTO_SRCS:.proto=.pb.cc})
  73. PY_PROTO_BUILD_DIR := python/$(PROJECT)/proto
  74. PY_PROTO_INIT := python/$(PROJECT)/proto/__init__.py
  75. PROTO_GEN_PY := $(foreach file,${PROTO_SRCS:.proto=_pb2.py}, \
  76.         $(PY_PROTO_BUILD_DIR)/$(notdir $(file)))
  77. # The objects corresponding to the source files
  78. # These objects will be linked into the final shared library, so we
  79. # exclude the tool, example, and test objects.
  80. CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o})
  81. CU_OBJS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo})
  82. PROTO_OBJS := ${PROTO_GEN_CC:.cc=.o}
  83. OBJ_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT)
  84. LAYER_BUILD_DIR := $(OBJ_BUILD_DIR)/layers
  85. UTIL_BUILD_DIR := $(OBJ_BUILD_DIR)/util
  86. OBJS := $(PROTO_OBJS) $(CXX_OBJS) $(CU_OBJS)
  87. # tool, example, and test objects
  88. TOOL_OBJS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o})
  89. TOOL_BUILD_DIR := $(BUILD_DIR)/tools
  90. TEST_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT)/test
  91. TEST_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o})
  92. GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o})
  93. GTEST_BUILD_DIR := $(dir $(GTEST_OBJ))
  94. EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o})
  95. EXAMPLE_BUILD_DIR := $(BUILD_DIR)/examples
  96. EXAMPLE_BUILD_DIRS := $(EXAMPLE_BUILD_DIR)
  97. EXAMPLE_BUILD_DIRS += $(foreach obj,$(EXAMPLE_OBJS),$(dir $(obj)))
  98. # tool, example, and test bins
  99. TOOL_BINS := ${TOOL_OBJS:.o=.bin}
  100. EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin}
  101. # Put the test binaries in build/test for convenience.
  102. TEST_BIN_DIR := $(BUILD_DIR)/test
  103. TEST_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \
  104.         $(foreach obj,$(TEST_OBJS),$(basename $(notdir $(obj))))))
  105. TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin
  106.  
  107. ##############################
  108. # Derive include and lib directories
  109. ##############################
  110. CUDA_INCLUDE_DIR := $(CUDA_DIR)/include
  111. CUDA_LIB_DIR := $(CUDA_DIR)/lib64 $(CUDA_DIR)/lib
  112.  
  113. INCLUDE_DIRS += $(BUILD_INCLUDE_DIR)
  114. INCLUDE_DIRS += ./src ./include $(CUDA_INCLUDE_DIR)
  115. LIBRARY_DIRS += $(CUDA_LIB_DIR)
  116. LIBRARIES := cudart cublas curand \
  117.     pthread \
  118.     glog protobuf leveldb snappy \
  119.     boost_system \
  120.     hdf5_hl hdf5 \
  121.     opencv_core opencv_highgui opencv_imgproc
  122. PYTHON_LIBRARIES := boost_python python2.7
  123. WARNINGS := -Wall
  124. LIBGLOG := /homes/ad6813/.local/lib/glog
  125.  
  126. ##############################
  127. # Set build directories
  128. ##############################
  129.  
  130. DISTRIBUTE_SUBDIRS := $(DISTRIBUTE_DIR)/bin $(DISTRIBUTE_DIR)/lib
  131. DIST_ALIASES := dist
  132. ifneq ($(strip $(DISTRIBUTE_DIR)),distribute)
  133.         DIST_ALIASES += distribute
  134. endif
  135.  
  136. ALL_BUILD_DIRS := $(sort \
  137.         $(BUILD_DIR) $(LIB_BUILD_DIR) $(OBJ_BUILD_DIR) \
  138.         $(LAYER_BUILD_DIR) $(UTIL_BUILD_DIR) $(TOOL_BUILD_DIR) \
  139.         $(TEST_BUILD_DIR) $(TEST_BIN_DIR) $(GTEST_BUILD_DIR) \
  140.         $(EXAMPLE_BUILD_DIRS) \
  141.         $(PROTO_BUILD_DIR) $(PROTO_BUILD_INCLUDE_DIR) $(PY_PROTO_BUILD_DIR) \
  142.         $(DISTRIBUTE_SUBDIRS))
  143.  
  144. ##############################
  145. # Configure build
  146. ##############################
  147.  
  148. # Determine platform
  149. UNAME := $(shell uname -s)
  150. ifeq ($(UNAME), Linux)
  151.     LINUX := 1
  152. else ifeq ($(UNAME), Darwin)
  153.     OSX := 1
  154. endif
  155.  
  156. ifeq ($(LINUX), 1)
  157.     CXX := /usr/bin/g++
  158. endif
  159.  
  160. # OS X:
  161. # clang++ instead of g++
  162. # libstdc++ instead of libc++ for CUDA compatibility on 10.9
  163. ifeq ($(OSX), 1)
  164.     CXX := /usr/bin/clang++
  165.     ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),)
  166.         CXXFLAGS += -stdlib=libstdc++
  167.     endif
  168. endif
  169.  
  170. # Debugging
  171. DEBUG ?= 0
  172. ifeq ($(DEBUG), 1)
  173.     COMMON_FLAGS := -DDEBUG -g -O0
  174. else
  175.     COMMON_FLAGS := -DNDEBUG -O2
  176. endif
  177.  
  178. # BLAS configuration (default = ATLAS)
  179. BLAS ?= atlas
  180. ifeq ($(BLAS), mkl)
  181.     # MKL
  182.     LIBRARIES += mkl_rt
  183.     COMMON_FLAGS += -DUSE_MKL
  184.     MKL_DIR = /opt/intel/mkl
  185.     BLAS_INCLUDE ?= $(MKL_DIR)/include
  186.     BLAS_LIB ?= $(MKL_DIR)/lib $(MKL_DIR)/lib/intel64
  187. else ifeq ($(BLAS), open)
  188.     # OpenBLAS
  189.     LIBRARIES += openblas
  190. else
  191.     # ATLAS
  192.     ifeq ($(LINUX), 1)
  193.         ifeq ($(BLAS), atlas)
  194.             # Linux simply has cblas and atlas
  195.             LIBRARIES += cblas atlas
  196.         endif
  197.     else ifeq ($(OSX), 1)
  198.         # OS X packages atlas as the vecLib framework
  199.         BLAS_INCLUDE ?= /System/Library/Frameworks/vecLib.framework/Versions/Current/Headers/
  200.         LIBRARIES += cblas
  201.         LDFLAGS += -framework vecLib
  202.     endif
  203. endif
  204. INCLUDE_DIRS += $(BLAS_INCLUDE)
  205. LIBRARY_DIRS += $(BLAS_LIB)
  206.  
  207. # Complete build flags.
  208. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir))
  209. CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS)
  210. NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
  211. LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \
  212.         $(foreach library,$(LIBRARIES),-l$(library))
  213. PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library))
  214.  
  215. # 'superclean' target recursively* deletes all files ending with an extension
  216. # in $(SUPERCLEAN_EXTS) below.  This may be useful if you've built older
  217. # versions of Caffe that do not place all generated files in a location known
  218. # to the 'clean' target.
  219. #
  220. # 'supercleanlist' will list the files to be deleted by make superclean.
  221. #
  222. # * Recursive with the exception that symbolic links are never followed, per the
  223. # default behavior of 'find'.
  224. SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo
  225.  
  226. ##############################
  227. # Define build targets
  228. ##############################
  229. .PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \
  230.     py mat py$(PROJECT) mat$(PROJECT) proto runtest \
  231.     superclean supercleanlist supercleanfiles
  232.  
  233. all: $(NAME) $(STATIC_NAME) tools examples
  234.  
  235. linecount: clean
  236.     cloc --read-lang-def=$(PROJECT).cloc src/$(PROJECT)/
  237.  
  238. lint: $(LINT_REPORT)
  239.  
  240. $(LINT_REPORT): $(NONGEN_CXX_SRCS) | $(BUILD_DIR)
  241.     @ (python ./scripts/cpp_lint.py $(NONGEN_CXX_SRCS) > $(LINT_REPORT) 2>&1 \
  242.         && ($(RM) $(FAILED_LINT_REPORT); echo "No lint errors!")) || ( \
  243.             mv $(LINT_REPORT) $(FAILED_LINT_REPORT); \
  244.             grep -v "^Done processing " $(FAILED_LINT_REPORT); \
  245.             echo "Found 1 or more lint errors; see log at $(FAILED_LINT_REPORT)"; \
  246.             exit 1)
  247.  
  248. test: $(TEST_ALL_BIN) $(TEST_BINS)
  249.  
  250. tools: $(TOOL_BINS)
  251.  
  252. examples: $(EXAMPLE_BINS)
  253.  
  254. py$(PROJECT): py
  255.  
  256. py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY)
  257.  
  258. $(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC)
  259.     $(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \
  260.         $(STATIC_NAME) $(CXXFLAGS) $(PYTHON_LDFLAGS)
  261.     @ echo
  262.  
  263. mat$(PROJECT): mat
  264.  
  265. mat: $(MAT$(PROJECT)_SO)
  266.  
  267. $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME)
  268.     @ if [ -z "$(MATLAB_DIR)" ]; then \
  269.         echo "MATLAB_DIR must be specified in $(CONFIG_FILE)" \
  270.             "to build mat$(PROJECT)."; \
  271.         exit 1; \
  272.     fi
  273.     $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) $(STATIC_NAME) \
  274.             CXXFLAGS="\$$CXXFLAGS $(CXXFLAGS) $(WARNINGS)" \
  275.             CXXLIBS="\$$CXXLIBS $(LDFLAGS)" -o $@
  276.     @ echo
  277.  
  278. runtest: $(TEST_ALL_BIN)
  279.     $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle
  280.  
  281. $(ALL_BUILD_DIRS):
  282.     @ mkdir -p $@
  283.  
  284. $(NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR)
  285.     $(CXX) -shared -o $@ $(OBJS) $(CXXFLAGS) $(LDFLAGS) $(WARNINGS)
  286.     @ echo
  287.  
  288. $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR)
  289.     ar rcs $@ $(PROTO_OBJS) $(OBJS)
  290.     @ echo
  291.  
  292. $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \
  293.         | $(TEST_BUILD_DIR)
  294.     $(CXX) $< $(CXXFLAGS) -c -o $@
  295.     @ echo
  296.  
  297. $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \
  298.         | $(TEST_BIN_DIR)
  299.     $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \
  300.         -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS)
  301.     @ echo
  302.  
  303. $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \
  304.         | $(TEST_BIN_DIR)
  305.     $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \
  306.         -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS)
  307.     @ echo
  308.  
  309. $(TOOL_BINS): %.bin : %.o $(STATIC_NAME)
  310.     $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS)
  311.     @ echo
  312.  
  313. $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME)
  314.     $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS)
  315.     @ echo
  316.  
  317. $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \
  318.         | $(LAYER_BUILD_DIR)
  319.     $(CXX) $< $(CXXFLAGS) -c -o $@
  320.     @ echo
  321.  
  322. $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \
  323.         | $(PROTO_BUILD_DIR)
  324.     $(CXX) $< $(CXXFLAGS) -c -o $@
  325.     @ echo
  326.  
  327. $(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR)
  328.     $(CXX) $< $(CXXFLAGS) -c -o $@
  329.     @ echo
  330.  
  331. $(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR)
  332.     $(CXX) $< $(CXXFLAGS) -c -o $@
  333.     @ echo
  334.  
  335. $(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \
  336.         | $(LAYER_BUILD_DIR)
  337.     $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@
  338.     @ echo
  339.  
  340. $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR)
  341.     $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@
  342.     @ echo
  343.  
  344. $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR)
  345.     $(CXX) $< $(CXXFLAGS) -c -o $@ $(LDFLAGS)
  346.     @ echo
  347.  
  348. $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \
  349.         | $(EXAMPLE_BUILD_DIRS)
  350.     $(CXX) $< $(CXXFLAGS) -c -o $@ $(LDFLAGS)
  351.     @ echo
  352.  
  353. $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS)
  354.     $(CXX) $< $(CXXFLAGS) -c -o $@
  355.     @ echo
  356.  
  357. proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER)
  358.  
  359. $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \
  360.         $(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR)
  361.     protoc --proto_path=src --cpp_out=build/src $<
  362.     @ echo
  363.  
  364. $(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \
  365.         $(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR)
  366.     protoc --proto_path=src --python_out=python $<
  367.     @ echo
  368.  
  369. $(PY_PROTO_INIT): | $(PY_PROTO_BUILD_DIR)
  370.     touch $(PY_PROTO_INIT)
  371.  
  372. clean:
  373.     @- $(RM) -rf $(ALL_BUILD_DIRS)
  374.     @- $(RM) -rf $(DISTRIBUTE_DIR)
  375.     @- $(RM) $(PY$(PROJECT)_SO)
  376.     @- $(RM) $(MAT$(PROJECT)_SO)
  377.  
  378. supercleanfiles:
  379.     $(eval SUPERCLEAN_FILES := $(strip \
  380.             $(foreach ext,$(SUPERCLEAN_EXTS), $(shell find . -name '*$(ext)' \
  381.             -not -path './data/*'))))
  382.  
  383. supercleanlist: supercleanfiles
  384.     @ \
  385.     if [ -z "$(SUPERCLEAN_FILES)" ]; then \
  386.         echo "No generated files found."; \
  387.     else \
  388.         echo $(SUPERCLEAN_FILES) | tr ' ' '\n'; \
  389.     fi
  390.  
  391. superclean: clean supercleanfiles
  392.     @ \
  393.     if [ -z "$(SUPERCLEAN_FILES)" ]; then \
  394.         echo "No generated files found."; \
  395.     else \
  396.         echo "Deleting the following generated files:"; \
  397.         echo $(SUPERCLEAN_FILES) | tr ' ' '\n'; \
  398.         $(RM) $(SUPERCLEAN_FILES); \
  399.     fi
  400.  
  401. $(DIST_ALIASES): $(DISTRIBUTE_DIR)
  402.  
  403. $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS)
  404.     # add include
  405.     cp -r include $(DISTRIBUTE_DIR)/
  406.     # add tool and example binaries
  407.     cp $(TOOL_BINS) $(DISTRIBUTE_DIR)/bin
  408.     cp $(EXAMPLE_BINS) $(DISTRIBUTE_DIR)/bin
  409.     # add libraries
  410.     cp $(NAME) $(DISTRIBUTE_DIR)/lib
  411.     cp $(STATIC_NAME) $(DISTRIBUTE_DIR)/lib
  412.     # add python - it's not the standard way, indeed...
  413.     cp -r python $(DISTRIBUTE_DIR)/python
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement