WWW.mk 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /*
  2. * post stuff to WWWDIR for web access
  3. * index generated from *.mm
  4. */
  5. WWWDIR = wwwfiles public_html
  6. WWWSAVE =
  7. WWWSTYLE =
  8. WWWTYPES =
  9. .WWW.semaphore : .SEMAPHORE
  10. .EXPORT : WWWSTYLE WWWTYPES
  11. /*
  12. * item :WWW: [style=frame] [save=pattern] file ...
  13. *
  14. * `item'.mm generates index.html
  15. * other files copied to $(WWWDIR)/`item'
  16. * sets up www.bin
  17. */
  18. ":WWW:" : .MAKE .OPERATOR
  19. local A B D I J L X E P R M
  20. .WWW.LOCAL .WWW.REMOTE : .DO.NOTHING
  21. WWWDIR := $(HOME:X=$(WWWDIR):T=F:O=1)
  22. B := $(*:N=*.mm::O=1:B)
  23. D := $(WWWDIR)/$(B)
  24. M := $(WWWDIR)/man/man1
  25. R := $(>:N!=*=*)
  26. for I $(>:N=*=*)
  27. A := WWW$(I:/=.*//:F=%(upper)s)
  28. $(A) := $(I:/.*=//)
  29. end
  30. (html_info) : $$(MM2HTMLINFO) $$(MM2HTMLINIT)
  31. if WWWSTYLE == "frame"
  32. %.html %-index.html : %.mm (html_info)
  33. $(MM2HTML) $(MM2HTMLFLAGS) $(%:N=faq.*:?> $(<:O=1)?-f $(%) -x?) -o WWWTYPES=$(WWWTYPES:@Q:@Q) $(WWWSOURCE.$(%)) $(>)
  34. else
  35. %.html : %.mm (html_info)
  36. $(MM2HTML) $(MM2HTMLFLAGS) -o WWWTYPES=$(WWWTYPES:@Q:@Q) $(>) $(WWWSOURCE.$(%)) > $(<)
  37. end
  38. %.html : %.1 (html_info)
  39. $(MM2HTML) $(MM2HTMLFLAGS) $(>) $(WWWSOURCE.$(%)) > $(<)
  40. %-man.html : $(BINDIR)/% (html_info)
  41. ignore $(>) --html 2> $(<)
  42. .DO.WWW.MAN : .USE
  43. if { test '' = '$(*)' || { strings $(*) | egrep -q '\[\+NAME\?|libcmd\.|cmd[0-9][0-9]\.' ;} ;} && [[ "$( $(<:B) '--???html' -- 2>&1 )" == version=[1-9]* ]]
  44. then ( $(<:B) '--??html' -- 2>$(<) ) || true
  45. fi
  46. if 0
  47. $(M)/%.html : .DONTCARE $(INSTALLROOT)/bin/%
  48. $(@.DO.WWW.MAN)
  49. end
  50. if "$(<)"
  51. D := $(<)
  52. elif ! "$(R)"
  53. return
  54. end
  55. .WWW .WWW.BIN : $(D) $(M) -
  56. $(D) $(M) :
  57. $(SILENT) test -d $(<) || mkdir $(<)
  58. if ( J = "$(R:N=*.mm)" )
  59. for I $(J:G=%.html)
  60. if I == "*-index.html"
  61. O := $(D)/index.html
  62. else
  63. O := $(I:D=$(D):B:S)
  64. end
  65. .WWW : $(O)
  66. $(O) :COPY: $(I)
  67. end
  68. end
  69. .WWW.req : .FUNCTION
  70. return $(*$(%:T=SR):N=-l*:T=F:P=B:N!=-l*|/*)
  71. A = 0
  72. for I $(R:N!=*.mm)
  73. if I == "-"
  74. let A = ! A
  75. elif I == "-l*"
  76. L := $(I:/-l//)
  77. if J = "$(.DLL.NAME. $(L) $($(L).VERSION):T=F)"
  78. X += $(J)
  79. end
  80. elif A || "$(I:A=.COMMAND|.ARCHIVE)" || "$(I:D:D:N=$(INSTALLROOT))" || "$(I:N=*-www)"
  81. X += $(I)
  82. if "$(I:A=.COMMAND)"
  83. X += $$(.WWW.req $(I))
  84. J := $(I:/-www$//)
  85. eval
  86. .WWW : $(J:D=$(M):B:S=.html)
  87. $(J:D=$(M):B:S=.html) : $(I) $(I:B:S=.1:T=F:?$(I:B:S=.1)??)
  88. if strings $$(*:O=1) | egrep -q '\[\+NAME\?|libcmd\.|cmd[0-9][0-9]\.'
  89. then $$(IGNORE) $$(*:O=1) '--??html' -- 2>&1
  90. elif test '' != '$$(*:N=*.1)'
  91. then $$(MM2HTML) $$(*:N=*.1)
  92. fi > $$(<)
  93. end
  94. end
  95. else
  96. if I == "*.html"
  97. $(I) : .TERMINAL
  98. end
  99. .WWW : $(D)/$(I)
  100. $(D)/$(I) :COPY: $(I)
  101. end
  102. end
  103. if "$(X:V)"
  104. .WWW.EDIT. : .FUNCTION
  105. local E I J
  106. for I $(.INSTALL.LIST.:C,^$(INSTALLROOT)/,,:N!=lib/lib/*)
  107. for J $(%)
  108. if "$(I:B:S)" == "$(J:B:S)"
  109. E += -s ',^$(J)$,$(I),'
  110. end
  111. end
  112. end
  113. return $(E)
  114. .WWW.LIST. : .FUNCTION
  115. local E I J
  116. for I $(.INSTALL.LIST.:C,^$(INSTALLROOT)/,,:N!=lib/lib/*)
  117. for J $(%)
  118. if "$(I:B:S)" == "$(J:B:S)"
  119. E += $(I)
  120. end
  121. end
  122. end
  123. return $(E)
  124. .WWW .WWW.BIN : $(D)/$(B)-$(CC.HOSTTYPE).tgz
  125. $(D)/$(B)-$(CC.HOSTTYPE).tgz : $(X:V)
  126. cat > X.$(tmp).X <<!
  127. This archive contains $(CC.HOSTTYPE) binaries for
  128. $(.WWW.LIST. $(*))
  129. Add the bin directory to PATH and the lib directory
  130. to LD_LIBRARY_PATH or its equivalent for your system.
  131. Use the --?help and --man options for online help,
  132. documentation and contact info.
  133. !
  134. $(PAX) -wvf $(<) -x tar:gzip -s "/X.$(tmp).X/README/" $(.WWW.EDIT. $(*)) -s ',\(.*\)-www$,bin/\1,' -s ',.*/lib/,lib/,' X.$(tmp).X $(*:N!=-l*)
  135. $(RM) -f X.$(tmp).X
  136. end
  137. /*
  138. * item ... :WWWBIN: index.mm file ... host:arch ...
  139. *
  140. * home page control
  141. * `host' of type `arch' for www.bin files
  142. */
  143. ":WWWBIN:" : .MAKE .OPERATOR
  144. local HOST ITEM ARCH BINS DIRS G
  145. .WWW.NOMAN. += $(<)
  146. for HOST $(>)
  147. TYPE := $(HOST:/.*://)
  148. HOST := $(HOST:/:.*//)
  149. WWWTYPES += $(TYPE)
  150. ARCH := $(PWD:D:C,/$(CC.HOSTTYPE)/,/$(TYPE)/)
  151. BINS :=
  152. DIRS :=
  153. for ITEM $(<)
  154. if TYPE == "$(CC.HOSTTYPE)"
  155. G := $("index.mm":G=%.html:D=$(WWWDIR)/$(ITEM):B:S)
  156. .WWW.LOCAL : $(G)
  157. eval
  158. $(G) : .JOINT $(ARCH)/$(ITEM)/$(ITEM).mm (html_info) .WWW.semaphore .FORCE
  159. cd $$(*:D)
  160. $$(MAKE) $$(-) $$(=) www
  161. end
  162. else
  163. BINS += $(WWWDIR)/$(ITEM)/$(ITEM)-$(TYPE).tgz
  164. DIRS += $(ARCH)/$(ITEM)
  165. end
  166. end
  167. .WWW.REMOTE : $(BINS)
  168. ARCH := $(ARCH:C,/src/.*,,)
  169. eval
  170. $(BINS) :JOINT: .FORCE .WWW.semaphore
  171. rsh $(HOST) "
  172. eval \"\`bin/package debug use\`\"
  173. PATH=\$PATH:$(PATH):/usr/ccs/bin
  174. umask 022
  175. for dir in $(DIRS)
  176. do cd \$dir
  177. $(MAKE) $(-) $(=) --errorid=\$dir www.bin
  178. done
  179. "
  180. end
  181. end
  182. /*
  183. * :WWWPOST: [ host [ dir [ tmp ] ] ]
  184. *
  185. * post local $(WWWDIR) to host:dir putting archives in host:tmp/www-*.pax
  186. * defaults: host=www dir=$(WWWDIR) tmp=tmp
  187. */
  188. ":WWWPOST:" : .MAKE .OPERATOR
  189. local ( host dir tmp ignore ... ) $(>) www $(WWWDIR:B:S) tmp ignore
  190. :ALL: delta.pax
  191. .WWW.ALL : .WWW.REMOTE - .WWW.LOCAL
  192. eval
  193. .POST : .VIRTUAL base.pax delta.pax
  194. case "$$(>)" in
  195. '') ;;
  196. *) $$(>:C,.*,rcp & $(host):$(tmp)/$(dir)-&;,)
  197. rsh $(host) '
  198. umask 022
  199. PATH=$HOME/bin:$PATH
  200. cd $(dir)
  201. pax -rvf $HOME/$(tmp)/$(dir)-delta.pax -z $HOME/$(tmp)/$(dir)-base.pax
  202. '
  203. ;;
  204. esac
  205. end
  206. base.pax :
  207. cd $(WWWDIR)
  208. pax -wvf $(<:P=A) .
  209. .base.list. : .FUNCTION
  210. local X
  211. X := $(sh pax -f $(%:N=*.pax):C,\n, ,G:C,^,$$(WWWDIR)/,)
  212. $(X) : .DONTCARE
  213. return $(X)
  214. delta.pax : .WWW.ALL base.pax $$(.base.list. $$(*))
  215. cd $(WWWDIR)
  216. pax -wvf $(<:P=A) -z $(*:N=*.pax:P=A) .
  217. .WWW.FAQ : .USE
  218. {
  219. set -o noglob
  220. print .xx title=\"$(<:B:/\..*//) FAQ index\"
  221. print .MT 4
  222. print .TL
  223. print
  224. print .H 1 \"$(<:B:/\..*//) FAQ index\"
  225. print .BL
  226. for i in $(*)
  227. do exec < $i || exit 1
  228. e=0 l=0 x=y
  229. while read -r op a1 a2
  230. do case $op in
  231. .H) case $e in
  232. 0) e=1 ;;
  233. 1) print .LE ;;
  234. esac
  235. print .sp
  236. print .LI
  237. a2=${a2//\"/}
  238. a2=${a2%\ [Ff][Aa][Qq]}
  239. f=${i%.*}.html
  240. f=${f#*/}
  241. print .xx link=\"$f' '$a2\"
  242. print .sp
  243. print .NL
  244. ;;
  245. .AL|.BL|.NL)
  246. case $x in
  247. y) x=x ;;
  248. *) x=xx$x ;;
  249. esac
  250. ;;
  251. .LE) x=${x%xx}
  252. ;;
  253. .LI) case $x in
  254. x) x=
  255. print .LI
  256. ;;
  257. esac
  258. ;;
  259. .sp) case $x in
  260. '') x=x ;;
  261. esac
  262. ;;
  263. *) case $x in
  264. '') print -r -- $op $a1 $a2 ;;
  265. esac
  266. ;;
  267. esac
  268. done
  269. case $e in
  270. 1) print .LE ;;
  271. esac
  272. done
  273. print .LE
  274. } > $(<)
  275. /*
  276. * [ dir ] :WWWPAGE: [ source ... ] file.mm file
  277. *
  278. * *.mm generates *.html
  279. * faq.*.mm generates faq.mm
  280. * other files copied to $(WWWDIR)[/dir]
  281. * files after - (toggle) are just asserted on ::
  282. */
  283. ":WWWPAGE:" : .MAKE .OPERATOR
  284. local B D I J O P Q S X G A
  285. A = 0
  286. D := $(<:O=1)
  287. P := $(>:N!=*=*)
  288. S := $(>:N=*=*)
  289. if X = "$(P:B:S:N=faq.*.mm)"
  290. Q := $(D:+$(D).)faq.mm
  291. $(Q) : .WWW.FAQ $(X)
  292. P += $(Q)
  293. end
  294. if D
  295. B := $(D:B)
  296. if D != "/*"
  297. D := $(WWWDIR)/$(D)
  298. $(D) :INSTALLDIR:
  299. .WWW.LOCAL : $(D)
  300. end
  301. for I $(<:B)
  302. .WWW.LOCAL : $(WWWDIR)/man/man1/$(I).html
  303. $(WWWDIR)/man/man1/$(I).html : .DONTCARE
  304. end
  305. for I $(P)
  306. if I == "-"
  307. let A = !A
  308. continue
  309. end
  310. if A || I == "$(WWWSAVE)"
  311. :: $(I)
  312. continue
  313. end
  314. if "$(I:T=FD)"
  315. .SOURCE : $(I)
  316. if "$(<)"
  317. WWWSOURCE.$(<:O=1) += $(I:T=F:P=L=*)
  318. end
  319. continue
  320. end
  321. if I == "*.html"
  322. $(I) : .TERMINAL
  323. O := $(I)
  324. X := $(I)
  325. elif ( G = "$(I:G=%.html)" )
  326. $(G) : .IMPLICIT $(S) $(I)
  327. if $(G:O) > 1
  328. for J $(G)
  329. if J == "*-index.html"
  330. if J == "faq.*.*"
  331. continue
  332. end
  333. O := index.html
  334. else
  335. O := $(J)
  336. end
  337. .WWW.LOCAL : $(D)/$(O)
  338. $(D)/$(O) :INSTALL: $(J)
  339. end
  340. continue
  341. end
  342. if X
  343. X := $(I)
  344. else
  345. X := index
  346. end
  347. I := $(I:B:S=.html)
  348. O := $(X:B:S=.html)
  349. else
  350. O := $(I)
  351. end
  352. $(D)/$(O) :INSTALL: $(I)
  353. .WWW.LOCAL : $(D)/$(O)
  354. end
  355. else
  356. for I $(P)
  357. if I == "-"
  358. let A = !A
  359. continue
  360. end
  361. if A || I == "$(WWWSAVE)"
  362. :: $(I)
  363. continue
  364. end
  365. if "$(I:T=FD)"
  366. .SOURCE : $(I)
  367. continue
  368. end
  369. if I == "*.html"
  370. $(I) : .TERMINAL
  371. O := $(I)
  372. elif ( O = "$(I:G=%.html)" )
  373. $(O) : $(S) .IMPLICIT $(I)
  374. end
  375. for J $(O)
  376. if J == "*-index.html"
  377. X := index.html
  378. else
  379. X := $(J)
  380. end
  381. X := $(WWWDIR)/$(X)
  382. .WWW.LOCAL : $(X)
  383. $(X) :COPY: $(J)
  384. end
  385. end
  386. end
  387. /*
  388. * rhs done by default
  389. */
  390. ":WWWALL:" : .MAKE .OPERATOR
  391. .WWW.ALL : $(>)
  392. ":WWWMAN:" : .MAKE .OPERATOR
  393. .INIT : .WWW.MAN
  394. .WWW.MAN. := $(>)
  395. .WWW.MAN : .MAKE .FORCE
  396. local H I
  397. for I $(.WWW.MAN.)
  398. .WWW.LOCAL : $(WWWDIR)/man/man1/$(I:B).html
  399. $(WWWDIR)/man/man1/$(I:B).html : .DO.WWW.MAN $(I)
  400. end
  401. for I $(sh builtin:B)
  402. .WWW.LOCAL : $(WWWDIR)/man/man1/$(I).html
  403. $(WWWDIR)/man/man1/$(I).html : .DO.WWW.MAN -
  404. end
  405. for I $("$(BINDIR)/*([!-.])":P=G:B)
  406. if I != "*_*"
  407. H := $(WWWDIR)/man/man1/$(I).html
  408. if ! "$(*$(H))" && I != "$(.WWW.NOMAN.:/ /|/G)"
  409. .WWW.LOCAL : $(H)
  410. end
  411. elif "$(PATH:/:/ /G:X=$(I:/.*_//):T=F:O=1)"
  412. H := $(WWWDIR)/man/man1/$(I:/.*_//).html
  413. .WWW.LOCAL : $(H)
  414. $(H) : .DO.WWW.MAN $(BINDIR)/$(I)
  415. end
  416. end
  417. .WWW.SED. : .FUNCTION
  418. local E T
  419. E = s/^\(\.xx.link=.*\)%HOSTTYPE%\(.*\)%HOSTTYPE%\(.*\)/
  420. for T $(%)
  421. E := $(E:V)\$$("\n").LI\$$("\n")\1$(T)\2$(T)\3
  422. end
  423. return $(E:V)/
  424. /*
  425. * mm scan support
  426. */
  427. .SCAN.mm : .SCAN
  428. O|S|
  429. I|.sn %|A.DONTCARE|M$$(%)|
  430. I|.so %|A.DONTCARE|M$$(%)|
  431. .ATTRIBUTE.%.mm : .SCAN.mm