rules.mk 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. #
  2. # BEGIN COPYRIGHT BLOCK
  3. # Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  4. # Copyright (C) 2005 Red Hat, Inc.
  5. # All rights reserved.
  6. # END COPYRIGHT BLOCK
  7. #
  8. ################################################################################
  9. # Wow this is complicated! The story is that we now have a 4 pass build process:
  10. #
  11. # Pass 1. export - Create generated headers and stubs. Publish public headers to
  12. # dist/<arch>/include.
  13. #
  14. # Pass 2. libs - Create libraries. Publish libraries to dist/<arch>/lib.
  15. #
  16. # Pass 3. all - Create programs.
  17. #
  18. # Pass 4. install - Publish programs to dist/<arch>/bin.
  19. #
  20. # Parameters to this makefile (set these before including):
  21. #
  22. # a)
  23. # TARGETS -- the target to create
  24. # (defaults to $LIBRARY $PROGRAM)
  25. # b)
  26. # DIRS -- subdirectories for make to recurse on
  27. # (the 'all' rule builds $TARGETS $DIRS)
  28. # c)
  29. # CSRCS, CPPSRCS -- .c and .cpp files to compile
  30. # (used to define $OBJS)
  31. # d)
  32. # PROGRAM -- the target program name to create from $OBJS
  33. # ($OBJDIR automatically prepended to it)
  34. # e)
  35. # LIBRARY -- the target library name to create from $OBJS
  36. # ($OBJDIR automatically prepended to it)
  37. # f)
  38. # JSRCS -- java source files to compile into class files
  39. # (if you don't specify this it will default to *.java)
  40. # PACKAGE -- the package to put the .class files into
  41. # (e.g. netscape/applet)
  42. # JMC_EXPORT -- java files to be exported for use by JMC_GEN
  43. # (this is a list of Class names)
  44. # g)
  45. # JRI_GEN -- files to run through javah to generate headers and stubs
  46. # (output goes into the _jri sub-dir)
  47. # h)
  48. # JMC_GEN -- files to run through jmc to generate headers and stubs
  49. # (output goes into the _jmc sub-dir)
  50. #
  51. ################################################################################
  52. #
  53. # Common rules used by lots of makefiles...
  54. #
  55. ifndef NS_CONFIG_MK
  56. include $(DEPTH)/config/config.mk
  57. endif
  58. ifdef PROGRAM
  59. PROGRAM := $(addprefix $(OBJDIR)/, $(PROGRAM))
  60. endif
  61. ifndef LIBRARY
  62. ifdef LIBRARY_NAME
  63. LIBRARY := lib$(LIBRARY_NAME).$(LIB_SUFFIX)
  64. endif
  65. endif
  66. ifdef LIBRARY
  67. LIBRARY := $(addprefix $(OBJDIR)/, $(LIBRARY))
  68. ifdef MKSHLIB
  69. SHARED_LIBRARY := $(LIBRARY:.$(LIB_SUFFIX)=$(DLL_PRESUF).$(DLL_SUFFIX))
  70. endif
  71. endif
  72. ifndef TARGETS
  73. TARGETS = $(LIBRARY) $(SHARED_LIBRARY) $(PROGRAM)
  74. endif
  75. ifndef OBJS
  76. OBJS = $(JRI_STUB_CFILES) $(addsuffix .o, $(JMC_GEN)) $(CSRCS:.c=.o) $(CPPSRCS:.cpp=.o) $(ASFILES:.s=.o)
  77. endif
  78. ifdef OBJS
  79. OBJS := $(addprefix $(OBJDIR)/, $(OBJS))
  80. endif
  81. ifdef REQUIRES
  82. MODULE_PREINCLUDES = $(addprefix -I$(XPDIST)/public/, $(REQUIRES))
  83. endif
  84. ifeq ($(OS_ARCH),WINNT)
  85. ifdef DLL
  86. DLL := $(addprefix $(OBJDIR)/, $(DLL))
  87. LIB := $(addprefix $(OBJDIR)/, $(LIB))
  88. endif
  89. endif
  90. define MAKE_OBJDIR
  91. if test ! -d $(@D); then rm -rf $(@D); $(NSINSTALL) -D $(@D); fi
  92. endef
  93. ALL_TRASH = $(TARGETS) $(OBJS) $(OBJDIR) LOGS TAGS $(GARBAGE) \
  94. $(NOSUCHFILE) $(JDK_HEADER_CFILES) $(JDK_STUB_CFILES) \
  95. $(JRI_HEADER_CFILES) $(JRI_STUB_CFILES) $(JMC_STUBS) \
  96. $(JMC_HEADERS) $(JMC_EXPORT_FILES) so_locations \
  97. _gen _jmc _jri _stubs \
  98. $(wildcard $(JAVA_DESTPATH)/$(PACKAGE)/*.class)
  99. ifdef JDIRS
  100. ALL_TRASH += $(addprefix $(JAVA_DESTPATH)/,$(JDIRS))
  101. endif
  102. ifdef NSBUILDROOT
  103. JDK_GEN_DIR = $(XPDIST)/_gen
  104. JMC_GEN_DIR = $(XPDIST)/_jmc
  105. JRI_GEN_DIR = $(XPDIST)/_jri
  106. JDK_STUB_DIR = $(XPDIST)/_stubs
  107. else
  108. JDK_GEN_DIR = _gen
  109. JMC_GEN_DIR = _jmc
  110. JRI_GEN_DIR = _jri
  111. JDK_STUB_DIR = _stubs
  112. endif
  113. #
  114. # If this is an "official" build, try to build everything.
  115. # I.e., don't exit on errors.
  116. #
  117. ifdef BUILD_OFFICIAL
  118. EXIT_ON_ERROR = +e
  119. CLICK_STOPWATCH = date
  120. else
  121. EXIT_ON_ERROR = -e
  122. CLICK_STOPWATCH = true
  123. endif
  124. ################################################################################
  125. ifdef ALL_PLATFORMS
  126. all_platforms:: $(NFSPWD)
  127. @d=`$(NFSPWD)`; \
  128. if test ! -d LOGS; then rm -rf LOGS; mkdir LOGS; fi; \
  129. for h in $(PLATFORM_HOSTS); do \
  130. echo "On $$h: $(MAKE) $(ALL_PLATFORMS) >& LOGS/$$h.log"; \
  131. rsh $$h -n "(chdir $$d; \
  132. $(MAKE) $(ALL_PLATFORMS) >& LOGS/$$h.log; \
  133. echo DONE) &" 2>&1 > LOGS/$$h.pid & \
  134. sleep 1; \
  135. done
  136. $(NFSPWD):
  137. cd $(@D); $(MAKE) $(@F)
  138. endif
  139. ifdef REQUIRES
  140. ifndef NO_NSPR
  141. INCLUDES += -I$(XPDIST)/$(OBJDIR)/include/nspr20/pr $(addprefix -I$(XPDIST)/public/, $(REQUIRES))
  142. else
  143. INCLUDES += $(addprefix -I$(XPDIST)/public/, $(REQUIRES))
  144. endif
  145. endif
  146. all:: $(TARGETS)
  147. +$(LOOP_OVER_DIRS)
  148. libs:: $(LIBRARY) $(SHARED_LIBRARY)
  149. $(PROGRAM): $(OBJS)
  150. @$(MAKE_OBJDIR)
  151. ifeq ($(OS_ARCH),WINNT)
  152. $(CC) $(OBJS) -Fe$@ -link $(LDFLAGS) $(OS_LIBS) $(EXTRA_LIBS)
  153. else
  154. $(CC) -o $@ $(CFLAGS) $(OBJS) $(LDFLAGS)
  155. endif
  156. $(LIBRARY): $(OBJS)
  157. @$(MAKE_OBJDIR)
  158. rm -f $@
  159. $(AR) $(OBJS)
  160. $(RANLIB) $@
  161. $(SHARED_LIBRARY): $(OBJS)
  162. @$(MAKE_OBJDIR)
  163. rm -f $@
  164. $(MKSHLIB) -o $@ $(OBJS) $(EXTRA_SHLIBS)
  165. chmod +x $@
  166. ifeq ($(OS_ARCH),WINNT)
  167. $(DLL): $(OBJS) $(EXTRA_LIBS)
  168. @$(MAKE_OBJDIR)
  169. rm -f $@
  170. $(LINK_DLL) $(OBJS) $(OS_LIBS) $(EXTRA_LIBS)
  171. endif
  172. .SUFFIXES: .i .pl .class .java .html
  173. .PRECIOUS: .java
  174. $(OBJDIR)/%: %.c
  175. @$(MAKE_OBJDIR)
  176. ifeq ($(OS_ARCH),WINNT)
  177. $(CC) -Fo$@ -c $(CFLAGS) $*.c
  178. else
  179. $(CC) -o $@ $(CFLAGS) $*.c $(LDFLAGS)
  180. endif
  181. $(OBJDIR)/%.o: %.c
  182. @$(MAKE_OBJDIR)
  183. ifeq ($(OS_ARCH),WINNT)
  184. $(CC) -Fo$@ -c $(CFLAGS) $*.c
  185. else
  186. $(CC) -o $@ -c $(CFLAGS) $*.c
  187. endif
  188. $(OBJDIR)/%.o: %.s
  189. @$(MAKE_OBJDIR)
  190. $(AS) -o $@ $(ASFLAGS) -c $*.s
  191. $(OBJDIR)/%.o: %.S
  192. @$(MAKE_OBJDIR)
  193. $(AS) -o $@ $(ASFLAGS) -c $*.S
  194. $(OBJDIR)/%: %.cpp
  195. @$(MAKE_OBJDIR)
  196. $(CCC) -o $@ $(CFLAGS) $*.c $(LDFLAGS)
  197. #
  198. # Please keep the next two rules in sync.
  199. #
  200. $(OBJDIR)/%.o: %.cc
  201. @$(MAKE_OBJDIR)
  202. $(CCC) -o $@ -c $(CFLAGS) $*.cc
  203. $(OBJDIR)/%.o: %.cpp
  204. @$(MAKE_OBJDIR)
  205. ifdef STRICT_CPLUSPLUS_SUFFIX
  206. echo "#line 1 \"$*.cpp\"" | cat - $*.cpp > $(OBJDIR)/t_$*.cc
  207. $(CCC) -o $@ -c $(CFLAGS) $(OBJDIR)/t_$*.cc
  208. rm -f $(OBJDIR)/t_$*.cc
  209. else
  210. ifeq ($(OS_ARCH),WINNT)
  211. $(CCC) -Fo$@ -c $(CFLAGS) $*.cpp
  212. else
  213. $(CCC) -o $@ -c $(CFLAGS) $*.cpp
  214. endif
  215. endif #STRICT_CPLUSPLUS_SUFFIX
  216. %.i: %.cpp
  217. $(CCC) -C -E $(CFLAGS) $< > $*.i
  218. %.i: %.c
  219. $(CC) -C -E $(CFLAGS) $< > $*.i
  220. %: %.pl
  221. rm -f $@; cp $*.pl $@; chmod +x $@
  222. %: %.sh
  223. rm -f $@; cp $*.sh $@; chmod +x $@
  224. #
  225. # If this is an "official" build, try to build everything.
  226. # I.e., don't exit on errors.
  227. #
  228. ifdef BUILD_OFFICIAL
  229. EXIT_ON_ERROR = +e
  230. else
  231. EXIT_ON_ERROR = -e
  232. endif
  233. ifdef DIRS
  234. ifneq ($(OS_ARCH),WINNT)
  235. override MAKEFLAGS :=
  236. endif
  237. LOOP_OVER_DIRS = \
  238. @for d in $(DIRS); do \
  239. if test -d $$d; then \
  240. set $(EXIT_ON_ERROR); \
  241. echo "cd $$d; $(MAKE) $(MAKEFLAGS) $@"; \
  242. cd $$d; $(MAKE) $(MAKEFLAGS) $@; cd ..; \
  243. set +e; \
  244. else \
  245. echo "Skipping non-directory $$d..."; \
  246. fi; \
  247. $(CLICK_STOPWATCH); \
  248. done
  249. $(DIRS)::
  250. @if test -d $@; then \
  251. set $(EXIT_ON_ERROR); \
  252. echo "cd $@; $(MAKE) $(MAKEFLAGS)"; \
  253. cd $@; $(MAKE) $(MAKEFLAGS); \
  254. set +e; \
  255. else \
  256. echo "Skipping non-directory $@..."; \
  257. fi \
  258. $(CLICK_STOPWATCH);
  259. endif # DIRS
  260. clean::
  261. rm -f $(OBJS) $(NOSUCHFILE)
  262. +$(LOOP_OVER_DIRS)
  263. clobber::
  264. rm -f $(OBJS) $(TARGETS) $(GARBAGE) $(NOSUCHFILE)
  265. +$(LOOP_OVER_DIRS)
  266. realclean clobber_all::
  267. rm -rf LOGS TAGS $(wildcard *.OBJ) $(OBJS) $(TARGETS) $(GARBAGE) $(NOSUCHFILE)
  268. +$(LOOP_OVER_DIRS)
  269. alltags:
  270. rm -f TAGS
  271. find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs etags -a
  272. export::
  273. +$(LOOP_OVER_DIRS)
  274. libs::
  275. +$(LOOP_OVER_DIRS)
  276. install::
  277. +$(LOOP_OVER_DIRS)
  278. mac::
  279. +$(LOOP_OVER_DIRS)
  280. ################################################################################
  281. ### Bunch of things that extend the 'export' rule (in order):
  282. ################################################################################
  283. ### JSRCS -- for compiling java files
  284. ifndef PACKAGE
  285. PACKAGE = .
  286. endif
  287. $(JAVA_DESTPATH) $(JAVA_DESTPATH)/$(PACKAGE) $(JMCSRCDIR)::
  288. @if test ! -d $@; then \
  289. echo Creating $@; \
  290. rm -rf $@; \
  291. $(NSINSTALL) -D $@; \
  292. fi
  293. ifneq ($(JSRCS),)
  294. export:: $(JAVA_DESTPATH) $(JAVA_DESTPATH)/$(PACKAGE)
  295. @list=`perl $(DEPTH)/config/outofdate.pl $(PERLARG) \
  296. -d $(JAVA_DESTPATH)/$(PACKAGE) $(JSRCS)`; \
  297. if test "$$list"x != "x"; then \
  298. echo $(JAVAC) $$list; \
  299. $(JAVAC) $$list; \
  300. fi
  301. all:: export
  302. clobber::
  303. rm -f $(XPDIST)/classes/$(PACKAGE)/*.class
  304. endif
  305. ################################################################################
  306. ## JDIRS -- like JSRCS, except you can give a list of directories and it will
  307. ## compile all the out-of-date java files recursively below those directories.
  308. ifdef JDIRS
  309. export:: $(JAVA_DESTPATH) $(JAVA_DESTPATH)/$(PACKAGE)
  310. @for d in $(JDIRS); do \
  311. if test -d $$d; then \
  312. set $(EXIT_ON_ERROR); \
  313. files=`echo $$d/*.java`; \
  314. list=`perl $(DEPTH)/config/outofdate.pl $(PERLARG) \
  315. -d $(JAVA_DESTPATH)/$(PACKAGE) $$files`; \
  316. if test "$${list}x" != "x"; then \
  317. echo Building all java files in $$d; \
  318. echo $(JAVAC) $$list; \
  319. $(JAVAC) $$list; \
  320. fi; \
  321. set +e; \
  322. else \
  323. echo "Skipping non-directory $$d..."; \
  324. fi; \
  325. $(CLICK_STOPWATCH); \
  326. done
  327. all:: export
  328. clobber::
  329. @for d in $(JDIRS); do \
  330. echo rm -rf $(XPDIST)/classes/$$d; \
  331. rm -rf $(XPDIST)/classes/$$d; \
  332. done
  333. endif
  334. ################################################################################
  335. ### JDK_GEN -- for generating "old style" native methods
  336. # Generate JDK Headers and Stubs into the '_gen' and '_stubs' directory
  337. ifneq ($(JDK_GEN),)
  338. ifdef NSBUILDROOT
  339. JDK_GEN_DIR = $(XPDIST)/_gen
  340. JDK_STUB_DIR = $(XPDIST)/_stubs
  341. else
  342. JDK_GEN_DIR = _gen
  343. JDK_STUB_DIR = _stubs
  344. endif
  345. INCLUDES += -I$(JDK_GEN_DIR)
  346. JDK_PACKAGE_CLASSES = $(JDK_GEN)
  347. JDK_PATH_CLASSES = $(subst .,/,$(JDK_PACKAGE_CLASSES))
  348. JDK_PATH_CLASSES = $(subst .,/,$(JDK_PACKAGE_CLASSES))
  349. JDK_HEADER_CLASSFILES = $(patsubst %,$(JAVA_DESTPATH)/%.class,$(JDK_PATH_CLASSES))
  350. JDK_STUB_CLASSFILES = $(patsubst %,$(JAVA_DESTPATH)/%.class,$(JDK_PATH_CLASSES))
  351. JDK_HEADER_CFILES = $(patsubst %,$(JDK_GEN_DIR)/%.h,$(JDK_GEN))
  352. JDK_STUB_CFILES = $(patsubst %,$(JDK_STUB_DIR)/%.c,$(JDK_GEN))
  353. $(JDK_HEADER_CFILES): $(JDK_HEADER_CLASSFILES)
  354. $(JDK_STUB_CFILES): $(JDK_STUB_CLASSFILES)
  355. export::
  356. @echo Generating/Updating JDK headers
  357. $(JAVAH) -d $(JDK_GEN_DIR) $(JDK_PACKAGE_CLASSES)
  358. @echo Generating/Updating JDK stubs
  359. $(JAVAH) -stubs -d $(JDK_STUB_DIR) $(JDK_PACKAGE_CLASSES)
  360. mac::
  361. @echo Generating/Updating JDK headers for the Mac
  362. $(JAVAH) -mac -d $(DEPTH)/lib/mac/Java/_gen $(JDK_PACKAGE_CLASSES)
  363. @echo Generating/Updating JDK stubs for the Mac
  364. $(JAVAH) -mac -stubs -d $(DEPTH)/lib/mac/Java/_stubs $(JDK_PACKAGE_CLASSES)
  365. # Don't delete them if the don't compile (makes it hard to debug):
  366. .PRECIOUS: $(JDK_HEADERS) $(JDK_STUBS)
  367. clobber::
  368. rm -rf $(JDK_HEADER_CFILES) $(JDK_STUB_CFILES)
  369. endif
  370. ################################################################################
  371. ### JRI_GEN -- for generating JRI native methods
  372. # Generate JRI Headers and Stubs into the 'jri' directory
  373. ifneq ($(JRI_GEN),)
  374. ifdef NSBUILDROOT
  375. JRI_GEN_DIR = $(XPDIST)/_jri
  376. else
  377. JRI_GEN_DIR = _jri
  378. endif
  379. INCLUDES += -I$(JRI_GEN_DIR)
  380. JRI_PACKAGE_CLASSES = $(JRI_GEN)
  381. JRI_PATH_CLASSES = $(subst .,/,$(JRI_PACKAGE_CLASSES))
  382. ## dependency fu
  383. JRI_HEADER_CLASSFILES = $(patsubst %,$(XPDIST)/classes/%.class,$(JRI_PATH_CLASSES))
  384. JRI_HEADER_CFILES = $(patsubst %,$(JRI_GEN_DIR)/%.h,$(JRI_GEN))
  385. $(JRI_HEADER_CFILES): $(JRI_HEADER_CLASSFILES)
  386. ## dependency fu
  387. JRI_STUB_CLASSFILES = $(patsubst %,$(XPDIST)/classes/%.class,$(JRI_PATH_CLASSES))
  388. JRI_STUB_CFILES = $(patsubst %,$(JRI_GEN_DIR)/%.c,$(JRI_GEN))
  389. $(JRI_STUB_CFILES): $(JRI_STUB_CLASSFILES)
  390. export::
  391. @echo Generating/Updating JRI headers
  392. $(JAVAH) -jri -d $(JRI_GEN_DIR) $(JRI_PACKAGE_CLASSES)
  393. @echo Generating/Updating JRI stubs
  394. $(JAVAH) -jri -stubs -d $(JRI_GEN_DIR) $(JRI_PACKAGE_CLASSES)
  395. @if test ! -d $(DEPTH)/lib/mac/Java/; then \
  396. echo "!!! You need to have a ns/lib/mac/Java directory checked out."; \
  397. echo "!!! This allows us to automatically update generated files for the mac."; \
  398. echo "!!! If you see any modified files there, please check them in."; \
  399. fi
  400. @echo Generating/Updating JRI headers for the Mac
  401. $(JAVAH) -jri -mac -d $(DEPTH)/lib/mac/Java/_jri $(JRI_PACKAGE_CLASSES)
  402. @echo Generating/Updating JRI stubs for the Mac
  403. $(JAVAH) -jri -mac -stubs -d $(DEPTH)/lib/mac/Java/_jri $(JRI_PACKAGE_CLASSES)
  404. # Don't delete them if the don't compile (makes it hard to debug):
  405. .PRECIOUS: $(JRI_HEADERS) $(JRI_STUBS)
  406. clobber::
  407. rm -rf $(JRI_HEADER_CFILES) $(JRI_STUB_CFILES)
  408. endif
  409. ################################################################################
  410. ## JMC_EXPORT -- for declaring which java classes are to be exported for jmc
  411. ifneq ($(JMC_EXPORT),)
  412. JMC_EXPORT_PATHS = $(subst .,/,$(JMC_EXPORT))
  413. JMC_EXPORT_FILES = $(patsubst %,$(XPDIST)/classes/$(PACKAGE)/%.class,$(JMC_EXPORT_PATHS))
  414. # We're doing NSINSTALL -t here (copy mode) because calling INSTALL will pick up
  415. # your NSDISTMODE and make links relative to the current directory. This is a
  416. # problem because the source isn't in the current directory:
  417. export:: $(JMC_EXPORT_FILES) $(JMCSRCDIR)
  418. $(NSINSTALL) -t -m 444 $(JMC_EXPORT_FILES) $(JMCSRCDIR)
  419. clobber::
  420. rm -rf $(JMC_EXPORT_FILES)
  421. endif
  422. ################################################################################
  423. ## EXPORTS
  424. #
  425. # Copy each element of EXPORTS to $(XPDIST)/public/$(MODULE)/
  426. #
  427. ifneq ($(EXPORTS),)
  428. $(XPDIST)/public/$(MODULE)::
  429. @if test ! -d $@; then \
  430. echo Creating $@; \
  431. rm -rf $@; \
  432. mkdir -p $@; \
  433. fi
  434. export:: $(EXPORTS) $(XPDIST)/public/$(MODULE)
  435. $(NSINSTALL) -t -m 444 $(EXPORTS) $(XPDIST)/public/$(MODULE)
  436. endif
  437. ################################################################################
  438. ## JMC_GEN -- for generating java modules
  439. # Provide default export & install rules when using JMC_GEN
  440. ifneq ($(JMC_GEN),)
  441. ifdef NSBUILDROOT
  442. JMC_GEN_DIR = $(XPDIST)/_jmc
  443. else
  444. JMC_GEN_DIR = _jmc
  445. endif
  446. INCLUDES += -I$(JMC_GEN_DIR)
  447. JMC_HEADERS = $(patsubst %,$(JMC_GEN_DIR)/%.h,$(JMC_GEN))
  448. JMC_STUBS = $(patsubst %,$(JMC_GEN_DIR)/%.c,$(JMC_GEN))
  449. JMC_OBJS = $(patsubst %,$(OBJDIR)/%.o,$(JMC_GEN))
  450. $(JMC_GEN_DIR)/M%.h: $(JMCSRCDIR)/%.class
  451. $(JMC) -d $(JMC_GEN_DIR) -interface $(JMC_GEN_FLAGS) $(?F:.class=)
  452. $(JMC_GEN_DIR)/M%.c: $(JMCSRCDIR)/%.class
  453. $(JMC) -d $(JMC_GEN_DIR) -module $(JMC_GEN_FLAGS) $(?F:.class=)
  454. $(OBJDIR)/M%.o: $(JMC_GEN_DIR)/M%.h $(JMC_GEN_DIR)/M%.c
  455. @$(MAKE_OBJDIR)
  456. $(CC) -o $@ -c $(CFLAGS) $(JMC_GEN_DIR)/M$*.c
  457. export:: $(JMC_HEADERS) $(JMC_STUBS)
  458. # Don't delete them if the don't compile (makes it hard to debug):
  459. .PRECIOUS: $(JMC_HEADERS) $(JMC_STUBS)
  460. clobber::
  461. rm -rf $(JMC_HEADERS) $(JMC_STUBS)
  462. endif
  463. ################################################################################
  464. ## LIBRARY -- default rules for for building libraries
  465. ifdef LIBRARY
  466. libs:: $(LIBRARY)
  467. $(INSTALL) -m 444 $(LIBRARY) $(DIST)/lib
  468. install:: $(LIBRARY)
  469. $(INSTALL) -m 444 $(LIBRARY) $(DIST)/lib
  470. endif
  471. ifdef SHARED_LIBRARY
  472. libs:: $(SHARED_LIBRARY)
  473. $(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/bin
  474. install:: $(SHARED_LIBRARY)
  475. $(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/bin
  476. endif
  477. -include $(DEPENDENCIES)
  478. ifneq ($(OS_ARCH),WINNT)
  479. # Can't use sed because of its 4000-char line length limit, so resort to perl
  480. .DEFAULT:
  481. @perl -e ' \
  482. open(MD, "< $(DEPENDENCIES)"); \
  483. while (<MD>) { \
  484. if (m@ \.*/*$< @) { \
  485. $$found = 1; \
  486. last; \
  487. } \
  488. } \
  489. if ($$found) { \
  490. print "Removing stale dependency $< from $(DEPENDENCIES)\n"; \
  491. seek(MD, 0, 0); \
  492. $$tmpname = "$(OBJDIR)/fix.md" . $$$$; \
  493. open(TMD, "> " . $$tmpname); \
  494. while (<MD>) { \
  495. s@ \.*/*$< @ @; \
  496. if (!print TMD "$$_") { \
  497. unlink(($$tmpname)); \
  498. exit(1); \
  499. } \
  500. } \
  501. close(TMD); \
  502. if (!rename($$tmpname, "$(DEPENDENCIES)")) { \
  503. unlink(($$tmpname)); \
  504. } \
  505. } elsif ("$<" ne "$(DEPENDENCIES)") { \
  506. print "$(MAKE): *** No rule to make target $<. Stop.\n"; \
  507. exit(1); \
  508. }'
  509. endif
  510. #############################################################################
  511. # X dependency system
  512. #############################################################################
  513. ifneq ($(OS_ARCH),WINNT)
  514. $(MKDEPENDENCIES)::
  515. @$(MAKE_OBJDIR)
  516. touch $(MKDEPENDENCIES)
  517. $(MKDEPEND) -p$(OBJDIR_NAME)/ -o'.o' -f$(MKDEPENDENCIES) $(INCLUDES) $(CSRCS) $(CPPSRCS)
  518. $(MKDEPEND)::
  519. cd $(MKDEPEND_DIR); $(MAKE)
  520. ifdef OBJS
  521. depend:: $(MKDEPEND) $(MKDEPENDENCIES)
  522. else
  523. depend::
  524. endif
  525. +$(LOOP_OVER_DIRS)
  526. dependclean::
  527. rm -f $(MKDEPENDENCIES)
  528. +$(LOOP_OVER_DIRS)
  529. #-include $(OBJDIR)/depend.mk
  530. endif
  531. #############################################################################
  532. -include $(MY_RULES)
  533. $(MY_CONFIG):
  534. $(MY_RULES):
  535. # Generate Emacs tags in a file named TAGS if ETAGS was set in $(MY_CONFIG)
  536. # or in $(MY_RULES)
  537. ifdef ETAGS
  538. ifneq ($(CSRCS)$(HEADERS),)
  539. all:: TAGS
  540. TAGS:: $(CSRCS) $(HEADERS)
  541. $(ETAGS) $(CSRCS) $(HEADERS)
  542. endif
  543. endif
  544. ################################################################################
  545. # Special gmake rules.
  546. ################################################################################
  547. #
  548. # Re-define the list of default suffixes, so gmake won't have to churn through
  549. # hundreds of built-in suffix rules for stuff we don't need.
  550. #
  551. .SUFFIXES:
  552. .SUFFIXES: .out .a .ln .o .c .cc .C .cpp .y .l .s .S .h .sh .i .pl .class .java .html
  553. #
  554. # Don't delete these files if we get killed.
  555. #
  556. .PRECIOUS: .java $(JDK_HEADERS) $(JDK_STUBS) $(JRI_HEADERS) $(JRI_STUBS) $(JMC_HEADERS) $(JMC_STUBS)
  557. #
  558. # Fake targets. Always run these rules, even if a file/directory with that
  559. # name already exists.
  560. #
  561. .PHONY: all all_platforms alltags boot clean clobber clobber_all export install libs realclean $(OBJDIR) $(DIRS)