forked from Stellarium/stellarium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
354 lines (295 loc) · 13.3 KB
/
Makefile
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
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# Makefile for the Stellarium User Guide (SUG)
# Required tools:
# WINDOWS
# ========
# It is possible to run make from the Windows command shell or from Linux-like environments: CygWin, Ubuntu shell or at least the Git shell.
# If cygwin or Ubuntu are your favorite environments and you have already installed TeXlive there,
# you won't need MiKTeX, but can use the existing installations. Else install these tools:
# * make and touch from GnuWin32
# * MiKTeX from http://miktex.org. Configure it to auto-download packages as required.
# * pdftk.exe from https://www.pdflabs.com/tools/pdftk-server/ or the pdftk.exe in the program folder of the "private" GUI version.
# * GhostScript from https://www.ghostscript.com. Make sure to have the distribution's bin directory in PATH.
# GIT shell: Install these tools and just make sure they are found in PATH!
# CygWin: To build SUG with native tools, install the relevant packages from the Cygwin repository; alternatively, the Windows tools will be called
# Ubuntu: apt-get install make texlive-full gs pdftk. On Windows' Ubuntu shell, the native Windows tools can be used if available in PATH.
#
# LINUX
# =======
# Debian, Ubuntu: apt-get install make texlive-full gs pdftk.
# Others: make sure to install the abovementioned packages for your distribution.
#
# MAC OS X
# ==========
# * TODO: please add instructions here.
# We try to detect Windows or other system to configure the tool names properly.
# Problem: Ubuntu shell on Windows does not know environment variable OS.
# https://stackoverflow.com/questions/38086185/how-to-check-if-a-program-is-run-in-bash-on-ubuntu-on-windows-and-not-just-plain
#
# On Windows with git shell, Ubuntu bash or cygwin, use rm and mv, not del and move.
# Note that make resets SHELL to sh.exe.
# Cygwin/Ubuntu/MinGW/Git shell's version includes full path name with forward-slash, signalling bash use.
# So far we can also assume that we are on pure (poor) Windows commandline if SHELL=sh.exe
PDFLATEX=pdflatex
HTLATEX=htlatex
BIBER=biber
MAKEINDEX=makeindex
MAKE4HT=make4ht
ifeq ($(OS),Windows_NT) # variable OS not set under Win10/Ubuntu!
ifeq ($(findstring /sh, $(SHELL)),/sh)
RM=rm -fr
MV=mv
ifeq ($(findstring gs,$(shell which gs 2>/dev/null)),gs)
GS=gs
else
ifeq ($(findstring gswin64c,$(shell which gswin64c 2>/dev/null)),gswin64c)
GS=gswin64c.exe
else
GS=gswin32c.exe
endif
MAKE4HT=make4ht.exe
endif
PDFTK=pdftk
else # cmd shell. TODO: hide error message of "where".
RM=del /Q
MV=rename
ifeq ($(findstring gswin64c,$(shell where gswin64c)),gswin64c)
GS=gswin64c.exe
else
GS=gswin32c.exe
endif
PDFTK=pdftk.exe
MAKE4HT=make4ht.exe
endif
else
# OS not Windows on most Non-Windows environments, but may still be Ubuntu bash on Windows!
# In essence, if tool not found, fall back to that tools' names from the Windows environment.
# It is assumed that at least the Windows tools are configured to lie in PATH.
ifneq ($(findstring pdflatex, $(shell which pdflatex)),pdflatex)
PDFLATEX=pdflatex.exe
endif
ifneq ($(findstring htlatex, $(shell which htlatex)),htlatex)
HTLATEX=htlatex.exe
endif
ifneq ($(findstring biber, $(shell which biber)),biber)
BIBER=biber.exe
endif
ifneq ($(findstring makeindex, $(shell which makeindex)),makeindex)
MAKEINDEX=makeindex.exe
endif
ifneq ($(findstring pdftk, $(shell which pdftk)),pdftk)
PDFTK=pdftk.exe
else
PDFTK=pdftk
endif
ifneq ($(findstring gs,$(shell which gs)),gs)
GS=gswin64c.exe
else
GS=gs
endif
RM=rm -fr
MV=mv
SHELL=/bin/bash
endif
# htlatex needs bounding box files.
PICSpdf=$(wildcard pictures/*.pdf)
PICSpng=$(wildcard pictures/*.png) $(subst .pdf,.png, ${PICSpdf})
PICSjpg=$(wildcard pictures/*.jpg)
PICSbbx=$(subst .png,.xbb, ${PICSpng}) $(subst .jpg,.xbb, ${PICSjpg})
.DEFAULT:
.PHONY: help diag clean distclean guide pdf manual SUG html
.SUFFIXES:
.SUFFIXES: .tex .aux .log .lot .lof .toc .bbl .ind .dvi .pdf .eps .jpg .png .html .ps
# This is to keep intermediate files until explicitly removed with make clean.
.SECONDARY:
help:
@echo Stellarium Manual Options
@echo ==========================
@echo PDFLaTeX creates the prettiest PDF, but it is quite large.
@echo targets:
@echo clean: remove intermediate files.
@echo distclean: also remove the PDF targets SUG.pdf, guide.pdf
@echo pdf = guide = manual = guide.pdf : Stellarium User Guide \(hi-res\)
@echo SUG = SUG.pdf : as final target applies compression via GhostScript \(slow!\)
@echo html: create online version. \(EXPERIMENTAL, WIP\)
@echo diag: print some diagnostics about tool names.
clean:
${RM} *~ core *.aux *.log *.lof *.toc *.out *.blg *.bcf *.bbl *.idx *.ilg *.ind *.ptc
${RM} *.run.xml *.4ct *.4tc *.tmp *.dvi guide_meta.txt *.html *.lg *.idv *.css *.svg *.xref guide*.png
distclean: clean
${RM} guide.pdf SUG.pdf ${PICSbbx} html
manual: guide.pdf
guide: guide.pdf
pdf: guide.pdf
dvi: guide.dvi
html: guide.html
# Installation notes for some tools:
# Use any recent LaTeX distribution like TeXlive (Linux) or MiKTeX 2.9 or later.
# The size reduction will need GhostScript and some add-on tools.
# 2 options were explored on Windows 10's Ubuntu 14.04 LTS:
# * install https://github.com/pts/pdfsizeopt
# sudo apt-get install default-jre
# download Multivalent.jar from https://sourceforge.net/projects/multivalent/?source=typ_redirect and put it into PATH
# The official project seems defunct. Found old version at http://www.accountingenhancements.com/multivalent.sourceforge.net/files/Multivalent20060102.jar
# run target SUG.pdf
# * optpdf. This removes the opening view settings from the PDF which have to be restored with pdfmark hacks.
# We also need pdftk for this.
# --> make SUG.pdf
# ================ GENERAL RULES ==================================
# TODO: A rule that securely detects when guide.pdf is complete and no more action is required. Probably we need to make out own logfile grep for "Rerun Latex" and a stop file target.
# Issue: bbl depends on bcf which is created on every run. Likewise, ind depends in idx. We should detect when pdflatex does not emit a warning about changed page numbers.
# Currently, we assume page numbers have settled by the 3rd run, and artificially change the file ages with touch to convince make to stop.
#%.tex : ;
#Makefile: ;
# we must call makeindex again just before final run to update page numbers. Not too intuitive, but seems necessary...
guide.pdf : guide.ind guide.bbl
${PDFLATEX} guide.tex
${MAKEINDEX} guide.idx -s StyleInd.ist
${PDFLATEX} guide.tex
${PDFLATEX} guide.tex
@touch -c guide.ind
@touch -c guide.bbl
@touch -c $@
guide.dvi : guide.tex
+make ${PICSpng}
+make ${PICSbbx}
latex $<
#guide.ind: guide.idx guide.toc
guide.ind: guide.idx guide.aux
${MAKEINDEX} guide.idx -s StyleInd.ist
guide.bbl: guide.bcf guide.bib
${BIBER} guide
guide.idx: guide.log
guide.toc: guide.log
guide.bcf: guide.log
guide.aux: guide.log
guide.log: $(wildcard *.tex)
${PDFLATEX} guide.tex
SUG SUG.pdf: guide_opt.pdf
${MV} $< SUG.pdf
%_meta.txt : %.pdf
${PDFTK} $< dump_data_utf8 > $@
# Reduced file size by 65%. But we need to restore some meta info.
%_opt.pdf : %.pdf %_meta.txt %_pdfmark.ps
${GS} -sDEVICE=pdfwrite -dCompatibilityLevel=1.6 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$*_gswrite.pdf $*.pdf $*_pdfmark.ps
${PDFTK} $*_gswrite.pdf update_info_utf8 $*_meta.txt output $@
${RM} $*_gswrite.pdf $*_meta.txt
pdf2png: $(subst .pdf,.png, ${PICSpdf})
pictures/%.png : pictures/%.pdf
convert $< $@
%.xbb: %.png
ebb -x $<
%.xbb: %.jpg
ebb -x $<
## pdfsizeopt unfortunately hardly makes the SUG smaller :-(
## But it is recommended to run Multivalent after that!
## NOPE! It destroys images.
#SUG.pdf : guide.pdf
# pdfsizeopt $< $@
# java -classpath Multivalent20060102.jar tool.pdf.Compress -jpeg $@
# mv SUG-o.pdf SUG.pdf
htdia:
@echo Want to create ${PICSbbx}
# HTML: Work in progress. I run into many issues that have been discussed in various TeX fora.
# TODO: Whoever knows about htlatex/tex4ht is welcome to help in fixing formatting macros or properly
# configuring the build of a friendly frame set.
# it seems tex4ht needs more than just running htlatex, but we need some configuration file.
#guide.html: guide.bbl guide.ind
#
# See https://github.com/michal-h21/helpers4ht/wiki/tex4ht-tutorial
# htlatex filename "options for tex4ht.sty" "options for tex4ht" "options for t4ht" "LaTeX options"
html-draft: $(wildcard *.tex) ${PICSbbx}
@echo Shell is $(SHELL)
make4ht --output-dir html --utf8 guide -m draft guide "htFixes"
# make4ht --output-dir html --utf8 guide -m draft guide "htFixes"
# GZ we don't use the htlatex command script because it does not call biber or makeindex.
# guide.mk4 is a config file for Stellarium HTML Guide to be processed by make4ht. See https://github.com/michal-h21/make4ht for details.
guide.html: $(wildcard *.tex) guide.mk4 htFixes.cfg ${PICSbbx}
@echo Shell is $(SHELL)
${MAKE4HT} --output-dir html --utf8 guide "htFixes"
# make4ht --output-dir html --utf8 guide "htFixes" " -cunihtf -utf8"
# ${HTLATEX} guide "htFixes" " -cunihtf -utf8"
# Currently, everything after running biber fails. :-(
# ${BIBER} guide
# tex '\def\filename{{guide}{idx}{4dx}{ind}} \input idxmake.4ht'
# ${MAKEINDEX} -o guide.ind guide.4dx
# ${HTLATEX} guide "htFixes,html,1,next,index=3,fn-in,frames,mouseover,info"
# ${HTLATEX} guide "htFixes,html,1,next,index=3,fn-in,frames,mouseover,info"
# This throws an error by lua when processing the tex line. The currently used mk4 lacks the index related stuff.
# Also, it seems ${filename} in the biber argument does not work properly. Should be target without extension.
guide.mk4:
@echo if mode == "draft" then > $@
@echo Make:htlatex() >> $@
@echo else >> $@
@echo Make:add("biber", "biber ${input}") >> $@
@echo Make:add("texindex", "tex '\def\filename{{guide}{idx}{4dx}{ind}} \input idxmake.4ht'") >> $@
@echo Make:add("makeindex", "$makeindex ${filename}.idx -s StyleInd.ist") >> $@
@echo local filter = require "make4ht-filter" >> $@
@echo local process = filter{"cleanspan", "fixligatures", "hruletohr", "fix-links"} >> $@
@echo Make:htlatex() >> $@
@echo Make:biber() >> $@
@echo Make:texindex() >> $@
@echo Make:makeindex() >> $@
@echo Make:htlatex() >> $@
@echo Make:htlatex() >> $@
@echo Make:match("html$",process) >> $@
@echo Make:match("html$", "tidy -m -xml -utf8 -q -i ${filename}") >> $@
@echo end >> $@
# Totally non-tex4ht: Try pandoc? (start to collect arguments here, try "make pandoc")
# Ubuntu on Windows only has pandoc 1.12. Maybe V2 would be more complete? In any case, tabu or some other package seems to be a problem.
pandoc:
pandoc -f latex -t plain guide.tex
# Hint on restoring initial view settings
# from https://stackoverflow.com/questions/25544002/command-line-tool-to-mark-pdf-to-open-in-single-page-view
#guide_pdfmark.ps: Makefile
# echo "[ /PageMode /UseOutlines % Display bookmarks upon opening the doc\n\
# %/PageMode /UseThumbs % Display thumbnails upon opening the doc\n\
# %/PageMode /FullScreen % Open the document in fullscreen mode\n\
# %/PageMode /None % Display neither bookmarks nor thumbnails upon opening\n\
# /Page 1 % Open document with page 1\n\
# %/View [ /XYZ null null null ]\n\
# % Go to specified page and retain same ... \n\
# % ... horizontal/vertical offset+zoom as current page\n\
# /View [ /Fit ] % Fit page to window\n\
# %/View /FitB % Fit visible part of page to window\n\
# %/View [/FitH 220] % Fit page width to window; 220 is distance ...\n\
# % ... of page origin from top of window\n\
# /DOCVIEW pdfmark\n\
# \n\
# [ {Catalog} <<\n\
# /ViewerPreferences<</DisplayDocTitle true>>\n\
# %/PageLayout /SinglePage\n\
# %/PageLayout /OneColumn\n\
# /PageLayout /TwoPageRight\n\
# %/PageLayout /TwoColumnLeft\n\
# >> /PUT pdfmark"\
# > $@
# Very hackish diagnostics. There are many ways to get a decent Linux-ish system even under Windows.
# CygWin, MinGW and Git bash understand calling programs with .exe from the Windows environment.
# Ubuntu needs .exe extension to be given explicitly. This makes the Makefile a bit ugly.
diag:
ifeq ($(SHELL),sh.exe)
@echo Looks like plain WINDOWS command shell.
else
ifeq ($(findstring Git, $(SHELL)),Git)
@echo INFO: We are in MinGW/git shell, right?
else
ifeq ($(findstring Microsoft, $(shell cat /proc/version)), Microsoft)
@echo INFO: This looks like Ubuntu on Windows
else
ifeq ($(findstring CYGWIN, $(shell uname)),CYGWIN)
@echo INFO: We are on Cygwin, right?
else
@echo I assume $(shell uname) is a valid environment. Please enhance this line.
endif
endif
endif
endif
@echo SHELL=${SHELL}
@echo PDFLATEX=${PDFLATEX}
@echo MAKEINDEX=${MAKEINDEX}
@echo BIBER=${BIBER}
@echo PDFTK=${PDFTK}
@echo GS=${GS}
@echo RM=${RM}
@echo MV=${MV}
@echo MAKE4HT=$(MAKE4HT)