~ctwm/ctwm/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
#
# Handle stuff related to building the manual in various ways
#


# Lookup the asciidoc[tor] bits
include(find_asciidoc_bits)



#
# Setup some vars for the various steps in the process
#

# The original source.
set(ADOC_SRC ${MANSRCDIR}/ctwm.1.adoc)

# Where we build stuff.  Because we need to process the ADOC_SRC to
# replace build paths etc, we need to dump it somewhere.  We could just
# leave it right in the build dir root, but is cleaner.
set(MAN_TMPDIR ${CMAKE_BINARY_DIR}/mantmp)

# Where we copy the source to during rewrites, and then do the actual
# build from.
set(ADOC_TMPSRC ${MAN_TMPDIR}/ctwm.1.adoc)

# Where the end products wind up
set(MANPAGE ${CMAKE_BINARY_DIR}/ctwm.1)
set(MANHTML ${CMAKE_BINARY_DIR}/ctwm.1.html)
set(MANDBXML ${CMAKE_BINARY_DIR}/ctwm.1.xml)
set(MANPDF   ${CMAKE_BINARY_DIR}/ctwm.1.pdf)

# How we rewrite vars in the manual.  I decided not to use
# configure_file() for this, as it opens up too many chances for
# something to accidentally get sub'd, since we assume people will write
# pretty freeform in the manual.
set(MANSED_CMD sed -e \"s,@ETCDIR@,${ETCDIR},\"
	-e \"s,@ctwm_version_str@,`head -1 ${CMAKE_SOURCE_DIR}/VERSION`,\")

# Pregen'd doc file paths we might have, in case we can't build them
# ourselves.
set(MAN_PRESRC ${GENSRCDIR}/ctwm.1)
set(HTML_PRESRC ${GENSRCDIR}/ctwm.1.html)





# Figure what we can build
#
# These are both boolean "We can build this type of output" flags, and
# enums for later code for "What method we use to build this type of
# output".

# We use the DocBook XML output for PDF (if manually requested), and
# _can_ use it in very special cases for manpages.  So find out first if
# we can even build it.
set(MANUAL_BUILD_DBXML)
if(ASCIIDOCTOR AND ASCIIDOCTOR_CAN_DBXML)
	set(MANUAL_BUILD_DBXML asciidoctor)
elseif(ASCIIDOC AND ASCIIDOC_CAN_DBXML)
	set(MANUAL_BUILD_DBXML asciidoc)
endif()

# If we have asciidoctor, use it to build the HTML.  Else, we could use
# asciidoc, but leave it disabled because it's very slow.
set(MANUAL_BUILD_HTML)
if(ASCIIDOCTOR AND ASCIIDOCTOR_CAN_HTML)
	set(MANUAL_BUILD_HTML asciidoctor)
elseif(ASCIIDOC)
	set(MANUAL_BUILD_HTML asciidoc)
	if(NOT ENABLE_ASCIIDOC_HTML)
		set(NOAUTO_HTML 1)
		message(STATUS "Not enabling HTML manual build; asciidoc is slow.")
	endif()
endif()

# For the manpage output, asciidoctor has to be of a certain version.  If
# it's not there or not high enough version, we fall back to asciidoc/a2x
# (which is very slow at this too, but we need to build a manpage, so eat
# the expense).  And it's possible to go via the DocBook XML output, but
# it takes very odd cases to wind up there.
set(MANUAL_BUILD_MANPAGE)
if(ASCIIDOCTOR AND ASCIIDOCTOR_CAN_MAN)
	set(MANUAL_BUILD_MANPAGE asciidoctor)
elseif(A2X AND ASCIIDOC_CAN_MAN)
	set(MANUAL_BUILD_MANPAGE a2x)
elseif(XMLTO AND XMLTO_CAN_STUFF AND MANUAL_BUILD_DBXML)
	# Should probably never happen in reality
	set(MANUAL_BUILD_MANPAGE xmlto)
endif()

# PDF output is not hooked into the build process by default, but is made
# available by an extra target.
set(MANUAL_BUILD_PDF)
if(DBLATEX AND DBLATEX_CAN_PDF AND MANUAL_BUILD_DBXML)
	set(MANUAL_BUILD_PDF dblatex)
endif()


# Override: allow forcing use of pregen'd files.
if(FORCE_PREGEN_FILES)
	set(MANUAL_BUILD_HTML)
	set(MANUAL_BUILD_MANPAGE)
	set(MANUAL_BUILD_DBXML)
endif()


# If we can build stuff, prepare bits for it.  Technically unnecessary if
# we're not building stuff, but doesn't do anything bad to define it in
# those cases, and it's easier than listing every MANUAL_BUILD_* in the
# conditions.
set(SETUP_MAN_REWRITE 1)
if(SETUP_MAN_REWRITE)
	# Setup a temp dir under the build for our processing
	file(MAKE_DIRECTORY ${MAN_TMPDIR})

	# We hop through a temporary file to process in definitions for e.g.
	# $ETCDIR.
	add_custom_command(OUTPUT ${ADOC_TMPSRC}
		DEPENDS ${ADOC_SRC} ${CMAKE_SOURCE_DIR}/VERSION
		COMMAND ${MANSED_CMD} < ${ADOC_SRC} > ${ADOC_TMPSRC}
		COMMENT "Processing ctwm.1.adoc -> mantmp/ctwm.1.adoc"
	)

	# We can't actually make other targets depend just on that generated
	# source file, because cmake will try to multi-build it in parallel.
	# To work around, we add a do-nothing custom target that depends on
	# $ADOC_TMPSRC, that uses of it depend on.
	#
	# x-ref http://public.kitware.com/Bug/view.php?id=12311
	#
	# Note, however, that this _doesn't_ transmit the dependancy on
	# ${ADOC_TMPDIR} through; it serves only to serialize the build so it
	# doesn't try to happen twice at once.  So we still need to include
	# ${ADOC_TMPSRC} in the DEPENDS for the targets building off it, or
	# they don't notice when they go out of date.
	add_custom_target(mk_adoc_tmpsrc DEPENDS ${ADOC_TMPSRC})
endif(SETUP_MAN_REWRITE)




#
# Building the manpage variant
#
set(HAS_MAN 0)
if(MANUAL_BUILD_MANPAGE)
	# Got the tool to build it
	message(STATUS "Building manpage with ${MANUAL_BUILD_MANPAGE}.")
	set(HAS_MAN 1)

	if(${MANUAL_BUILD_MANPAGE} STREQUAL "asciidoctor")
		# We don't need the hoops for a2x here, since asciidoctor lets us
		# specify the output directly.
		asciidoctor_mk_manpage(${MANPAGE} ${ADOC_TMPSRC} DEPENDS mk_adoc_tmpsrc)
	elseif(${MANUAL_BUILD_MANPAGE} STREQUAL "a2x")
		# a2x has to jump through some stupid hoops
		a2x_mk_manpage(${MANPAGE} ${ADOC_TMPSRC} DEPENDS mk_adoc_tmpsrc)
	elseif(${MANUAL_BUILD_MANPAGE} STREQUAL "xmlto")
		# xmlto does its own hoops too
		xmlto_mk_manpage(${MANPAGE} ${MANDBXML})
	else()
		message(FATAL_ERROR "I don't know what to do with that manpage "
			"building type!")
	endif()
elseif(EXISTS ${MAN_PRESRC})
	# Can't build it ourselves, but we've got a prebuilt version.
	message(STATUS "Can't build manpage, using prebuilt version.")
	set(HAS_MAN 1)

	# We still have to do the substitutions like above, but we're doing
	# it on the built version now, rather than the source.
	add_custom_command(OUTPUT ${MANPAGE}
		DEPENDS ${MAN_PRESRC} ${CMAKE_SOURCE_DIR}/VERSION
		COMMAND ${MANSED_CMD} < ${MAN_PRESRC} > ${MANPAGE}
		COMMENT "Processing prebuilt manpage -> ctwm.1"
	)
else()
	# Can't build it, no prebuilt.  Not quite fatal, but very bad.
	message(WARNING "Can't build manpage, and no prebuilt version "
		"available.  You won't get one.")
endif(MANUAL_BUILD_MANPAGE)


# Assuming we have it, compress manpage (conditionally).  We could add
# more magic to allow different automatic compression, but that's
# probably way more involved than we need to bother with.  Most systems
# use gzip, and for the few that don't, the packagers can use
# NOMANCOMPRESS and handle it out of band.
if(HAS_MAN)
	if(NOT NOMANCOMPRESS)
		find_program(GZIP_CMD gzip)
		add_custom_command(OUTPUT "${MANPAGE}.gz"
			DEPENDS ${MANPAGE}
			COMMAND ${GZIP_CMD} -nc ${MANPAGE} > ${MANPAGE}.gz
			COMMENT "Compressing ctwm.1.gz"
		)
		add_custom_target(man ALL DEPENDS "${MANPAGE}.gz")
		set(INSTMAN "${MANPAGE}.gz")
	else()
		add_custom_target(man ALL DEPENDS ${MANPAGE})
		set(INSTMAN ${MANPAGE})
	endif(NOT NOMANCOMPRESS)
endif(HAS_MAN)




#
# Do the HTML manual
#
set(HAS_HTML 0)
if(MANUAL_BUILD_HTML AND NOAUTO_HTML)
	message(STATUS "Not autobuilding HTML manual with ${MANUAL_BUILD_HTML}.")
endif()
# Separate if() rather than an elseif() so that the above case can still
# fall into the elseif(EXISTS ${HTML_PRESRC}) below and use the pregen'd
# version.
if(MANUAL_BUILD_HTML AND NOT NOAUTO_HTML)
	# Got the tool to build it
	message(STATUS "Building HTML manual with ${MANUAL_BUILD_HTML}.")
	set(HAS_HTML 1)

	if(${MANUAL_BUILD_HTML} STREQUAL "asciidoctor")
		asciidoctor_mk_html(${MANHTML} ${ADOC_TMPSRC} DEPENDS mk_adoc_tmpsrc)
	elseif(${MANUAL_BUILD_HTML} STREQUAL "asciidoc")
		asciidoc_mk_html(${MANHTML} ${ADOC_TMPSRC} DEPENDS mk_adoc_tmpsrc)
	else()
		message(FATAL_ERROR "I don't know what to do with that HTML manual "
			"building type!")
	endif()
elseif(EXISTS ${HTML_PRESRC})
	# Can't build it ourselves, but we've got a prebuilt version.
	message(STATUS "Can't build HTML manual, using prebuilt version.")
	set(HAS_HTML 1)
	set(NOAUTO_HTML) # Clear so ALL target get set below

	# As with the manpage above, we need to do the processing on the
	# generated version for build options.
	add_custom_command(OUTPUT ${MANHTML}
		DEPENDS ${HTML_PRESRC} ${CMAKE_SOURCE_DIR}/VERSION
		COMMAND ${MANSED_CMD} < ${HTML_PRESRC} > ${MANHTML}
		COMMENT "Processing prebuilt manual -> ctwm.1.html"
	)

else()
	# Can't build it, no prebuilt.
	# Left as STATUS, since this is "normal" for now.
	message(STATUS "Can't build HTML manual, and no prebuilt version "
		"available.")
endif()  # Variants of building HTML manual


# If we have (or are building) the HTML, add an easy target for it, and
# define a var for the install process to notice.
if(HAS_HTML)
	if(NOAUTO_HTML)
		add_custom_target(man-html DEPENDS ${MANHTML})
	else()
		add_custom_target(man-html ALL DEPENDS ${MANHTML})
		set(INSTHTML ${MANHTML})
	endif(NOAUTO_HTML)
endif(HAS_HTML)




#
# Building DocBook XML
#
set(HAS_DBXML 0)
if(MANUAL_BUILD_DBXML)
	# Got the tool to build it
	#message(STATUS "Building DocBook XML with ${MANUAL_BUILD_DBXML}.")
	set(HAS_DBXML 1)

	if(${MANUAL_BUILD_DBXML} STREQUAL "asciidoctor")
		# We don't need the hoops for a2x here, since asciidoctor lets us
		# specify the output directly.
		asciidoctor_mk_docbook(${MANDBXML} ${ADOC_TMPSRC} DEPENDS mk_adoc_tmpsrc)
	elseif(${MANUAL_BUILD_DBXML} STREQUAL "asciidoc")
		# a2x has to jump through some stupid hoops
		asciidoc_mk_docbook(${MANDBXML} ${ADOC_TMPSRC} DEPENDS mk_adoc_tmpsrc)
	else()
		message(FATAL_ERROR "I don't know what to do with that DocBook "
			"building type!")
	endif()
endif(MANUAL_BUILD_DBXML)




#
# And the PDF output
#
set(HAS_PDF 0)
if(MANUAL_BUILD_PDF)
	# Got the tool to build it
	#message(STATUS "Building PDF with ${MANUAL_BUILD_PDF}.")
	set(HAS_PDF 1)

	if(${MANUAL_BUILD_PDF} STREQUAL "dblatex")
		dblatex_mk_pdf(${MANPDF} ${MANDBXML})
	else()
		message(FATAL_ERROR "I don't know what to do with that PDF "
			"building type!")
	endif()
endif(MANUAL_BUILD_PDF)

if(HAS_PDF)
	add_custom_target(man-pdf DEPENDS ${MANPDF})
endif(HAS_PDF)




#
# Handy target
#
set(MAN_TYPES)
if(HAS_MAN)
	list(APPEND MAN_TYPES man)
endif()
if(HAS_HTML)
	list(APPEND MAN_TYPES man-html)
endif()
if(HAS_PDF)
	list(APPEND MAN_TYPES man-pdf)
endif()
add_custom_target(man-all DEPENDS ${MAN_TYPES})