Makefile (16638B) - Raw
1 # River selector (GNU Awk syntax) to refresh-rivers target. 2 RIVERFILTER = Visinčia|Šalčia|Nemunas 3 4 # Max figure size (in meters) is when it's width is TEXTWIDTH_CM on scale 1:25k 5 SCALEDWIDTH = $(shell awk '/^TEXTWIDTH_CM/{print 25000/100*$$3}' layer2img.py) 6 SLIDES_IN = slides-2021-03-29.txt slides-2021-06-02.tex 7 SLIDES = slides-2021-03-29 slides-2021-06-02 8 LISTINGS = aggregate-rivers.sql wm.sql extract-and-generate 9 10 FIGURES = \ 11 test-figures \ 12 fig8-definition-of-a-bend \ 13 fig8-elimination-gen1 \ 14 fig8-elimination-gen2 \ 15 fig8-elimination-gen3 \ 16 fig5-gentle-inflection-before \ 17 fig5-gentle-inflection-after \ 18 inflection-1-gentle-inflection-before \ 19 inflection-1-gentle-inflection-after \ 20 fig6-selfcrossing \ 21 selfcrossing-1 \ 22 isolated-1-exaggerated 23 24 FIGURES_SLIDES += isolated-1-before \ 25 isolated-1-after 26 27 RIVERS = \ 28 salvis-25k \ 29 salvis-2x50k \ 30 salvis-250k-10x \ 31 salvis-grpk250-2x \ 32 salvis-dp64-2x50k \ 33 salvis-vw64-2x50k \ 34 salvis-dpchaikin64-2x50k \ 35 salvis-vwchaikin64-2x50k \ 36 salvis-overlaid-dpchaikin64-2x50k \ 37 salvis-overlaid-vwchaikin64-2x50k \ 38 salvis-wm220-10x \ 39 salvis-wm220-2x \ 40 salvis-wm-overlaid-250k-zoom \ 41 salvis-wm220 42 43 RIVERS_SLIDES += salvis-dp64overlaid-2x50k \ 44 salvis-dpchaikin64overlaid-2x50k 45 46 ################################################################################ 47 # FIGURES 48 ################################################################################ 49 test-figures_1SELECT = wm_figures 50 51 fig8-definition-of-a-bend_1SELECT = wm_debug where name='fig8' AND stage='afigures' AND gen=1 52 fig8-definition-of-a-bend_2SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=1 53 fig8-definition-of-a-bend_3SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=1 54 fig8-definition-of-a-bend_3LINESTYLE = dotted 55 56 fig8-elimination-gen1_1SELECT = wm_debug where name='fig8' AND stage='afigures' AND gen=1 57 fig8-elimination-gen1_2SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=1 58 fig8-elimination-gen1_3SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=1 59 fig8-elimination-gen1_3LINESTYLE = dotted 60 61 fig8-elimination-gen2_1SELECT = wm_debug where name='fig8' AND stage='afigures' AND gen=2 62 fig8-elimination-gen2_2SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=2 63 fig8-elimination-gen2_3SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=2 64 fig8-elimination-gen2_3LINESTYLE = dotted 65 fig8-elimination-gen3_1SELECT = wm_debug where name='fig8' AND stage='bbends' AND gen=3 66 fig8-elimination-gen3_2SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=3 67 fig8-elimination-gen3_3SELECT = wm_debug where name='fig8' AND stage='bbends-polygon' AND gen=3 68 fig8-elimination-gen3_3LINESTYLE = dotted 69 70 fig5-gentle-inflection-before_WITHDIV = 2 71 fig5-gentle-inflection-before_1SELECT = wm_debug where name='fig5' AND stage='afigures' AND gen=1 72 fig5-gentle-inflection-before_2SELECT = wm_debug where name='fig5' AND stage='bbends-polygon' AND gen=1 73 fig5-gentle-inflection-before_3SELECT = wm_debug where name='fig5' AND stage='bbends-polygon' AND gen=1 74 fig5-gentle-inflection-before_3LINESTYLE = dotted 75 fig5-gentle-inflection-after_WITHDIV = 2 76 fig5-gentle-inflection-after_1SELECT = wm_debug where name='fig5' AND stage='cinflections' AND gen=1 77 fig5-gentle-inflection-after_2SELECT = wm_debug where name='fig5' AND stage='cinflections-polygon' AND gen=1 78 fig5-gentle-inflection-after_3SELECT = wm_debug where name='fig5' AND stage='cinflections-polygon' AND gen=1 79 fig5-gentle-inflection-after_3LINESTYLE = dotted 80 81 inflection-1-gentle-inflection-before_WIDTHDIV = 2 82 inflection-1-gentle-inflection-before_1SELECT = wm_debug where name='inflection-1' AND stage='afigures' AND gen=1 83 inflection-1-gentle-inflection-before_2SELECT = wm_debug where name='inflection-1' AND stage='bbends-polygon' AND gen=1 84 inflection-1-gentle-inflection-before_3SELECT = wm_debug where name='inflection-1' AND stage='bbends-polygon' AND gen=1 85 inflection-1-gentle-inflection-before_3LINESTYLE = dotted 86 inflection-1-gentle-inflection-after_WIDTHDIV = 2 87 inflection-1-gentle-inflection-after_1SELECT = wm_debug where name='inflection-1' AND stage='cinflections' AND gen=1 88 inflection-1-gentle-inflection-after_2SELECT = wm_debug where name='inflection-1' AND stage='cinflections-polygon' AND gen=1 89 inflection-1-gentle-inflection-after_3SELECT = wm_debug where name='inflection-1' AND stage='cinflections-polygon' AND gen=1 90 inflection-1-gentle-inflection-after_3LINESTYLE = dotted 91 92 fig6-selfcrossing_WIDTHDIV = 2 93 fig6-selfcrossing_1SELECT = wm_debug where name='fig6' AND stage='afigures' AND gen=1 94 fig6-selfcrossing_1LINESTYLE = dotted 95 fig6-selfcrossing_2SELECT = wm_debug where name='fig6' AND stage='dcrossings' AND gen=1 96 fig6-selfcrossing_3SELECT = wm_visuals where name='fig6-baseline' 97 fig6-selfcrossing_3COLOR = orange 98 99 selfcrossing-1_WIDTHDIV = 2 100 selfcrossing-1_1SELECT = wm_debug where name='selfcrossing-1' AND stage='afigures' AND gen=1 101 selfcrossing-1_1LINESTYLE = dotted 102 selfcrossing-1_2SELECT = wm_debug where name='selfcrossing-1' AND stage='dcrossings' AND gen=1 103 selfcrossing-1_3SELECT = wm_visuals where name='selfcrossing-1-baseline' 104 selfcrossing-1_3COLOR = orange 105 106 isolated-1-exaggerated_WIDTHDIV = 2 107 isolated-1-exaggerated_1SELECT = wm_debug where name='isolated-1' AND stage='afigures' AND gen=2 108 isolated-1-exaggerated_2SELECT = wm_debug where name='isolated-1' AND stage='afigures' AND gen=1 109 isolated-1-exaggerated_1COLOR = orange 110 111 isolated-1-before_1SELECT = wm_debug where name='isolated-1' AND stage='afigures' AND gen=1 112 isolated-1-before_2SELECT = wm_debug where name='isolated-1' AND stage='afigures' AND gen=2 113 isolated-1-before_2LINESTYLE = invisible 114 isolated-1-before_WIDTHDIV = 2 115 isolated-1-after_1SELECT = wm_debug where name='isolated-1' AND stage='afigures' AND gen=2 116 isolated-1-after_1COLOR = orange 117 isolated-1-after_WIDTHDIV = 2 118 119 120 ################################################################################ 121 # 250K 122 ################################################################################ 123 124 salvis-wm220-250k-2x_1SELECT = wm_visuals where name='salvis-wm220' 125 salvis-wm220-250k-2x_WIDTHDIV = 2 126 127 salvis-wm220-250k-10x_1SELECT = wm_visuals where name='salvis-wm220' 128 salvis-wm220-250k-10x_WIDTHDIV = 10 129 130 salvis-250k-10x_1SELECT = wm_visuals where name='salvis-grpk10' 131 salvis-250k-10x_WIDTHDIV = 10 132 133 salvis-wm-overlaid-250k-zoom_1SELECT = wm_visuals where name='salvis-wm220' 134 salvis-wm-overlaid-250k-zoom_2SELECT = wm_visuals where name='salvis-grpk10' 135 salvis-wm-overlaid-250k-zoom_1COLOR = orange 136 137 salvis-grpk250-2x_1SELECT = wm_visuals where name='salvis-grpk250' 138 salvis-grpk250-2x_WIDTHDIV = 2 139 140 ################################################################################ 141 # 50K 142 ################################################################################ 143 144 label_wm75 = Wang--Müller 1:\numprint{50000} 145 label_wm220 = Wang--Müller 1:\numprint{250000} 146 label_vw64 = Visvalingam--Whyatt 147 label_dp64 = Douglas \& Peucker 148 label_grpk10 = GRPK 1:\numprint{10000} 149 label_grpk50 = GRPK 1:\numprint{50000} 150 label_vwchaikin64 = $(label_vw64) and Chaikin 151 label_dpchaikin64 = $(label_dp64) and Chaikin 152 label_vwchaikin64lt = $(label_vw64) ir Chaikin 153 label_dpchaikin64lt = $(label_dp64) ir Chaikin 154 legend_ = lower left 155 legend_tr = lower right 156 legend_tl = lower center 157 158 define wm_vwdp50k 159 RIVERS += salvis-$(1)-$(2)-$(3)-$(4)x50k$(5) 160 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_1SELECT = wm_visuals where name='salvis-$(1)' 161 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_1COLOR = orange 162 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_1LABEL = $(label_$(1)) 163 $(if $(2), 164 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_2SELECT = wm_visuals where name='salvis-$(2)' 165 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_2COLOR = green 166 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_2LABEL = $(label_$(2)) 167 ,) 168 $(if $(3), 169 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_3SELECT = wm_visuals where name='salvis-$(3)' 170 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_3LINESTYLE = $(6) 171 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_3LABEL = $(label_$(3)) 172 ,) 173 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_WIDTHDIV = $(4) 174 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_QUADRANT = $(5) 175 salvis-$(1)-$(2)-$(3)-$(4)x50k$(5)_LEGEND = $(legend_$(5)) 176 endef 177 178 wm_vwdp50kblack = $(call wm_vwdp50k,$(1),$(2),$(3),$(4),$(5)) 179 wm_vwdp50kdotted = $(call wm_vwdp50k,$(1),$(2),$(3),$(4),$(5),dotted) 180 181 $(foreach x,vw64 dp64 vwchaikin64 dpchaikin64,\ 182 $(eval $(call wm_vwdp50kdotted,wm75,$(x),grpk10,1,)) \ 183 ) 184 $(eval $(call wm_vwdp50kblack,wm75,grpk50,grpk10,1)) 185 $(eval $(call wm_vwdp50kblack,wm75,grpk50,grpk10,1,tr)) 186 $(eval $(call wm_vwdp50kblack,wm75,grpk50,grpk10,1,tl)) 187 188 $(eval $(call wm_vwdp50kblack,wm75,,grpk10,1)) 189 $(eval $(call wm_vwdp50kblack,wm75,,grpk10,1,tr)) 190 $(eval $(call wm_vwdp50kblack,wm75,,grpk10,1,tl)) 191 192 salvis-25k_1SELECT = wm_visuals where name='salvis-grpk10' 193 salvis-25k_WIDTHDIV = 1 194 195 salvis-2x50k_1SELECT = wm_visuals where name='salvis-grpk10' 196 salvis-2x50k_WIDTHDIV = 2 197 198 salvis-dp64overlaid-2x50k_1SELECT = wm_visuals where name='salvis-grpk10' 199 salvis-dp64overlaid-2x50k_1LABEL = $(label_grpk10) 200 salvis-dp64overlaid-2x50k_2SELECT = wm_visuals where name='salvis-dp64' 201 salvis-dp64overlaid-2x50k_2LABEL = $(label_dp64) 202 salvis-dp64overlaid-2x50k_2COLOR = orange 203 salvis-dp64overlaid-2x50k_QUADRANT = tl 204 salvis-dp64overlaid-2x50k_LEGEND = $(legend_tl) 205 206 salvis-dpchaikin64overlaid-2x50k_1SELECT = wm_visuals where name='salvis-grpk10' 207 salvis-dpchaikin64overlaid-2x50k_1LABEL = $(label_grpk10) 208 salvis-dpchaikin64overlaid-2x50k_2SELECT = wm_visuals where name='salvis-dpchaikin64' 209 salvis-dpchaikin64overlaid-2x50k_2COLOR = orange 210 salvis-dpchaikin64overlaid-2x50k_2LABEL = $(label_dpchaikin64lt) 211 salvis-dpchaikin64overlaid-2x50k_QUADRANT = tl 212 salvis-dpchaikin64overlaid-2x50k_LEGEND = $(legend_tl) 213 214 salvis-dp64-2x50k_1SELECT = wm_visuals where name='salvis-dp64' 215 salvis-dp64-2x50k_WIDTHDIV = 2 216 217 salvis-vw64-2x50k_1SELECT = wm_visuals where name='salvis-vw64' 218 salvis-vw64-2x50k_WIDTHDIV = 2 219 220 salvis-dpchaikin64-2x50k_2SELECT = wm_visuals where name='salvis-dpchaikin64' 221 salvis-dpchaikin64-2x50k_WIDTHDIV = 2 222 223 salvis-vwchaikin64-2x50k_2SELECT = wm_visuals where name='salvis-vwchaikin64' 224 salvis-vwchaikin64-2x50k_WIDTHDIV = 2 225 226 salvis-overlaid-dpchaikin64-2x50k_1SELECT = wm_visuals where name='salvis-dpchaikin64' 227 salvis-overlaid-dpchaikin64-2x50k_2SELECT = wm_visuals where name='salvis-grpk10' 228 salvis-overlaid-dpchaikin64-2x50k_1COLOR = orange 229 salvis-overlaid-dpchaikin64-2x50k_WIDTHDIV = 2 230 salvis-overlaid-dpchaikin64-2x50k_QUADRANT = tl 231 232 salvis-overlaid-vwchaikin64-2x50k_1SELECT = wm_visuals where name='salvis-vwchaikin64' 233 salvis-overlaid-vwchaikin64-2x50k_2SELECT = wm_visuals where name='salvis-grpk10' 234 salvis-overlaid-vwchaikin64-2x50k_1COLOR = orange 235 salvis-overlaid-vwchaikin64-2x50k_WIDTHDIV = 2 236 salvis-overlaid-vwchaikin64-2x50k_QUADRANT = tl 237 238 salvis-wm220_1SELECT = wm_visuals where name='salvis-wm220' 239 salvis-wm220_WIDTHDIV = 2 240 241 define FIG_template 242 $(1).pdf: layer2img.py Makefile $(2) 243 python3 ./layer2img.py --outfile=$(1).pdf \ 244 $$(if $$($(1)_LEGEND),--legend="$$($(1)_LEGEND)") \ 245 $$(if $$($(1)_WIDTHDIV),--widthdiv=$$($(1)_WIDTHDIV)) \ 246 $$(if $$($(1)_QUADRANT),--quadrant=$$($(1)_QUADRANT)) \ 247 $$(foreach i,1 2 3, \ 248 $$(if $$($(1)_$$(i)LABEL),--g$$(i)-label="$$($(1)_$$(i)LABEL)") \ 249 $$(if $$($(1)_$$(i)COLOR),--g$$(i)-color="$$($(1)_$$(i)COLOR)") \ 250 $$(if $$($(1)_$$(i)SELECT),--g$$(i)-select="$$($(1)_$$(i)SELECT)") \ 251 $$(if $$($(1)_$$(i)LINESTYLE),--g$$(i)-linestyle="$$($(1)_$$(i)LINESTYLE)") \ 252 ) 253 endef 254 255 $(foreach fig,$(FIGURES), $(eval $(call FIG_template,$(fig),.faux_test))) 256 $(foreach fig,$(FIGURES_SLIDES),$(eval $(call FIG_template,$(fig),.faux_test))) 257 $(foreach fig,$(RIVERS), $(eval $(call FIG_template,$(fig),.faux_visuals))) 258 $(foreach fig,$(RIVERS_SLIDES), $(eval $(call FIG_template,$(fig),.faux_visuals))) 259 260 ################################# 261 # The thesis, publishable version 262 ################################# 263 264 mj-msc-full.pdf: mj-msc.pdf version.inc.tex $(filter-out $(SLIDES_IN),$(shell git ls-files .)) ## Thesis for publishing 265 cp $< .tmp-$@ 266 for f in $^; do \ 267 if [ "$$f" = "$<" ]; then continue; fi; \ 268 pdfattach .tmp-$@ $$f .tmp2-$@; \ 269 mv .tmp2-$@ .tmp-$@; \ 270 done 271 mv .tmp-$@ $@ 272 273 ############################### 274 # Auxiliary targets for humans 275 ############################### 276 277 .PHONY: test 278 test: .faux_test ## Unit tests (fast) 279 280 .PHONY: visuals 281 visuals: .faux_visuals # Generate visuals for paper (fast) 282 283 .PHONY: test-rivers 284 test-rivers: .faux_test-rivers ## Rivers tests (slow) 285 286 .PHONY: slides 287 slides: $(addsuffix .pdf,$(SLIDES)) 288 289 .PHONY: refresh-rivers 290 refresh-rivers: refresh-rivers-10.sql refresh-rivers-50.sql refresh-rivers-250.sql ## Refresh river data from national datasets 291 292 ########################### 293 # The report, quick version 294 ########################### 295 296 mj-msc.pdf: mj-msc.tex version.inc.tex vars.inc.tex bib.bib \ 297 $(LISTINGS) $(addsuffix .pdf,$(FIGURES)) $(addsuffix .pdf,$(RIVERS)) 298 latexmk -shell-escape -pdf $< 299 300 ################################### 301 # Report's DB and test dependencies 302 ################################### 303 304 .faux_db_pre: db init.sql 305 bash db start 306 bash db -f init.sql 307 touch $@ 308 309 .faux_db: rivers-10.sql rivers-50.sql rivers-250.sql 310 bash db $(addprefix -f ,$^) 311 touch $@ 312 .faux_db: .EXTRA_PREREQS = .faux_db_pre 313 314 .faux_test: test.sql wm.sql .faux_db 315 bash db -f $< 316 touch $@ 317 318 .faux_visuals: visuals.sql .faux_test 319 bash db -v scaledwidth=$(SCALEDWIDTH) -f $< 320 touch $@ 321 322 .faux_test-rivers: test-rivers.sql wm.sql Makefile .faux_db 323 bash db -f $< 324 touch $@ 325 326 ################################ 327 # Report's non-test dependencies 328 ################################ 329 330 REF = $(shell git describe --abbrev=12 --always --dirty) 331 version.inc.tex: Makefile $(shell git rev-parse --git-dir 2>/dev/null) 332 TZ=UTC date '+\gdef\VCDescribe{%F (revision $(REF))}%' > $@ 333 334 vars.inc.tex: vars.awk wm.sql Makefile 335 awk -f $< wm.sql 336 337 ############### 338 # Misc commands 339 ############### 340 341 slides-2021-03-29.pdf: slides-2021-03-29.txt 342 pandoc -t beamer -i $< -o $@ 343 344 slides-2021-06-02.pdf: slides-2021-06-02.tex \ 345 amalgamate1.png selfcrossing-1.pdf \ 346 isolated-1-before.pdf isolated-1-after.pdf \ 347 salvis-grpk250-2x.pdf \ 348 salvis-wm220.pdf \ 349 salvis-wm75--grpk10-1x50k.pdf \ 350 salvis-wm75-grpk50-grpk10-1x50k.pdf \ 351 salvis-wm75-dp64-grpk10-1x50k.pdf \ 352 salvis-wm75-dpchaikin64-grpk10-1x50k.pdf \ 353 salvis-dp64overlaid-2x50k.pdf \ 354 salvis-dpchaikin64overlaid-2x50k.pdf \ 355 $(wilcard *logo.pdf) 356 latexmk -shell-escape -pdf $< 357 358 dump-debug_wm.sql.xz: 359 docker exec -ti wm-mj pg_dump -Uosm osm -t wm_devug | xz -v > $@ 360 361 mj-msc-gray.pdf: mj-msc.pdf ## Gray version, to inspect monochrome output 362 gs \ 363 -sOutputFile=$@ \ 364 -sDEVICE=pdfwrite \ 365 -sColorConversionStrategy=Gray \ 366 -dProcessColorModel=/DeviceGray \ 367 -dCompatibilityLevel=1.4 \ 368 -dNOPAUSE \ 369 -dBATCH \ 370 $< 371 372 .PHONY: clean 373 clean: ## Clean the current working directory 374 -bash db stop 375 -rm -r .faux_test .faux_aggregate-rivers .faux_test-rivers .faux_visuals \ 376 .faux_db .faux_db_pre version.inc.tex vars.inc.tex version.aux \ 377 version.fdb_latexmk _minted-* .tmp \ 378 $(shell git ls-files -o mj-msc*) \ 379 $(shell git ls-files -o slides-2021-06-02*) \ 380 $(addsuffix .pdf,$(FIGURES) $(FIGURES_SLIDES)) \ 381 $(addsuffix .pdf,$(RIVERS) $(RIVERS_SLIDES)) \ 382 $(addsuffix .pdf,$(SLIDES)) 383 384 .PHONY: clean-tables 385 clean-tables: ## Remove tables created during unit or rivers tests 386 bash db -c '\dt wm_*' | awk '/_/{print "drop table "$$3";"}' | bash db -f - 387 -rm .faux_db 388 389 .PHONY: help 390 help: ## Print this help message 391 @awk -F':.*?## ' '/^[a-z0-9.-]*: *.*## */{printf "%-18s %s\n",$$1,$$2}' \ 392 $(MAKEFILE_LIST) | sort 393 394 .PHONY: wc 395 wc: mj-msc.pdf 396 @pdftotext $< - | \ 397 awk '/\yReferences\y/{exit}; {print}' | \ 398 tr -d '[:space:]' | wc -c | \ 399 awk '{printf("Chars: %d, pages: %.1f\n", $$1, $$1/1500)}' 400 401 define refresh_rivers_template 402 .PHONY: refresh-$(1) 403 refresh-$(1): aggregate-rivers.sql gdr2pgsql .faux_db_pre 404 @if [ ! -f "$$($(2))" ]; then \ 405 echo "ERROR: $(2)-static-*.zip not found. Run env $(2)=<...>"; \ 406 exit 1; \ 407 fi 408 ./gdr2pgsql "$$($(2))" "$(3)" "$(RIVERFILTER)" "$(1)" 409 endef 410 411 $(eval $(call refresh_rivers_template,rivers-10.sql,GDB10LT,wm_rivers)) 412 $(eval $(call refresh_rivers_template,rivers-50.sql,GDR50LT,wm_rivers_50)) 413 $(eval $(call refresh_rivers_template,rivers-250.sql,GDR250LT,wm_rivers_250)) 414 415 release.zip: mj-msc.tex mj-msc.bbl version.inc.tex vars.inc.tex \ 416 $(addsuffix .pdf,$(FIGURES)) $(addsuffix .pdf,$(RIVERS)) \ 417 $(shell git ls-files .) 418 -rm $@ 419 mkdir -p .tmp; touch .tmp/editorial-version 420 zip $@ $^ 421 zip $@ -j .tmp/editorial-version 422 423 mj-msc.bbl: mj-msc.tex bib.bib 424 biber mj-msc