Makefile 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. ## --------------------------------
  2. # - initialization in top makefile
  3. #
  4. # here all variables used later on will be defined and initialized. also the
  5. # default target (i.e. the one made with a simple `make`) is redirected to do
  6. # something useful.
  7. #incomplete collection of warnings...
  8. CFLAGS_WARN=-Wall -Wextra -Wno-unused-parameter -Wno-strict-aliasing # -Wchar-subscripts -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wsign-compare -Wunused -Wuninitialized -Wpointer-arith -Wredundant-decls -Wmissing-declarations -Wlong-long -Wfloat-equal
  9. #some that are not really helpful
  10. # -Wpadded -Wunreachable-code
  11. #some more, only valid for C
  12. # -Wbad-function-cast -Wnested-externs -Wmissing-prototypes -Wstrict-prototypes
  13. ifdef OPTIMIZE
  14. CFLAGS=-fPIC -O3
  15. else
  16. CFLAGS=-fPIC -O0
  17. endif
  18. ifdef DEBUG
  19. CFLAGS+= -g $(CFLAGS_WARN) -DDEBUG
  20. else
  21. CFLAGS+= -g $(CFLAGS_WARN)
  22. endif
  23. CFLAGS+=-DUSE_64_BIT_PTR_CAST -DDISABLE_IPP_MAXMIN
  24. ifdef NOVISUAL
  25. CFLAGS+=-DNOVISUAL
  26. endif
  27. CFLAGS_CUDA=-Xcompiler "-fpic -O3 -pthread"
  28. PLATFORM:=$(shell uname -m)
  29. AR=ar
  30. CC=gcc
  31. CXX=g++
  32. CXXCUDA=nvcc
  33. SYMLINK=ln -sf
  34. DOXYGEN=doxygen
  35. PKGCONFIG=pkg-config
  36. SED=sed
  37. MOC=echo "QT MOC is required. Please define the variable MOC in Makefile.config. "
  38. CPPUNIT_MAIN=templates/cppUnitTestRunner.cpp
  39. #normal mode
  40. VERBOSE := @\#
  41. VERBOSE2 :=
  42. #abstract mode
  43. #VERBOSE := @
  44. #VERBOSE2 := @
  45. USE_STATIC_LIBRARIES=1
  46. ifdef USE_STATIC_LIBRARIES
  47. LINK_FILE_EXTENSION=a
  48. else
  49. LINK_FILE_EXTENSION=so
  50. endif
  51. # various rules to create directory names
  52. PROJECTDIR:=$(shell pwd)/
  53. BUILDDIR:=BUILD_$(PLATFORM)$(NICE_BUILD)/
  54. OBJDIR=$(BUILDDIR)$(SUBDIR)
  55. LIBDIR=$(BUILDDIR)$(SUBDIR)
  56. BINDIR=$(BUILDDIR)$(SUBDIR)
  57. PKGDIR=$(BUILDDIR)$(SUBDIR)
  58. LIBSYMLINKDIR=$(BUILDDIR)lib/
  59. BINSYMLINKDIR=$(BUILDDIR)bin/
  60. PKGSYMLINKDIR=$(BUILDDIR)pkgconfig/
  61. ifeq "$(PKG_CONFIG_PATH)" ""
  62. export PKG_CONFIG_PATH:=$(PROJECTDIR)/$(PKGSYMLINKDIR)
  63. else
  64. export PKG_CONFIG_PATH:=$(PROJECTDIR)/$(PKGSYMLINKDIR):$(PKG_CONFIG_PATH)
  65. endif
  66. # "global" variables
  67. ALL_OBJS:=
  68. ALL_LIBRARIES:=
  69. ALL_BINARIES:=
  70. ALL_CHECKS:=
  71. SUBDIR:=
  72. # various rules to create file names
  73. LIBNAME=lib$(subst /,_,$(patsubst %/,%,$(1)))
  74. # these are commands for the libdepend.inc files
  75. FILE_DEPEND_EXT=$(eval EXTLIBS_$(OBJDIR)$(1)+=$(2))
  76. FILE_DEPEND_INT=$(eval INTLIBS_$(OBJDIR)$(1)+=$(2))
  77. PKG_DEPEND_EXT=$(eval EXTLIBS_$(OBJDIR)+=$(1))
  78. PKG_DEPEND_EXT_ESSENTIAL=$(if $($(1)_CFLAGS)$($(1)_LDFLAGS),$(eval EXTLIBS_$(OBJDIR)+=$(1)),$(eval SKIP_BUILD_$(OBJDIR)=1))
  79. PKG_DEPEND_INT=$(eval INTLIBS_$(OBJDIR)+=$(1))
  80. PKG_DESCRIPTION=$(eval PKGDESC_$(OBJDIR)=$(1))
  81. PKG_VERSION=$(eval PKGVERS_$(OBJDIR)=$(1))
  82. # these are internal variables used within the Makefile.inc files and the
  83. # rules below
  84. PRINT_EXTLIB_LIST=$(EXTLIBS_$(1)) $(EXTLIBS_$(dir $1))
  85. PRINT_EXTLIB_PKGCONFIG=$(foreach l,$(call PRINT_EXTLIB_LIST,$(1)),$($(l)_PKGCONFIG))
  86. #PRINT_EXTLIB_CFLAGS=$(foreach l,$(call PRINT_EXTLIB_LIST,$(1)),$($(l)_CFLAGS))
  87. PRINT_EXTLIB_CFLAGS=$(foreach l,$(call PRINT_EXTLIB_LIST,$(1)),$(if $($(l)_PKGCONFIG),`pkg-config $($(l)_PKGCONFIG) --cflags` )$($(l)_CFLAGS))
  88. PRINT_EXTLIB_CFLAGS_NOPKG=$(foreach l,$(call PRINT_EXTLIB_LIST,$(1)),$($(l)_CFLAGS))
  89. PRINT_EXTLIB_LDFLAGS=$(foreach l,$(call PRINT_EXTLIB_LIST,$(1)),$(if $($(l)_PKGCONFIG),`pkg-config $($(l)_PKGCONFIG) --libs` )$($(l)_LDFLAGS))
  90. PRINT_EXTLIB_LDFLAGS_NOPKG=$(foreach l,$(call PRINT_EXTLIB_LIST,$(1)),$($(l)_LDFLAGS))
  91. PRINT_INTLIB_DEPS=$(foreach l,$(INTLIBS_$(1)) $(INTLIBS_$(dir $(1))),$(BUILDDIR)$(patsubst %/,%,$(l))/$(call LIBNAME,$(l))$(2))
  92. PRINT_INTLIB_PKGCONFIG=$(foreach l,$(INTLIBS_$(1)) $(INTLIBS_$(dir $1)),$(call LIBNAME,$(l)))
  93. #PRINT_PKGCONFIG_SAFE=$(if $(strip $(1)),`$(PKGCONFIG) $(1) $(2)`)
  94. PRINT_PKGCONFIG_SAFE=$(foreach l,$(1),`$(PKGCONFIG) $(l) $(2)`)
  95. PRINT_INTLIB_CFLAGS=$(call PRINT_PKGCONFIG_SAFE,$(call PRINT_INTLIB_PKGCONFIG,$(1)),--cflags)
  96. PRINT_INTLIB_LDFLAGS=$(call PRINT_PKGCONFIG_SAFE,$(call PRINT_INTLIB_PKGCONFIG,$(1)),--libs)
  97. #PROCESS_DEPFILE=$(SED) -e's@^[^ ].*:@&$(call PRINT_INTLIB_PCS,$@)@'
  98. .PHONY:all alldep alllib allbin clean check doc
  99. all:alldep alllib allbin
  100. # -----------------------------
  101. # - configuration for libraries
  102. #
  103. # This configuration is moved to a separate configuration file. There the
  104. # necessary defines $($(x)_CFLAGS) and $($(x)_LDFLAGS) are set up. Within
  105. # this Makefile, one can simply say a target needs library $(x), and includes
  106. # as well as libraries will be found.
  107. PKGCONFIG_3RDPARTY=$(if $(shell pkg-config $(2) --exists && echo "1"),\
  108. $(call CONFIGINFO,$(1),1)$(eval $(1)_PKGCOONFIG=$(2)) \
  109. $(eval $(1)_CFLAGS=-DUSELIB_$(1)) \
  110. $(call CONFIGINFO,$(1),0))
  111. $(info $(shell if [ ! -f Makefile.config ];then echo "+++ creating default Makefile.config - please manually check the configuration"; cp templates/Makefile.config.template Makefile.config;fi))
  112. include Makefile.config
  113. # --------------------
  114. # - cppunit test stuff
  115. ALL_OBJS+=$(CPPUNIT_MAIN_OBJ)
  116. CPPUNIT_MAIN_OBJ=$(CPPUNIT_MAIN:%.cpp=%.o)
  117. $(call FILE_DEPEND_EXT,$(CPPUNIT_MAIN_OBJ),CPPUNIT)
  118. # ------------------------
  119. # - include subdirectories
  120. #
  121. # in fact a simple "include Makefile.inc" would suffice to reach the top level
  122. # source directory, from where other directories can be included.
  123. SUBDIRS:=./
  124. include $(SUBDIRS:%=%/Makefile.inc)
  125. # --------------------------------------
  126. # - override the default list of targets
  127. ifneq "$(TARGETS_FROM)" ""
  128. ALL_OBJS:=$(filter $(BUILDDIR)$(TARGETS_FROM)%,$(ALL_OBJS))
  129. ALL_LIBRARIES:=$(filter $(BUILDDIR)$(TARGETS_FROM)%,$(ALL_LIBRARIES))
  130. ALL_BINARIES:=$(filter $(BUILDDIR)$(TARGETS_FROM)%,$(ALL_BINARIES))
  131. ALL_CHECKS:=$(filter $(BUILDDIR)$(TARGETS_FROM)%,$(ALL_CHECKS))
  132. endif
  133. # -----------------------------
  134. # - rules in top level makefile
  135. #
  136. # the rules are the heart of the makefile. all rules are defined implicitly
  137. # which has many advantages. you should definitely know what you are doing
  138. # if you add an implicit rule however.
  139. allbin:$(ALL_BINARIES)
  140. alllib:$(ALL_LIBRARIES)
  141. alldep:allpkg $(ALL_OBJS:%.o=%.d)
  142. allpkg:$(ALL_LIBRARIES:%.$(LINK_FILE_EXTENSION)=%.pc)
  143. check:$(ALL_CHECKS)
  144. clean:
  145. $(VERBOSE)echo "+++ removing all files"
  146. $(VERBOSE2)rm -f $(ALL_OBJS) $(ALL_OBJS:%.o=%.d)
  147. $(VERBOSE2)rm -f $(ALL_BINARIES) $(ALL_BINARIES:%=%.bd)
  148. $(VERBOSE2)rm -f $(ALL_LIBRARIES) $(ALL_CHECKS)
  149. $(VERBOSE2)find ./core/ -name moc*.cpp -delete
  150. #TODO: does not remove moc_*.C (created with QT-moc from .h files)
  151. #alternative solution is to just rm -rf BUILD
  152. doc: Makefile.config
  153. $(VERBOSE)echo "+++ creating documentation"
  154. $(VERBOSE2)cp Doxyfile Doxyfile.tmp
  155. $(VERBOSE2)perl -e 'print "PREDEFINED = "; while(<>){ if ( /(NICE_USELIB_\w+)/ ) { print "$$1 "; } }; print "\n"' Makefile.config >> Doxyfile.tmp
  156. $(VERBOSE2)$(DOXYGEN) Doxyfile.tmp
  157. $(VERBOSE2)rm Doxyfile.tmp
  158. MKOUTPUTDIR=[ -d $(@D) ] || mkdir -p $(@D)
  159. MKOUTPUTDIR2=[ -d $(dir $(1)) ] || mkdir -p $(dir $(1))
  160. $(BUILDDIR)%.d:%.c $(ALL_LIBRARIES:%.$(LINK_FILE_EXTENSION)=%.pc)
  161. @$(MKOUTPUTDIR)
  162. $(VERBOSE)echo "+++ making dependencies $@"
  163. $(VERBOSE2)$(CC) -MT '$@ $(@:%.d=%.o)' -MM -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< > $@
  164. $(BUILDDIR)%.d:%.C $(ALL_LIBRARIES:%.$(LINK_FILE_EXTENSION)=%.pc)
  165. @$(MKOUTPUTDIR)
  166. $(VERBOSE)echo "+++ making dependencies $@"
  167. $(VERBOSE2)$(CC) -MT '$@ $(@:%.d=%.o)' -MM -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< > $@
  168. $(BUILDDIR)%.d:%.cpp $(ALL_LIBRARIES:%.$(LINK_FILE_EXTENSION)=%.pc)
  169. @$(MKOUTPUTDIR)
  170. $(VERBOSE)echo "+++ making dependencies $@"
  171. $(VERBOSE2)$(CXX) -MT '$@ $(@:%.d=%.o)' -MM -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< > $@
  172. $(BUILDDIR)%.d:%.cu $(ALL_LIBRARIES:%.$(LINK_FILE_EXTENSION)=%.pc)
  173. @$(MKOUTPUTDIR)
  174. $(VERBOSE)echo "+++ making dependencies $@"
  175. $(VERBOSE2)$(CXXCUDA) -M '$@ $(@:%.d=%.o)' -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< > $@
  176. $(BUILDDIR)%.bd:$(ALL_LIBRARIES:%.$(LINK_FILE_EXTENSION)=%.pc)
  177. @$(MKOUTPUTDIR)
  178. $(VERBOSE)echo "+++ making dependencies $@"
  179. $(VERBOSE2)echo '$@:$(patsubst $(BUILDDIR)%,%,$(dir $@))libdepend.inc' > $@
  180. $(VERBOSE2)echo '$(@:%.bd=%):$(@:%.bd=%.o) $(call PRINT_INTLIB_DEPS,$(@:%.bd=%),.$(LINK_FILE_EXTENSION))' >> $@
  181. $(BUILDDIR)%.o:%.c
  182. @$(MKOUTPUTDIR)
  183. $(VERBOSE)echo "+++ compiling object $@"
  184. $(VERBOSE2)$(CC) -c $(CFLAGS) -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< -o $@
  185. $(BUILDDIR)%.o:%.C
  186. @$(MKOUTPUTDIR)
  187. $(VERBOSE)echo "+++ compiling object $@"
  188. $(VERBOSE2)$(CXX) -c $(CFLAGS) -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< -o $@
  189. $(BUILDDIR)%.o:%.cpp
  190. @$(MKOUTPUTDIR)
  191. $(VERBOSE)echo "+++ compiling object $@"
  192. $(VERBOSE2)$(CXX) -c $(CFLAGS) -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< -o $@
  193. $(BUILDDIR)%.o:%.cu
  194. @$(MKOUTPUTDIR)
  195. $(VERBOSE)echo "+++ compiling cuda object $@"
  196. $(VERBOSE2)$(CXXCUDA) -c $(CFLAGS_CUDA) -I. $(call PRINT_INTLIB_CFLAGS,$@) $(call PRINT_EXTLIB_CFLAGS,$@) $< -o $@
  197. moc_%.cpp:%.h
  198. $(VERBOSE)echo "+++ creating moc $@"
  199. $(VERBOSE2)$(MOC) $< -o $@
  200. $(BUILDDIR)%.a:
  201. @$(MKOUTPUTDIR)
  202. $(VERBOSE)echo "+++ linking library $@"
  203. $(VERBOSE2)test -n "$(filter %.o,$^)" && $(AR) -crs $@ $(filter %.o,$^); echo;
  204. $(VERBOSE2)test -f "$@" || (touch emptysource.cpp; gcc -c emptysource.cpp; $(AR) -crs $@ emptysource.o; rm emptysource.*); echo
  205. @touch $@
  206. @$(call MKOUTPUTDIR2,$(LIBSYMLINKDIR))
  207. $(VERBOSE2)cd $(LIBSYMLINKDIR);$(SYMLINK) ../$(@:$(BUILDDIR)%=%) $(@F)
  208. $(BUILDDIR)%.so:$(BUILDDIR)%.a
  209. @$(MKOUTPUTDIR)
  210. $(VERBOSE)echo "+++ linking library $@"
  211. $(VERBOSE2)$(CXX) -shared -o $@ -Wl,-whole-archive $< -Wl,-no-whole-archive
  212. @$(call MKOUTPUTDIR2,$(LIBSYMLINKDIR))
  213. $(VERBOSE2)cd $(LIBSYMLINKDIR);$(SYMLINK) ../$(@:$(BUILDDIR)%=%) $(@F)
  214. $(ALL_BINARIES):
  215. @$(MKOUTPUTDIR)
  216. $(VERBOSE)echo "+++ linking binary $@"
  217. $(VERBOSE2)$(CXX) -o $@ $(filter %.o,$^) $(call PRINT_INTLIB_LDFLAGS,$@) $(LDFLAGS) $(call PRINT_EXTLIB_LDFLAGS,$@)
  218. @$(call MKOUTPUTDIR2,$(BINSYMLINKDIR))
  219. $(VERBOSE2)cd $(BINSYMLINKDIR);$(SYMLINK) ../$(@:$(BUILDDIR)%=%) $(@F)
  220. $(ALL_CHECKS):
  221. @$(MKOUTPUTDIR)
  222. $(VERBOSE)echo "+++ running test case $@"
  223. $(VERBOSE2)$(CXX) -o $@ $(filter %.o,$^) $(call PRINT_INTLIB_LDFLAGS,$@) $(LDFLAGS) $(call PRINT_EXTLIB_LDFLAGS,$@)
  224. $(VERBOSE2)cd $(patsubst $(BUILDDIR)%,%,$(dir $@)); $(PROJECTDIR)$@; mv $(PROJECTDIR)$@ $(PROJECTDIR)$@.bak
  225. $(BUILDDIR)%.pc:
  226. @$(MKOUTPUTDIR)
  227. $(VERBOSE)echo "+++ creating package $@"
  228. $(VERBOSE2)echo "Name: $(notdir $@)" > $@
  229. $(VERBOSE2)echo "Description: $(if $(PKGDESC_$(dir $@)),$(PKGDESC_$(dir $@)),Just a sub-library)" >> $@
  230. $(VERBOSE2)echo "Version: $(if $(PKGVERS_$(dir $@)),$(PKGVERS_$(dir $@)),1.0.0)" >> $@
  231. $(VERBOSE2)echo "Requires: $(call PRINT_INTLIB_PKGCONFIG,$@) $(call PRINT_EXTLIB_PKGCONFIG,$@)" >> $@
  232. $(VERBOSE2)echo "Libs: -L$(PROJECTDIR)$(dir $@) -l$(patsubst lib%.pc,%,$(notdir $@)) $(call PRINT_EXTLIB_LDFLAGS_NOPKG,$@)" >> $@
  233. $(VERBOSE2)echo "Cflags: -I$(PROJECTDIR) $(call PRINT_EXTLIB_CFLAGS_NOPKG,$@)" >> $@
  234. @$(call MKOUTPUTDIR2,$(PKGSYMLINKDIR))
  235. $(VERBOSE2)cd $(PKGSYMLINKDIR);$(SYMLINK) ../$(@:$(BUILDDIR)%=%) $(@F)
  236. # ----------------------
  237. # - include dependencies
  238. #
  239. # finally, if we know how to make them, we can include all depedency .d files.
  240. # personally i do not like this line, because you always always always have
  241. # to make the dependencies then, even if you `make non_existing_target`.
  242. # furthermore i do not like the idea of having one .d file for each source
  243. # file, but it seems to be the only way...
  244. -include $(ALL_OBJS:%.o=%.d)