Makefile.in 4.8 KB

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