Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

352 lines
12 KiB

  1. #
  2. # Base makefile for Linux and OSX
  3. #
  4. # !!!!! Note to future editors !!!!!
  5. #
  6. # before you make changes, make sure you grok:
  7. # 1. the difference between =, :=, +=, and ?=
  8. # 2. how and when this base makefile gets included in the generated makefile(s)
  9. #
  10. OS := $(shell uname)
  11. HOSTNAME := $(shell hostname)
  12. -include $(SRCROOT)/devtools/steam_def.mak
  13. ifeq ($(CFG), release)
  14. OptimizerLevel_CompilerSpecific = -O3 -fno-strict-aliasing
  15. else
  16. OptimizerLevel_CompilerSpecific = -O0
  17. #-O1 -finline-functions
  18. endif
  19. # CPPFLAGS == "c/c++ *preprocessor* flags" - not "cee-plus-plus flags"
  20. ARCH_FLAGS =
  21. BUILDING_MULTI_ARCH = 0
  22. CPPFLAGS = $(DEFINES) $(addprefix -I, $(abspath $(INCLUDEDIRS) ))
  23. CFLAGS = $(ARCH_FLAGS) $(CPPFLAGS) $(WARN_FLAGS) -fvisibility=$(SymbolVisibility) $(OptimizerLevel) -fPIC -pipe $(GCC_ExtraCompilerFlags) -Usprintf -Ustrncpy -UPROTECTED_THINGS_ENABLE
  24. CXXFLAGS = $(CFLAGS)
  25. DEFINES += -DVPROF_LEVEL=1 -DGNUC
  26. LDFLAGS = $(CFLAGS) $(GCC_ExtraLinkerFlags) $(OptimizerLevel)
  27. GENDEP_CXXFLAGS = -MD -MP -MF $(@:.o=.P)
  28. ifeq ($(STEAM_BRANCH),1)
  29. WARN_FLAGS = -Wall -Wextra -Wshadow -Wno-invalid-offsetof
  30. else
  31. WARN_FLAGS = -Wno-write-strings
  32. endif
  33. WARN_FLAGS += -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-value -Wno-missing-field-initializers -Wno-sign-compare -Wno-reorder -Wno-invalid-offsetof -Wno-float-equal -fdiagnostics-show-option
  34. ifeq ($(OS),Linux)
  35. CCACHE := $(SRCROOT)/devtools/bin/linux/ccache
  36. GCC_VER=4.5
  37. ifeq ($(origin AR), default)
  38. AR = $(VALVE_BINDIR)/ar rs
  39. endif
  40. ifeq ($(origin CC),default)
  41. CC = $(CCACHE) $(VALVE_BINDIR)/gcc-$(GCC_VER)
  42. endif
  43. ifeq ($(origin CXX), default)
  44. CXX = $(CCACHE) $(VALVE_BINDIR)/g++-$(GCC_VER)
  45. endif
  46. LINK ?= $(CC)
  47. ifeq ($(TARGET_PLATFORM),linux64)
  48. VALVE_BINDIR = /valve/bin64
  49. # nocona = pentium4 + 64bit + MMX, SSE, SSE2, SSE3 - no SSSE3 (that's three s's - added in core2)
  50. ARCH_FLAGS += -march=nocona
  51. LD_SO = ld-linux-x86_64.so.2
  52. LIBSTDCXX := $(shell $(CXX) -print-file-name=libstdc++.a)
  53. LIBSTDCXXPIC := $(shell $(CXX) -print-file-name=libstdc++-pic.a)
  54. else
  55. VALVE_BINDIR = /valve/bin
  56. # pentium4 = MMX, SSE, SSE2 - no SSE3 (added in prescott)
  57. ARCH_FLAGS += -m32 -march=pentium4
  58. LD_SO = ld-linux.so.2
  59. LIBSTDCXX := $(shell $(CXX) -print-file-name=libstdc++.so)
  60. LIBSTDCXXPIC := $(shell $(CXX) -print-file-name=libstdc++.so)
  61. endif
  62. GEN_SYM ?= $(SRCROOT)/devtools/gendbg.sh
  63. ifeq ($(CFG),release)
  64. STRIP ?= strip -x -S
  65. # CFLAGS += -ffunction-sections -fdata-sections
  66. # LDFLAGS += -Wl,--gc-sections -Wl,--print-gc-sections
  67. else
  68. STRIP ?= true
  69. endif
  70. VSIGN ?= true
  71. SHLIBLDFLAGS = -shared $(LDFLAGS) -Wl,--no-undefined
  72. ifeq ($(STEAM_BRANCH),1)
  73. _WRAP := -Xlinker --wrap=
  74. PATHWRAP = $(_WRAP)fopen $(_WRAP)freopen $(_WRAP)open $(_WRAP)creat $(_WRAP)access $(_WRAP)__xstat \
  75. $(_WRAP)stat $(_WRAP)lstat $(_WRAP)fopen64 $(_WRAP)open64 $(_WRAP)opendir $(_WRAP)__lxstat \
  76. $(_WRAP)chmod $(_WRAP)chown $(_WRAP)lchown $(_WRAP)symlink $(_WRAP)link $(_WRAP)__lxstat64 \
  77. $(_WRAP)mknod $(_WRAP)utimes $(_WRAP)unlink $(_WRAP)rename $(_WRAP)utime $(_WRAP)__xstat64 \
  78. $(_WRAP)mount $(_WRAP)mkfifo $(_WRAP)mkdir $(_WRAP)rmdir $(_WRAP)scandir $(_WRAP)realpath
  79. endif
  80. LIB_START_EXE = $(PATHWRAP) -static-libgcc -Wl,--start-group
  81. LIB_END_EXE = -Wl,--end-group -lm -ldl $(LIBSTDCXX) -lpthread
  82. LIB_START_SHLIB = $(PATHWRAP) -static-libgcc -Wl,--start-group
  83. LIB_END_SHLIB = -Wl,--end-group -lm -ldl $(LIBSTDCXXPIC) -lpthread -l:$(LD_SO) -Wl,--version-script=$(SRCROOT)/devtools/version_script.linux.txt
  84. endif
  85. ifeq ($(OS),Darwin)
  86. OSXVER := $(shell sw_vers -productVersion)
  87. CCACHE := $(SRCROOT)/devtools/bin/osx32/ccache
  88. DEVELOPER_DIR := $(shell /usr/bin/xcode-select -print-path)
  89. ifeq (,$(findstring 10.7, $(OSXVER)))
  90. BUILDING_ON_LION := 0
  91. COMPILER_BIN_DIR := $(DEVELOPER_DIR)/usr/bin
  92. SDK_DIR := $(DEVELOPER_DIR)/SDKs
  93. else
  94. BUILDING_ON_LION := 1
  95. COMPILER_BIN_DIR := $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/bin
  96. SDK_DIR := $(DEVELOPER_DIR)/Platforms/MacOSX.platform/Developer/SDKs
  97. endif
  98. SDKROOT ?= $(SDK_DIR)/MacOSX10.6.sdk
  99. ifeq ($(origin AR), default)
  100. AR = libtool -static -o
  101. endif
  102. ifeq ($(origin CC), default)
  103. CC = $(COMPILER_BIN_DIR)/clang -Qunused-arguments
  104. endif
  105. ifeq ($(origin CXX), default)
  106. CXX = $(COMPILER_BIN_DIR)/clang++ -Qunused-arguments
  107. endif
  108. LINK ?= $(CXX)
  109. ifeq (($TARGET_PLATFORM),osx64)
  110. ARCH_FLAGS += -arch x86_64 -m64 -march=core2
  111. else ifeq (,$(findstring -arch x86_64,$(GCC_ExtraCompilerFlags)))
  112. ARCH_FLAGS += -arch i386 -m32 -march=prescott
  113. else
  114. # dirty hack to build a universal binary - don't specify the architecture
  115. ARCH_FLAGS += -arch i386 -Xarch_i386 -march=prescott -Xarch_x86_64 -march=core2
  116. BUILDING_MULTI_ARCH=1
  117. endif
  118. #FIXME: NOTE:Full path specified because the xcode 4.0 preview has a terribly broken dsymutil, so ref the 3.2 one
  119. GEN_SYM ?= $(DEVELOPER_DIR)/usr/bin/dsymutil
  120. ifeq ($(CFG),release)
  121. STRIP ?= strip -S
  122. else
  123. STRIP ?= true
  124. endif
  125. VSIGN ?= $(SRCROOT)/devtools/bin/vsign
  126. SDKROOT ?= $(SDK_DIR)/MacOSX10.6.sdk
  127. CPPFLAGS += -I$(SDKROOT)/usr/include/malloc
  128. CFLAGS += -isysroot $(SDKROOT) -mmacosx-version-min=10.5 -fasm-blocks
  129. LIB_START_EXE = -lm -ldl -lpthread
  130. LIB_END_EXE =
  131. LIB_START_SHLIB =
  132. LIB_END_SHLIB =
  133. SHLIBLDFLAGS = $(LDFLAGS) -bundle -flat_namespace -undefined suppress -Wl,-dead_strip -Wl,-no_dead_strip_inits_and_terms
  134. ifeq (lib,$(findstring lib,$(GAMEOUTPUTFILE)))
  135. SHLIBLDFLAGS = $(LDFLAGS) -dynamiclib -current_version 1.0 -compatibility_version 1.0 -install_name @loader_path/$(basename $(notdir $(GAMEOUTPUTFILE))).dylib $(SystemLibraries) -Wl,-dead_strip -Wl,-no_dead_strip_inits_and_terms
  136. endif
  137. endif
  138. #
  139. # Profile-directed optimizations.
  140. # Note: Last time these were tested 3/5/08, it actually slowed down the server benchmark by 5%!
  141. #
  142. # First, uncomment these, build, and test. It will generate .gcda and .gcno files where the .o files are.
  143. # PROFILE_LINKER_FLAG=-fprofile-arcs
  144. # PROFILE_COMPILER_FLAG=-fprofile-arcs
  145. #
  146. # Then, comment the above flags out again and rebuild with this flag uncommented:
  147. # PROFILE_COMPILER_FLAG=-fprofile-use
  148. #
  149. #############################################################################
  150. # The compiler command lne for each src code file to compile
  151. #############################################################################
  152. OBJ_DIR = ./obj_$(NAME)_$(TARGET_PLATFORM)/$(CFG)
  153. CPP_TO_OBJ = $(CPPFILES:.cpp=.o)
  154. CXX_TO_OBJ = $(CPP_TO_OBJ:.cxx=.oxx)
  155. CC_TO_OBJ = $(CXX_TO_OBJ:.cc=.o)
  156. MM_TO_OBJ = $(CC_TO_OBJ:.mm=.o)
  157. C_TO_OBJ = $(MM_TO_OBJ:.c=.o)
  158. OBJS = $(addprefix $(OBJ_DIR)/, $(notdir $(C_TO_OBJ)))
  159. ifeq ($(MAKE_VERBOSE),1)
  160. QUIET_PREFIX =
  161. QUIET_ECHO_POSTFIX =
  162. else
  163. QUIET_PREFIX = @
  164. QUIET_ECHO_POSTFIX = > /dev/null
  165. endif
  166. ifeq ($(CONFTYPE),lib)
  167. LIB_File = $(OUTPUTFILE)
  168. endif
  169. ifeq ($(CONFTYPE),dll)
  170. SO_File = $(OUTPUTFILE)
  171. endif
  172. ifeq ($(CONFTYPE),exe)
  173. EXE_File = $(OUTPUTFILE)
  174. endif
  175. # we generate dependencies as a side-effect of compilation now
  176. GEN_DEP_FILE=
  177. PRE_COMPILE_FILE =
  178. POST_COMPILE_FILE =
  179. ifeq ($(BUILDING_MULTI_ARCH),1)
  180. SINGLE_ARCH_CXXFLAGS=$(subst -arch x86_64,,$(CXXFLAGS))
  181. COMPILE_FILE = \
  182. $(QUIET_PREFIX) \
  183. echo "---- COMPILING $(lastword $(subst /, ,$<)) as MULTIARCH----";\
  184. mkdir -p $(OBJ_DIR) && \
  185. $(CXX) $(SINGLE_ARCH_CXXFLAGS) $(GENDEP_CXXFLAGS) -o $@ -c $< && \
  186. $(CXX) $(CXXFLAGS) -o $@ -c $<
  187. else
  188. COMPILE_FILE = \
  189. $(QUIET_PREFIX) \
  190. echo "---- COMPILING $(lastword $(subst /, ,$<)) ----";\
  191. mkdir -p $(OBJ_DIR) && \
  192. $(CXX) $(CXXFLAGS) $(GENDEP_CXXFLAGS) -o $@ -c $<
  193. endif
  194. ifneq "$(origin VALVE_NO_AUTO_P4)" "undefined"
  195. P4_EDIT_START = chmod -R +w
  196. P4_EDIT_END = || true
  197. P4_REVERT_START = true
  198. P4_REVERT_END =
  199. else
  200. P4_EDIT_START := for f in
  201. P4_EDIT_END := ; do if [ -n $$f ]; then if [ -d $$f ]; then find $$f -type f -print | p4 -x - edit; else p4 edit $$f; fi; fi; done $(QUIET_ECHO_POSTFIX)
  202. P4_REVERT_START := for f in
  203. P4_REVERT_END := ; do if [ -n $$f ]; then if [ -d $$f ]; then find $$f -type f -print | p4 -x - revert; else p4 revert $$f; fi; fi; done $(QUIET_ECHO_POSTFIX)
  204. endif
  205. ifeq ($(CONFTYPE),dll)
  206. all: $(OTHER_DEPENDENCIES) $(OBJS) $(GAMEOUTPUTFILE)
  207. @echo $(GAMEOUTPUTFILE) $(QUIET_ECHO_POSTFIX)
  208. else
  209. all: $(OTHER_DEPENDENCIES) $(OBJS) $(OUTPUTFILE)
  210. @echo $(OUTPUTFILE) $(QUIET_ECHO_POSTFIX)
  211. endif
  212. .PHONY: clean cleantargets rebuild relink RemoveOutputFile SingleFile
  213. rebuild :
  214. $(MAKE) -f $(firstword $(MAKEFILE_LIST)) clean
  215. $(MAKE) -f $(firstword $(MAKEFILE_LIST))
  216. # Use the relink target to force to relink the project.
  217. relink: RemoveOutputFile all
  218. RemoveOutputFile:
  219. rm -f $(OUTPUTFILE)
  220. # This rule is so you can say "make SingleFile SingleFilename=/home/myname/valve_main/src/engine/language.cpp" and have it only build that file.
  221. # It basically just translates the full filename to create a dependency on the appropriate .o file so it'll build that.
  222. SingleFile : RemoveSingleFile $(OBJ_DIR)/$(basename $(notdir $(SingleFilename))).o
  223. @echo ""
  224. RemoveSingleFile:
  225. $(QUIET_PREFIX) rm -f $(OBJ_DIR)/$(basename $(notdir $(SingleFilename))).o
  226. clean:
  227. ifneq "$(OBJ_DIR)" ""
  228. $(QUIET_PREFIX) echo "removing $(OBJ_DIR)"
  229. $(QUIET_PREFIX) rm -rf $(OBJ_DIR)
  230. endif
  231. ifneq "$(OUTPUTFILE)" ""
  232. $(QUIET_PREFIX) if [ -e $(OUTPUTFILE) ]; then \
  233. echo "cleaning $(OUTPUTFILE)"; \
  234. $(P4_REVERT_START) $(OUTPUTFILE) $(OUTPUTFILE)$(SYM_EXT) $(P4_REVERT_END); \
  235. fi;
  236. endif
  237. ifneq "$(OTHER_DEPENDENCIES)" ""
  238. $(QUIET_PREFIX) rm -f $(OTHER_DEPENDENCIES)
  239. endif
  240. ifneq "$(GAMEOUTPUTFILE)" ""
  241. $(QUIET_PREFIX) echo "reverting $(GAMEOUTPUTFILE)"
  242. $(QUIET_PREFIX) $(P4_REVERT_START) $(GAMEOUTPUTFILE) $(GAMEOUTPUTFILE)$(SYM_EXT) $(P4_REVERT_END)
  243. endif
  244. # This just deletes the final targets so it'll do a relink next time we build.
  245. cleantargets:
  246. $(QUIET_PREFIX) rm -f $(OUTPUTFILE) $(GAMEOUTPUTFILE)
  247. $(LIB_File): $(OTHER_DEPENDENCIES) $(OBJS)
  248. $(QUIET_PREFIX) -$(P4_EDIT_START) $(LIB_File) $(P4_EDIT_END);
  249. $(QUIET_PREFIX) $(AR) $(LIB_File) $(OBJS) $(LIBFILES);
  250. SO_GameOutputFile = $(GAMEOUTPUTFILE)
  251. $(SO_GameOutputFile): $(SO_File)
  252. $(QUIET_PREFIX) \
  253. $(P4_EDIT_START) $(GAMEOUTPUTFILE) $(P4_EDIT_END) && \
  254. echo "----" $(QUIET_ECHO_POSTFIX);\
  255. echo "---- COPYING TO $@ ----";\
  256. echo "----" $(QUIET_ECHO_POSTFIX);
  257. $(QUIET_PREFIX) -$(P4_EDIT_START) $(GAMEOUTPUTFILE) $(P4_EDIT_END);
  258. $(QUIET_PREFIX) -mkdir -p `dirname $(GAMEOUTPUTFILE)` > /dev/null;
  259. $(QUIET_PREFIX) cp -v $(OUTPUTFILE) $(GAMEOUTPUTFILE) $(QUIET_ECHO_POSTFIX);
  260. $(QUIET_PREFIX) -$(P4_EDIT_START) $(GAMEOUTPUTFILE)$(SYM_EXT) $(P4_EDIT_END);
  261. $(QUIET_PREFIX) $(GEN_SYM) $(GAMEOUTPUTFILE);
  262. $(QUIET_PREFIX) -$(STRIP) $(GAMEOUTPUTFILE);
  263. $(QUIET_PREFIX) $(VSIGN) -signvalve $(GAMEOUTPUTFILE);
  264. $(QUIET_PREFIX) if [ "$(IMPORTLIBRARY)" != "" ]; then\
  265. echo "----" $(QUIET_ECHO_POSTFIX);\
  266. echo "---- COPYING TO IMPORT LIBRARY $(IMPORTLIBRARY) ----";\
  267. echo "----" $(QUIET_ECHO_POSTFIX);\
  268. $(P4_EDIT_START) $(IMPORTLIBRARY) $(P4_EDIT_END) && \
  269. mkdir -p `dirname $(IMPORTLIBRARY)` > /dev/null && \
  270. cp -v $(OUTPUTFILE) $(IMPORTLIBRARY); \
  271. fi;
  272. $(SO_File): $(OTHER_DEPENDENCIES) $(OBJS) $(LIBFILENAMES)
  273. $(QUIET_PREFIX) \
  274. echo "----" $(QUIET_ECHO_POSTFIX);\
  275. echo "---- LINKING $@ ----";\
  276. echo "----" $(QUIET_ECHO_POSTFIX);\
  277. \
  278. $(LINK) $(SHLIBLDFLAGS) $(PROFILE_LINKER_FLAG) -o $(OUTPUTFILE) $(LIB_START_SHLIB) $(OBJS) $(LIBFILES) $(SystemLibraries) $(LIB_END_SHLIB);
  279. $(VSIGN) -signvalve $(OUTPUTFILE);
  280. $(EXE_File) : $(OTHER_DEPENDENCIES) $(OBJS) $(LIBFILENAMES)
  281. $(QUIET_PREFIX) \
  282. echo "----" $(QUIET_ECHO_POSTFIX);\
  283. echo "---- LINKING EXE $@ ----";\
  284. echo "----" $(QUIET_ECHO_POSTFIX);\
  285. \
  286. $(P4_EDIT_START) $(OUTPUTFILE) $(P4_EDIT_END);\
  287. $(LINK) $(LDFLAGS) $(PROFILE_LINKER_FLAG) -o $(OUTPUTFILE) $(LIB_START_EXE) $(OBJS) $(LIBFILES) $(SystemLibraries) $(LIB_END_EXE);
  288. $(QUIET_PREFIX) -$(P4_EDIT_START) $(OUTPUTFILE)$(SYM_EXT) $(P4_EDIT_END);
  289. $(QUIET_PREFIX) $(GEN_SYM) $(OUTPUTFILE);
  290. $(QUIET_PREFIX) -$(STRIP) $(OUTPUTFILE);
  291. $(QUIET_PREFIX) $(VSIGN) -signvalve $(OUTPUTFILE);