WIN32.mk 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #
  2. # This Source Code Form is subject to the terms of the Mozilla Public
  3. # License, v. 2.0. If a copy of the MPL was not distributed with this
  4. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  5. #
  6. # Configuration common to all versions of Windows NT
  7. # and Windows 95
  8. #
  9. DEFAULT_COMPILER = cl
  10. ifdef NS_USE_GCC
  11. CC = gcc
  12. CCC = g++
  13. LD = ld
  14. AR = ar
  15. AR += cr $@
  16. RANLIB = ranlib
  17. BSDECHO = echo
  18. RC = windres.exe -O coff --use-temp-file
  19. LINK_DLL = $(CC) $(OS_DLLFLAGS) $(DLLFLAGS)
  20. else
  21. CC = cl
  22. CCC = cl
  23. LD = link
  24. LDFLAGS += -nologo
  25. AR = lib
  26. AR += -nologo -OUT:$@
  27. RANLIB = echo
  28. BSDECHO = echo
  29. RC = rc.exe
  30. MT = mt.exe
  31. # Check for clang-cl
  32. CLANG_CL := $(shell expr `$(CC) -? 2>&1 | grep -w clang | wc -l` \> 0)
  33. # Determine compiler version
  34. ifeq ($(CLANG_CL),1)
  35. # clang-cl pretends to be MSVC 2012.
  36. CC_VERSION := 17.00.00.00
  37. else
  38. CC_VERSION := $(shell $(CC) 2>&1 | sed -ne \
  39. 's|.* \([0-9]\+\.[0-9]\+\.[0-9]\+\(\.[0-9]\+\)\?\).*|\1|p')
  40. endif
  41. # Change the dots to spaces.
  42. _CC_VERSION_WORDS := $(subst ., ,$(CC_VERSION))
  43. _CC_VMAJOR := $(word 1,$(_CC_VERSION_WORDS))
  44. _CC_VMINOR := $(word 2,$(_CC_VERSION_WORDS))
  45. _CC_RELEASE := $(word 3,$(_CC_VERSION_WORDS))
  46. _CC_BUILD := $(word 4,$(_CC_VERSION_WORDS))
  47. _MSC_VER = $(_CC_VMAJOR)$(_CC_VMINOR)
  48. _MSC_VER_6 = 1200
  49. # VC10 (2010) is 16.00.30319.01, VC10SP1 is 16.00.40219.01.
  50. _MSC_VER_GE_10SP1 := $(shell expr $(_MSC_VER) \> 1600 \| \
  51. $(_MSC_VER) = 1600 \& $(_CC_RELEASE) \>= 40219)
  52. # VC11 (2012).
  53. _MSC_VER_GE_11 := $(shell expr $(_MSC_VER) \>= 1700)
  54. # VC12 (2013).
  55. _MSC_VER_GE_12 := $(shell expr $(_MSC_VER) \>= 1800)
  56. ifeq ($(_CC_VMAJOR),14)
  57. # -DYNAMICBASE is only supported on VC8SP1 or newer,
  58. # so be very specific here!
  59. # VC8 is 14.00.50727.42, VC8SP1 is 14.00.50727.762
  60. ifeq ($(_CC_RELEASE).$(_CC_BUILD),50727.42)
  61. USE_DYNAMICBASE =
  62. else
  63. ifeq ($(_CC_RELEASE).$(_CC_BUILD),50727.762)
  64. USE_DYNAMICBASE = 1
  65. else
  66. _LOSER := $(error Unknown compiler version $(CC_VERSION))
  67. endif
  68. endif
  69. endif
  70. # if $(_CC_VMAJOR) >= 15
  71. # NOTE: 'sort' sorts the words in lexical order, so this test works
  72. # only if $(_CC_VMAJOR) is two digits.
  73. ifeq ($(firstword $(sort $(_CC_VMAJOR) 15)),15)
  74. USE_DYNAMICBASE = 1
  75. endif
  76. endif
  77. ifdef BUILD_TREE
  78. NSINSTALL_DIR = $(BUILD_TREE)/nss
  79. else
  80. NSINSTALL_DIR = $(CORE_DEPTH)/coreconf/nsinstall
  81. endif
  82. NSINSTALL = nsinstall
  83. MKDEPEND_DIR = $(CORE_DEPTH)/coreconf/mkdepend
  84. MKDEPEND = $(MKDEPEND_DIR)/$(OBJDIR_NAME)/mkdepend.exe
  85. # Note: MKDEPENDENCIES __MUST__ be a relative pathname, not absolute.
  86. # If it is absolute, gmake will crash unless the named file exists.
  87. MKDEPENDENCIES = $(OBJDIR_NAME)/depend.mk
  88. INSTALL = $(NSINSTALL)
  89. MAKE_OBJDIR = mkdir
  90. MAKE_OBJDIR += $(OBJDIR)
  91. GARBAGE += $(OBJDIR)/vc20.pdb $(OBJDIR)/vc40.pdb
  92. XP_DEFINE += -DXP_PC
  93. ifdef NS_USE_GCC
  94. LIB_SUFFIX = a
  95. else
  96. LIB_SUFFIX = lib
  97. endif
  98. DLL_SUFFIX = dll
  99. ifdef NS_USE_GCC
  100. OS_CFLAGS += -mwindows
  101. _GEN_IMPORT_LIB=-Wl,--out-implib,$(IMPORT_LIBRARY)
  102. DLLFLAGS += -mwindows -o $@ -shared -Wl,--export-all-symbols $(if $(IMPORT_LIBRARY),$(_GEN_IMPORT_LIB))
  103. ifdef BUILD_OPT
  104. ifeq (11,$(ALLOW_OPT_CODE_SIZE)$(OPT_CODE_SIZE))
  105. OPTIMIZER += -Os
  106. else
  107. OPTIMIZER += -O2
  108. endif
  109. DEFINES += -UDEBUG -DNDEBUG
  110. else
  111. OPTIMIZER += -g
  112. DEFINES += -DDEBUG -UNDEBUG
  113. endif
  114. else # !NS_USE_GCC
  115. WARNING_CFLAGS = -W3 -nologo -D_CRT_SECURE_NO_WARNINGS \
  116. -D_CRT_NONSTDC_NO_WARNINGS
  117. OS_DLLFLAGS += -nologo -DLL -SUBSYSTEM:WINDOWS
  118. ifndef NSS_ENABLE_WERROR
  119. NSS_ENABLE_WERROR = 1
  120. endif
  121. ifeq ($(NSS_ENABLE_WERROR),1)
  122. WARNING_CFLAGS += -WX
  123. endif
  124. ifeq ($(_MSC_VER),$(_MSC_VER_6))
  125. ifndef MOZ_DEBUG_SYMBOLS
  126. OS_DLLFLAGS += -PDB:NONE
  127. endif
  128. endif
  129. ifdef USE_DYNAMICBASE
  130. OS_DLLFLAGS += -DYNAMICBASE
  131. endif
  132. #
  133. # Define USE_DEBUG_RTL if you want to use the debug runtime library
  134. # (RTL) in the debug build.
  135. # Define USE_STATIC_RTL if you want to use the static RTL.
  136. #
  137. ifdef USE_DEBUG_RTL
  138. ifdef USE_STATIC_RTL
  139. OS_CFLAGS += -MTd
  140. else
  141. OS_CFLAGS += -MDd
  142. endif
  143. OS_CFLAGS += -D_CRTDBG_MAP_ALLOC
  144. else
  145. ifdef USE_STATIC_RTL
  146. OS_CFLAGS += -MT
  147. else
  148. OS_CFLAGS += -MD
  149. endif
  150. endif
  151. ifdef BUILD_OPT
  152. ifeq (11,$(ALLOW_OPT_CODE_SIZE)$(OPT_CODE_SIZE))
  153. OPTIMIZER += -O1
  154. else
  155. OPTIMIZER += -O2
  156. endif
  157. DEFINES += -UDEBUG -DNDEBUG
  158. DLLFLAGS += -OUT:$@
  159. ifdef MOZ_DEBUG_SYMBOLS
  160. ifdef MOZ_DEBUG_FLAGS
  161. OPTIMIZER += $(MOZ_DEBUG_FLAGS) -Fd$(OBJDIR)/
  162. else
  163. OPTIMIZER += -Zi -Fd$(OBJDIR)/
  164. endif
  165. DLLFLAGS += -DEBUG -OPT:REF
  166. LDFLAGS += -DEBUG -OPT:REF
  167. endif
  168. else
  169. OPTIMIZER += -Zi -Fd$(OBJDIR)/ -Od
  170. NULLSTRING :=
  171. DEFINES += -DDEBUG -UNDEBUG
  172. DLLFLAGS += -DEBUG -OUT:$@
  173. LDFLAGS += -DEBUG
  174. ifeq ($(_MSC_VER),$(_MSC_VER_6))
  175. ifndef MOZ_DEBUG_SYMBOLS
  176. LDFLAGS += -PDB:NONE
  177. endif
  178. endif
  179. # Purify requires /FIXED:NO when linking EXEs.
  180. LDFLAGS += /FIXED:NO
  181. endif
  182. ifneq ($(_MSC_VER),$(_MSC_VER_6))
  183. # NSS has too many of these to fix, downgrade the warning
  184. # Disable C4267: conversion from 'size_t' to 'type', possible loss of data
  185. # Disable C4244: conversion from 'type1' to 'type2', possible loss of data
  186. # Disable C4018: 'expression' : signed/unsigned mismatch
  187. # Disable C4312: 'type cast': conversion from 'type1' to 'type2' of greater size
  188. OS_CFLAGS += -w44267 -w44244 -w44018 -w44312
  189. ifeq ($(_MSC_VER_GE_12),1)
  190. OS_CFLAGS += -FS
  191. endif
  192. endif # !MSVC6
  193. endif # NS_USE_GCC
  194. ifdef USE_64
  195. DEFINES += -DWIN64
  196. else
  197. DEFINES += -DWIN32
  198. endif
  199. ifeq (,$(filter-out x386 x86_64,$(CPU_ARCH)))
  200. ifdef USE_64
  201. DEFINES += -D_AMD64_
  202. # Use subsystem 5.02 to allow running on Windows XP.
  203. ifeq ($(_MSC_VER_GE_11),1)
  204. LDFLAGS += -SUBSYSTEM:CONSOLE,5.02
  205. endif
  206. CPU_ARCH = x86_64
  207. else
  208. DEFINES += -D_X86_
  209. # VS2012 defaults to -arch:SSE2. Use -arch:IA32 to avoid requiring
  210. # SSE2. Clang-cl gets confused by -arch:IA32, so don't add it.
  211. # (See https://llvm.org/bugs/show_bug.cgi?id=24335)
  212. # Use subsystem 5.01 to allow running on Windows XP.
  213. ifeq ($(_MSC_VER_GE_11),1)
  214. ifneq ($(CLANG_CL),1)
  215. OS_CFLAGS += -arch:IA32
  216. endif
  217. LDFLAGS += -SUBSYSTEM:CONSOLE,5.01
  218. endif
  219. CPU_ARCH = x386
  220. endif
  221. endif
  222. ifeq ($(CPU_ARCH), ALPHA)
  223. DEFINES += -D_ALPHA_=1
  224. endif
  225. ifdef MAPFILE
  226. ifndef NS_USE_GCC
  227. DLLFLAGS += -DEF:$(MAPFILE)
  228. endif
  229. endif
  230. # Change PROCESS to put the mapfile in the correct format for this platform
  231. PROCESS_MAP_FILE = cp $< $@
  232. #
  233. # The following is NOT needed for the NSPR 2.0 library.
  234. #
  235. DEFINES += -D_WINDOWS
  236. # override default, which is ASFLAGS = CFLAGS
  237. ifdef NS_USE_GCC
  238. AS = $(CC)
  239. ASFLAGS = $(INCLUDES)
  240. else
  241. ifdef USE_64
  242. AS = ml64.exe
  243. ASFLAGS = -nologo -Cp -Sn -Zi $(INCLUDES)
  244. else
  245. AS = ml.exe
  246. ASFLAGS = -nologo -Cp -Sn -Zi -coff -safeseh $(INCLUDES)
  247. endif
  248. endif
  249. # clear any CSTD and CXXSTD unless we're using GCC
  250. ifndef NS_USE_GCC
  251. CSTD =
  252. CXXSTD =
  253. endif
  254. #
  255. # override the definitions of RELEASE_TREE found in tree.mk
  256. #
  257. ifndef RELEASE_TREE
  258. ifdef BUILD_SHIP
  259. ifdef USE_SHIPS
  260. RELEASE_TREE = $(NTBUILD_SHIP)
  261. else
  262. RELEASE_TREE = //redbuild/components
  263. endif
  264. else
  265. RELEASE_TREE = //redbuild/components
  266. endif
  267. endif
  268. #
  269. # override the definitions of IMPORT_LIB_PREFIX, LIB_PREFIX, and
  270. # DLL_PREFIX in prefix.mk
  271. #
  272. ifndef IMPORT_LIB_PREFIX
  273. ifdef NS_USE_GCC
  274. IMPORT_LIB_PREFIX = lib
  275. else
  276. IMPORT_LIB_PREFIX = $(NULL)
  277. endif
  278. endif
  279. ifndef LIB_PREFIX
  280. ifdef NS_USE_GCC
  281. LIB_PREFIX = lib
  282. else
  283. LIB_PREFIX = $(NULL)
  284. endif
  285. endif
  286. ifndef DLL_PREFIX
  287. DLL_PREFIX = $(NULL)
  288. endif
  289. #
  290. # override the definitions of various _SUFFIX symbols in suffix.mk
  291. #
  292. #
  293. # Object suffixes
  294. #
  295. ifndef OBJ_SUFFIX
  296. ifdef NS_USE_GCC
  297. OBJ_SUFFIX = .o
  298. else
  299. OBJ_SUFFIX = .obj
  300. endif
  301. endif
  302. #
  303. # Assembler source suffixes
  304. #
  305. ifndef ASM_SUFFIX
  306. ifdef NS_USE_GCC
  307. ASM_SUFFIX = .s
  308. else
  309. ASM_SUFFIX = .asm
  310. endif
  311. endif
  312. #
  313. # Library suffixes
  314. #
  315. ifndef IMPORT_LIB_SUFFIX
  316. IMPORT_LIB_SUFFIX = .$(LIB_SUFFIX)
  317. endif
  318. ifndef DYNAMIC_LIB_SUFFIX_FOR_LINKING
  319. DYNAMIC_LIB_SUFFIX_FOR_LINKING = $(IMPORT_LIB_SUFFIX)
  320. endif
  321. #
  322. # Program suffixes
  323. #
  324. ifndef PROG_SUFFIX
  325. PROG_SUFFIX = .exe
  326. endif
  327. #
  328. # When the processor is NOT 386-based on Windows NT, override the
  329. # value of $(CPU_TAG). For WinNT, 95, 16, not CE.
  330. #
  331. ifneq ($(CPU_ARCH),x386)
  332. CPU_TAG = _$(CPU_ARCH)
  333. endif
  334. #
  335. # override ruleset.mk, removing the "lib" prefix for library names, and
  336. # adding the "32" after the LIBRARY_VERSION.
  337. #
  338. ifdef LIBRARY_NAME
  339. SHARED_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION)32$(JDK_DEBUG_SUFFIX).dll
  340. IMPORT_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION)32$(JDK_DEBUG_SUFFIX).lib
  341. endif
  342. #
  343. # override the TARGETS defined in ruleset.mk, adding IMPORT_LIBRARY
  344. #
  345. ifndef TARGETS
  346. TARGETS = $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY) $(PROGRAM)
  347. endif