Makefile 3.9 KB

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