Makefile.in 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #+++++++++++++++++++++++++++++++++configure++++++++++++++++++++++++++++++++++++++++
  2. # OS=Windows,Linux,Android
  3. # ARCH=x86,x86_64,arm,aarch64
  4. # CC = $(CROSS_COMPILE)gcc
  5. # CXX = $(CROSS_COMPILE)g++
  6. # CPPFLAGS += $(addprefix -D, $(DEFINES))
  7. # CPPFLAGS += $(addprefix -I, $(INCDIRS))
  8. # LDFLAGS += $(addprefix -L, $(LIBDIRS))
  9. # LDFLAGS += $(addprefix -l, $(LIBS))
  10. #
  11. # Usage:
  12. # make all TARGET=libxx TARGET_TYPE=SHARED \
  13. # CROSS_COMPILE=arm-linux-androideabi- \
  14. # DEFINES=USE_OPENCV \
  15. # LIBS="opencv_core opencv_highgui"
  16. #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  17. # VARIABLES
  18. TARGET=test
  19. #BUILD_TYPE=DEBUG,RELEASE
  20. BUILD_TYPE=DEBUG
  21. #TARGET_TYPE=EXECUTABLE,SHARED,STATIC
  22. TARGET_TYPE=EXECUTABLE
  23. # COMMANDS
  24. ifdef CROSS_COMPILE
  25. CC = $(CROSS_COMPILE)gcc
  26. CXX = $(CROSS_COMPILE)g++
  27. CPP = $(CC) -E
  28. AS = $(CROSS_COMPILE)as
  29. LD = $(CROSS_COMPILE)ld
  30. AR = $(CROSS_COMPILE)ar
  31. NM = $(CROSS_COMPILE)nm
  32. STRIP = $(CROSS_COMPILE)strip
  33. OBJCOPY = $(CROSS_COMPILE)objcopy
  34. OBJDUMP = $(CROSS_COMPILE)objdump
  35. endif
  36. MKDIR = -mkdir -p
  37. CP = -cp -r
  38. RM = -rm -r
  39. # PLATFORM: OS, ARCH
  40. CC_VERSION=$(shell $(CC) --version 2>&1 | head -n 1)
  41. TARGET_PLATFORM=$(shell $(CC) -v 2>&1 | grep Target | sed 's/Target: //')
  42. ifneq ($(findstring mingw, $(TARGET_PLATFORM)), )
  43. OS=Windows
  44. endif
  45. ifneq ($(findstring android, $(TARGET_PLATFORM)), )
  46. OS=Android
  47. endif
  48. ifndef OS
  49. OS=Linux
  50. endif
  51. ifndef ARCH
  52. ARCH=$(shell echo $(TARGET_PLATFORM) | awk -F'-' '{print $$1}')
  53. endif
  54. # CFLAGS, CXXFLAGS, ARFLAGS
  55. ifeq ($(BUILD_TYPE), DEBUG)
  56. DEFAULT_CFLAGS = -g
  57. endif
  58. DEFAULT_CFLAGS += -Wall -O3 -fPIC
  59. ifndef CFLAGS
  60. CFLAGS := $(DEFAULT_CFLAGS) -std=c99 $(MAKE_CFLAGS)
  61. endif
  62. ifndef CXXFLAGS
  63. CXXFLAGS := $(DEFAULT_CFLAGS) -std=c++11 $(MAKE_CXXFLAGS)
  64. endif
  65. ifndef ARFLAGS
  66. ARFLAGS := cr
  67. endif
  68. # DIRS
  69. PREFIX = install
  70. ifeq ($(OS), Linux)
  71. PREFIX = /usr/local
  72. endif
  73. INCDIR = include
  74. LIBDIR = lib
  75. SRCDIR = src
  76. BINDIR = bin
  77. DEPDIR = 3rd
  78. CONFDIR = etc
  79. DISTDIR = dist
  80. DOCDIR = doc
  81. SRCDIRS += $(shell find $(SRCDIR) -type d)
  82. INCDIRS += $(INCDIR) $(DEPDIR) $(DEPDIR)/include $(SRCDIRS)
  83. LIBDIRS += $(LIBDIR) $(DEPDIR)/lib $(DEPDIR)/lib/$(TARGET_PLATFORM)
  84. # CPPFLAGS
  85. ifeq ($(OS), Windows)
  86. CPPFLAGS += -D_WIN32_WINNT=0x600
  87. ifeq ($(TARGET_TYPE), SHARED)
  88. CPPFLAGS += -DDLL_EXPORTS
  89. endif
  90. endif
  91. ifeq ($(BUILD_TYPE), DEBUG)
  92. CPPFLAGS += -DDEBUG
  93. endif
  94. CPPFLAGS += $(addprefix -D, $(DEFINES))
  95. CPPFLAGS += $(addprefix -I, $(INCDIRS))
  96. # LDFLAGS
  97. ifeq ($(OS), Windows)
  98. LDFLAGS += -static-libgcc -static-libstdc++
  99. endif
  100. LDFLAGS += $(addprefix -L, $(LIBDIRS))
  101. LDFLAGS += $(addprefix -l, $(LIBS))
  102. ifeq ($(OS), Windows)
  103. LDFLAGS += -Wl,-Bdynamic -lwinmm -liphlpapi -lws2_32
  104. LDFLAGS += -Wl,-Bstatic -lstdc++ -lpthread -lm
  105. else
  106. ifeq ($(OS), Android)
  107. LDFLAGS += -Wl,-Bdynamic -lstdc++ -lm -llog
  108. else
  109. LDFLAGS += -lstdc++ -lpthread -lm
  110. endif
  111. endif
  112. SRCS += $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c $(dir)/*.cc $(dir)/*.cpp))
  113. ifeq ($(SRCS), )
  114. SRCS = $(wildcard *.c *.cc *.cpp)
  115. endif
  116. #OBJS += $(patsubst %.c, %.o, $(SRCS))
  117. #OBJS += $(patsubst %.cc, %.o, $(SRCS))
  118. #OBJS += $(patsubst %.cpp, %.o, $(SRCS))
  119. OBJS := $(addsuffix .o, $(basename $(SRCS)))
  120. INSTALLED_INCS=$(addprefix $(PREFIX)/$(INCDIR)/, $(shell ls $(INCDIR)))
  121. INSTALLED_LIBS=$(addprefix $(PREFIX)/$(LIBDIR)/, $(shell ls $(LIBDIR)))
  122. INSTALLED_BINS=$(addprefix $(PREFIX)/$(BINDIR)/, $(shell ls $(BINDIR)))
  123. # info
  124. $(info $(CC_VERSION))
  125. $(info OS = $(OS))
  126. $(info ARCH = $(ARCH))
  127. $(info MAKE = $(MAKE))
  128. $(info CC = $(CC))
  129. $(info CXX = $(CXX))
  130. $(info CFLAGS = $(CFLAGS))
  131. $(info CXXFLAGS = $(CXXFLAGS))
  132. $(info CPPFLAGS = $(CPPFLAGS))
  133. $(info LDFLAGS = $(LDFLAGS))
  134. $(info TARGET = $(TARGET))
  135. $(info TARGET_TYPE = $(TARGET_TYPE))
  136. $(info TARGET_PLATFORM = $(TARGET_PLATFORM))
  137. $(info BUILD_TYPE = $(BUILD_TYPE))
  138. $(info SRCS=$(SRCS))
  139. $(info OBJS=$(OBJS))
  140. $(info INSTALLED_INCS=$(INSTALLED_INCS))
  141. $(info INSTALLED_LIBS=$(INSTALLED_LIBS))
  142. $(info INSTALLED_BINS=$(INSTALLED_BINS))
  143. default: all
  144. all: prepare $(TARGET)
  145. prepare:
  146. $(MKDIR) $(BINDIR) $(LIBDIR)
  147. $(TARGET): $(OBJS)
  148. ifeq ($(TARGET_TYPE), SHARED)
  149. ifeq ($(OS), Windows)
  150. $(CC) -shared $^ -o $(LIBDIR)/$@.dll $(LDFLAGS) -Wl,--output-def,$(LIBDIR)/$(@).def
  151. else
  152. $(CC) -shared $^ -o $(LIBDIR)/$@.so $(LDFLAGS)
  153. endif
  154. else
  155. ifeq ($(TARGET_TYPE), STATIC)
  156. $(AR) $(ARFLAGS) $(LIBDIR)/$@.a $^
  157. else
  158. ifeq ($(OS), Windows)
  159. $(CC) $^ -o $(BINDIR)/$@.exe $(LDFLAGS)
  160. else
  161. $(CC) $^ -o $(BINDIR)/$@ $(LDFLAGS)
  162. endif
  163. endif
  164. endif
  165. clean:
  166. $(RM) $(OBJS)
  167. $(RM) $(LIBDIR)
  168. $(RM) $(BINDIR)
  169. install:
  170. $(CP) $(INCDIR)/* $(PREFIX)/$(INCDIR)/
  171. $(CP) $(LIBDIR)/* $(PREFIX)/$(LIBDIR)/
  172. $(CP) $(BINDIR)/* $(PREFIX)/$(BINDIR)/
  173. uninstall:
  174. $(RM) $(INSTALLED_INCS)
  175. $(RM) $(INSTALLED_LIBS)
  176. $(RM) $(INSTALLED_BINS)
  177. dist:
  178. $(MKDIR) $(DISTDIR)
  179. $(CP) $(INCDIR) $(LIBDIR) $(BINDIR) $(CONFDIR) $(DOCDIR) $(DISTDIR)
  180. undist:
  181. $(RM) $(DISTDIR)
  182. .PHONY: default all prepare clean install uninstall dist undist