Makefile
changeset 339 4d8d46bbe30d
parent 338 61a9d2de0e3e
child 384 3af39c0b5229
equal deleted inserted replaced
338:61a9d2de0e3e 339:4d8d46bbe30d
    42 endif
    42 endif
    43 
    43 
    44 ################################################################
    44 ################################################################
    45 # Version extracting/generation.
    45 # Version extracting/generation.
    46 
    46 
       
    47 VER_FILE := dist/misc/VERSION
       
    48 
    47 # Prevent making distribution with wrong version.
    49 # Prevent making distribution with wrong version.
    48 ifneq '' '$(filter deploy% dist%,$(MAKECMDGOALS))'
    50 ifneq '' '$(filter deploy% dist%,$(MAKECMDGOALS))'
    49   ifeq '' '$(MAKE_RESTARTS)'
    51   ifeq '' '$(MAKE_RESTARTS)'
    50     $(info $(shell rm -f VERSION))
    52     $(shell rm -f $(VER_FILE))
    51   endif
    53   endif
    52 endif
    54 endif
    53 
    55 
    54 # Here are vmajor and vminor. Look README section "Versioning rules."
    56 # Here are vmajor and vminor. Look README section "Versioning rules."
    55 -include VERSION
    57 -include $(VER_FILE)
    56 
    58 
    57 VERSION:
    59 $(VER_FILE): | $(dir $(VER_FILE))
    58 	\
    60 	\
    59 vtagdist=$$(hg log -r . --template '{latesttagdistance}'); \
    61 vtagdist=$$(hg log -r . --template '{latesttagdistance}'); \
    60 vatrelease=$$([ $$vtagdist -le 1 ] && echo yes || echo no); \
    62 vatrelease=$$([ $$vtagdist -le 1 ] && echo yes || echo no); \
    61 vtag=$$(hg log -r . --template '{latesttag}'); \
    63 vtag=$$(hg log -r . --template '{latesttag}'); \
    62 vmajor=$${vtag#v}; \
    64 vmajor=$${vtag#v}; \
    71 echo "vtagdist=$$vtagdist"; \
    73 echo "vtagdist=$$vtagdist"; \
    72 echo "visclean=$$visclean"; \
    74 echo "visclean=$$visclean"; \
    73 echo "vatrelease=$$vatrelease"; \
    75 echo "vatrelease=$$vatrelease"; \
    74 echo "vmajor=$$vmajor"; \
    76 echo "vmajor=$$vmajor"; \
    75 echo "vminor=$$vminor"; \
    77 echo "vminor=$$vminor"; \
    76 } >VERSION
    78 } >$@
    77 
    79 
    78 ################################################################
    80 ################################################################
    79 # Determine platform/environment.
    81 # Determine platform/environment.
    80 
    82 
    81 host_os = unix
    83 host_os = unix
   103 
   105 
   104 RST2HTML := rst2html
   106 RST2HTML := rst2html
   105 ifeq '$(host_os)' 'cygwin'
   107 ifeq '$(host_os)' 'cygwin'
   106   RST2HTML := rst2html.py
   108   RST2HTML := rst2html.py
   107 endif
   109 endif
   108 RST2HTML_FLAGS := $(RST_FLAGS)
   110 RST2HTML_RENDER_FLAGS := --strip-comments --embed-stylesheet --no-xml-declaration --math-output=HTML --initial-header-level=2
       
   111 RST2HTML_FLAGS := $(RST_FLAGS) $(RST2HTML_RENDER_FLAGS)
   109 
   112 
   110 LATEX2PDF := pdflatex
   113 LATEX2PDF := pdflatex
   111 
   114 
   112 ################################################################
   115 ################################################################
   113 # Install paths.
   116 # Install paths.
   126 # Project dirs/files.
   129 # Project dirs/files.
   127 
   130 
   128 pkgname = gadict
   131 pkgname = gadict
   129 fullpkgname = $(pkgname)-$(vmajor).$(vminor)
   132 fullpkgname = $(pkgname)-$(vmajor).$(vminor)
   130 
   133 
       
   134 GADICT_FILES := $(wildcard *.gadict)
       
   135 
   131 C5_FILES := $(wildcard *.dict-c5)
   136 C5_FILES := $(wildcard *.dict-c5)
   132 DICT_FILES := $(C5_FILES:.dict-c5=.dict)
   137 DICT_FILES := $(C5_FILES:.dict-c5=.dict)
   133 DICTDZ_FILES := $(C5_FILES:.dict-c5=.dict.dz)
   138 DICTDZ_FILES := $(C5_FILES:.dict-c5=.dict.dz)
   134 INDEX_FILES := $(C5_FILES:.dict-c5=.index)
   139 INDEX_FILES := $(C5_FILES:.dict-c5=.index)
   135 
   140 
   136 RST_GEN_FILES := VERSION.rst STAT.rst index.rst
   141 RST_TMPL_FILE = dist/misc/rst.tmpl
   137 RST_COMMON_FILES := VERSION.rst header.rst
   142 RST_CSS_FILE = www/tmpl/rst.css
   138 RST_FILES := $(filter-out $(RST_COMMON_FILES),$(sort $(wildcard *.rst) $(RST_GEN_FILES)))
   143 
   139 RST_HTML_FILES := $(RST_FILES:.rst=.html)
   144 RST_GEN_FILES := STAT.rst
       
   145 RST_COMMON_FILES := header.rst
       
   146 RST_FILES := $(wildcard www/*.rst)
       
   147 RST_HTML_FILES := $(patsubst www/%.rst,dist/www/%.html,$(RST_FILES))
       
   148 
       
   149 INDEX_HTML_FILE := dist/www/index.html
       
   150 
       
   151 STAT_RST_FILE := dist/misc/STAT.rst
       
   152 STAT_HTML_FILE := dist/www/STAT.html
       
   153 
       
   154 HTML_FILES := $(RST_HTML_FILES) $(INDEX_HTML_FILE) $(STAT_HTML_FILE)
   140 
   155 
   141 LOGO_NAME := logo
   156 LOGO_NAME := logo
   142 LOGO_SVG := $(LOGO_NAME).svg
   157 LOGO_SVG := $(LOGO_NAME).svg
   143 LOGO_DIM := 32x32 48x48 64x64
   158 LOGO_DIM := 32x32 48x48 64x64
   144 LOGO_PNG_FILES := $(patsubst %,$(LOGO_NAME)-%.png,$(LOGO_DIM))
   159 LOGO_PNG_FILES := $(patsubst %,$(LOGO_NAME)-%.png,$(LOGO_DIM))
   145 
   160 
   146 DIST_DIR = $(fullpkgname)
   161 DIST_DIR = $(fullpkgname)
   147 DISTSRC_DIR = $(fullpkgname)_src
   162 DISTSRC_DIR = $(fullpkgname)_src
   148 
   163 
   149 DIST_FILES = $(DICTDZ_FILES) $(INDEX_FILES) $(RST_HTML_FILES) $(RST_FILES) VERSION
   164 DIST_FILES = $(DICTDZ_FILES) $(INDEX_FILES) $(RST_HTML_FILES) $(RST_FILES)
   150 
   165 
   151 DISTSRC_HELPER_FILES = VERSION Makefile rst.css .dir-locals.el
   166 DISTSRC_HELPER_FILES = Makefile rst.css .dir-locals.el
   152 DISTSRC_FILES = $(C5_FILES) $(RST_FILES) $(DISTSRC_HELPER_FILES)
   167 DISTSRC_FILES = $(C5_FILES) $(RST_FILES) $(DISTSRC_HELPER_FILES)
   153 
   168 
   154 DIST_TARBALLS = $(DIST_DIR).tar.gz $(DIST_DIR).tar.bz2
   169 DIST_TARBALLS = $(DIST_DIR).tar.gz $(DIST_DIR).tar.bz2
   155 DISTSRC_TARBALLS = $(DISTSRC_DIR).tar.gz $(DISTSRC_DIR).tar.bz2
   170 DISTSRC_TARBALLS = $(DISTSRC_DIR).tar.gz $(DISTSRC_DIR).tar.bz2
   156 
   171 
   157 ################################################################
   172 ################################################################
   158 # Deploy targets.
   173 # Deploy/release targets.
   159 
   174 
   160 .PHONY: deploy
   175 .PHONY: deploy
   161 deploy: deploy2defun deploy2sf
   176 deploy: deploy2defun deploy2sf
       
   177 
       
   178 .PHONY: release
       
   179 release: release2defun release2sf
       
   180 
       
   181 .PHONY: release2defun
       
   182 release2defun: validate-release deploy2defun
       
   183 
       
   184 .PHONY: release2sf
       
   185 release2defun: validate-release deploy2sf
   162 
   186 
   163 
   187 
   164 DEFUN_USER ?= user
   188 DEFUN_USER ?= user
   165 DEFUN_HG_SRV ?= hg.defun.work
   189 DEFUN_HG_SRV ?= hg.defun.work
   166 DEFUN_HG_DIR ?= /srv/hg/gadict
   190 DEFUN_HG_DIR ?= /srv/hg/gadict
   173 .PHONY: deploy2defun-src
   197 .PHONY: deploy2defun-src
   174 deploy2defun-src:
   198 deploy2defun-src:
   175 	hg push ssh://$(DEFUN_USER)@$(DEFUN_HG_SRV)/$(DEFUN_HG_DIR) || [ $$? = 1 ]
   199 	hg push ssh://$(DEFUN_USER)@$(DEFUN_HG_SRV)/$(DEFUN_HG_DIR) || [ $$? = 1 ]
   176 
   200 
   177 .PHONY: deploy2defun-www
   201 .PHONY: deploy2defun-www
   178 deploy2defun-www: $(RST_HTML_FILES)
   202 deploy2defun-www: $(HTML_FILES)
   179 	( \
   203 	( \
   180 echo 'cd $(DEFUN_WWW_DIR)'; \
   204 echo 'cd $(DEFUN_WWW_DIR)'; \
   181 for f in $(RST_HTML_FILES); do \
   205 for f in $(HTML_FILES); do \
   182   echo "put $$f"; \
   206   n=$${f##*/}; \
   183   echo "chmod 644 $$f"; \
   207   echo "put $$f $$n"; \
       
   208   echo "chmod 644 $$n"; \
   184 done; \
   209 done; \
   185 echo 'quit'; \
   210 echo 'quit'; \
   186 ) | sftp -b - $(DEFUN_USER)@$(DEFUN_WWW_SRV)
   211 ) | sftp -b - $(DEFUN_USER)@$(DEFUN_WWW_SRV)
   187 
   212 
   188 
   213 
   192 #   $ sftp $(SF_USER),$(pkgname)@web.sourceforge.net
   217 #   $ sftp $(SF_USER),$(pkgname)@web.sourceforge.net
   193 # as it may require interactive input for accepting server public key.
   218 # as it may require interactive input for accepting server public key.
   194 # Next time any action fully automated.
   219 # Next time any action fully automated.
   195 
   220 
   196 .PHONY: deploy2sf
   221 .PHONY: deploy2sf
   197 deploy2sf: deploy2sf-src deploy2sf-www deploy2sf-voa deploy2sf-release
   222 deploy2sf: deploy2sf-src deploy2sf-www deploy2sf-voa
   198 
   223 
   199 .PHONY: deploy2sf-src
   224 .PHONY: deploy2sf-src
   200 deploy2sf-src:
   225 deploy2sf-src:
   201 	hg push ssh://$(SF_USER)@hg.code.sf.net/p/$(pkgname)/code || [ $$? = 1 ]
   226 	hg push ssh://$(SF_USER)@hg.code.sf.net/p/$(pkgname)/code || [ $$? = 1 ]
   202 
   227 
   203 # Will be accessed via http://$(pkgname).sourceforge.net
   228 # Will be accessed via http://$(pkgname).sourceforge.net
   204 .PHONY: deploy2sf-www
   229 .PHONY: deploy2sf-www
   205 deploy2sf-www: deploy-check $(RST_HTML_FILES)
   230 deploy2sf-www: $(HTML_FILES)
   206 	( echo 'cd htdocs'; \
   231 	( echo 'cd htdocs'; \
   207 for f in $(RST_HTML_FILES); do \
   232 for f in $(HTML_FILES); do \
   208   echo "put $$f"; \
   233   n=$${f##*/}; \
   209   echo "chmod 644 $$f"; \
   234   echo "put $$f $$n"; \
       
   235   echo "chmod 644 $$n"; \
   210 done; \
   236 done; \
   211 echo 'quit'; \
   237 echo 'quit'; \
   212 ) | sftp -b - $(SF_USER),$(pkgname)@web.sourceforge.net
   238 ) | sftp -b - $(SF_USER),$(pkgname)@web.sourceforge.net
   213 
   239 
   214 .PHONY: deploy2sf-voa
   240 .PHONY: deploy2sf-voa
   217   echo "put voa-special.pdf"; \
   243   echo "put voa-special.pdf"; \
   218   echo "chmod 644 voa-special.pdf"; \
   244   echo "chmod 644 voa-special.pdf"; \
   219 echo 'quit'; \
   245 echo 'quit'; \
   220 ) | sftp -b - $(SF_USER),$(pkgname)@web.sourceforge.net
   246 ) | sftp -b - $(SF_USER),$(pkgname)@web.sourceforge.net
   221 
   247 
   222 .PHONY: deploy2sf-release
   248 .PHONY: release2sf
   223 deploy2sf-release: deploy-check $(DIST_TARBALLS) $(DISTSRC_TARBALLS)
   249 deploy2sf-release: validate-release $(DIST_TARBALLS) $(DISTSRC_TARBALLS)
       
   250 	exit 1
       
   251 	: TODO broken due to new project hierarchy
   224 	( echo 'cd /home/frs/project/$(shell v=$(pkgname); echo $${v:0:1}/$${v:0:2})/$(pkgname)'; \
   252 	( echo 'cd /home/frs/project/$(shell v=$(pkgname); echo $${v:0:1}/$${v:0:2})/$(pkgname)'; \
   225 echo "put  README.rst"; \
   253 echo "put  README.rst"; \
   226 echo "chmod 644 README.rst"; \
   254 echo "chmod 644 README.rst"; \
   227 echo "mkdir v$(vmajor).$(vminor)"; \
   255 echo "mkdir v$(vmajor).$(vminor)"; \
   228 echo "cd v$(vmajor).$(vminor)"; \
   256 echo "cd v$(vmajor).$(vminor)"; \
   231 	echo "chmod 644 $$f"; \
   259 	echo "chmod 644 $$f"; \
   232 done; \
   260 done; \
   233 echo 'quit'; \
   261 echo 'quit'; \
   234 ) | sftp -b - $(SF_USER),$(pkgname)@frs.sourceforge.net
   262 ) | sftp -b - $(SF_USER),$(pkgname)@frs.sourceforge.net
   235 
   263 
   236 .PHONY: deploy-check
   264 .PHONY: validate-release
   237 deploy-check:
   265 validate-release:
   238 	\
   266 	\
   239 case ${visclean} in \
   267 case ${visclean} in \
   240   no) echo "Local changes found. Build stop."; \
   268   no) echo "Local changes found. Build stop."; \
   241     exit 1;; \
   269     exit 1;; \
   242 esac
   270 esac
   318 docs: html
   346 docs: html
   319 
   347 
   320 .PHONY: html
   348 .PHONY: html
   321 html: $(RST_HTML_FILES)
   349 html: $(RST_HTML_FILES)
   322 
   350 
   323 $(RST_HTML_FILES): %.html: %.rst $(RST_COMMON_FILES) rst.css $(BUILD_SCRIPTS)
   351 $(INDEX_HTML_FILE): dist/www/README.html
   324 	$(RST2HTML) $(RST2HTML_FLAGS) --stylesheet=rst.css $*.rst $@
   352 	cp $< $@
   325 
   353 
   326 VERSION.rst: VERSION $(BUILD_SCRIPTS)
   354 $(RST_HTML_FILES): dist/www/%.html: www/%.rst $(RST_CSS_FILE) $(RST_TMPL_FILE) $(BUILD_SCRIPTS) | dist/www
       
   355 	$(RST2HTML) $(RST2HTML_FLAGS) --stylesheet=$(RST_CSS_FILE) --template=$(RST_TMPL_FILE)  www/$*.rst  $@
       
   356 
       
   357 dist/www:
       
   358 	mkdir -p $@
       
   359 
       
   360 $(RST_TMPL_FILE): www/tmpl/rst.tmpl.in $(BUILD_SCRIPTS) | $(dir $(RST_TMPL_FILE))
       
   361 	\
       
   362 [[ ${visclean} = no ]] && warn1='<b>Warning</b>: Build done with local changes!' || :; \
       
   363 [[ ${vatrelease} = no ]] && warn2='<b>Warning</b>: Build is far from latest <tt>$(vtag)</tt> release state by $(vtagdist) changes.' || :; \
       
   364 sed -e "s|{date}|$$(date +%F)|" -e "s|{rev}|$$(hg id -i)|" -e "s|{warn1}|$$warn1|" -e "s|{warn2}|$$warn2|" <$< >$@
       
   365 
       
   366 ################################################################
       
   367 # Article statistics.
       
   368 
       
   369 .PHONY: stat
       
   370 stat: $(STAT_HTML_FILE)
       
   371 
       
   372 $(STAT_HTML_FILE): $(STAT_RST_FILE) $(RST_CSS_FILE) $(RST_TMPL_FILE) | dist/www
       
   373 	$(RST2HTML) $(RST2HTML_FLAGS) --stylesheet=$(RST_CSS_FILE) --template=$(RST_TMPL_FILE)  $<  $@
       
   374 
       
   375 $(STAT_RST_FILE): $(GADICT_FILES) $(BUILD_SCRIPTS)
   327 	{ \
   376 	{ \
   328 	echo '``$(pkgname)`` ``v$(vmajor).$(vminor)`` built on ``'$$(date +%F)'`` from revision ``$(vrev)``.'; \
   377 echo '==========================='; \
   329 	echo; \
   378 echo ' gadict project statistics'; \
   330 	case ${visclean} in \
   379 echo '==========================='; \
   331 		yes) : ;; \
   380 echo '.. contents::'; \
   332 		no) echo 'WARNING!! Source tree has local changes!';; \
   381 echo '   :local:'; \
   333 	esac; \
   382 echo; \
   334 	echo; \
   383 echo '======================================== ====='; \
   335 	case ${vatrelease} in \
   384 echo '             Dictionary                  Count'; \
   336 		yes) : ;; \
   385 echo '======================================== ====='; \
   337 		no) echo 'Package is far from release state by $(vtagdist) changes.';; \
   386 total=0; \
   338 	esac; \
   387 for dic in $(GADICT_FILES); do \
   339 	} >$@
   388   cnt=`grep '^__' $$dic | wc -l`; \
   340 
   389   printf '%40s %5s\n' $${dic%.dict-c5} $$cnt; \
   341 index.rst: README.rst
   390   total=$$(($$total + $$cnt)); \
   342 	cp $< $@
   391 done; \
       
   392 printf '%40s %5s\n' '**Total**' $$total; \
       
   393 echo '======================================== ====='; \
       
   394 } >$@
   343 
   395 
   344 ################################################################
   396 ################################################################
   345 # Misc targets.
   397 # Misc targets.
   346 
   398 
   347 .PHONY: logo
   399 .PHONY: logo
   385 
   437 
   386 .PHONY: todo
   438 .PHONY: todo
   387 todo:
   439 todo:
   388 	grep -nH 'TODO\|XXX' $(RST_FILES) $(C5_FILES)
   440 	grep -nH 'TODO\|XXX' $(RST_FILES) $(C5_FILES)
   389 
   441 
   390 .PHONY: stat
       
   391 stat: STAT.rst
       
   392 
       
   393 STAT.rst: $(C5_FILES) header.rst VERSION.rst $(BUILD_SCRIPTS)
       
   394 	{ \
       
   395 echo '.. include:: header.rst'; \
       
   396 echo; \
       
   397 echo '============================'; \
       
   398 echo ' gadict project statistics.'; \
       
   399 echo '============================'; \
       
   400 echo '.. contents::'; \
       
   401 echo; \
       
   402 echo 'Document version.'; \
       
   403 echo '================='; \
       
   404 echo; \
       
   405 echo '.. include:: VERSION.rst'; \
       
   406 echo; \
       
   407 echo 'Statistics on count of articles in gadict dictionaries.'; \
       
   408 echo '======================================================='; \
       
   409 echo; \
       
   410 echo 'You must know that some words have articles (usually but not always same) in'; \
       
   411 echo 'several dictionaries. So real count of words is less then total count.'; \
       
   412 echo; \
       
   413 echo '======================================== ====='; \
       
   414 echo '             Dictionary                  Count'; \
       
   415 echo '======================================== ====='; \
       
   416 total=0; \
       
   417 for dic in $(C5_FILES); do \
       
   418   cnt=`grep '^_____' $$dic | wc -l`; \
       
   419   printf '%40s %5s\n' $${dic%.dict-c5} $$cnt; \
       
   420   total=$$(($$total + $$cnt)); \
       
   421 done; \
       
   422 printf '%40s %5s\n' '**Total**' $$total; \
       
   423 echo '======================================== ====='; \
       
   424 } >$@
       
   425 
       
   426 .PHONY: logo-png
   442 .PHONY: logo-png
   427 logo-png: logo-64x64.png
   443 logo-png: logo-64x64.png
   428 
   444 
   429 # Require:
   445 # Require:
   430 #   $ sudo apt-get install imagemagick librsvg2-bin
   446 #   $ sudo apt-get install imagemagick librsvg2-bin
   434 ################################################################
   450 ################################################################
   435 # Clean targets.
   451 # Clean targets.
   436 
   452 
   437 .PHONY: distclean
   453 .PHONY: distclean
   438 distclean: clean
   454 distclean: clean
   439 	rm -f VERSION
       
   440 
   455 
   441 .PHONY: clean
   456 .PHONY: clean
   442 clean:
   457 clean:
   443 	rm -f $(DICTDZ_FILES) $(INDEX_FILES) $(RST_GEN_FILES) $(RST_HTML_FILES) $(LOGO_PNG_FILES)
   458 	rm -rf dist/
   444 	rm -rf $(DIST_DIR) $(DIST_TARBALLS)
   459 
   445 	rm -rf $(DISTSRC_DIR) $(DISTSRC_TARBALLS)
       
   446 	rm -f $(patsubst %, voa-special%, .pdf .log .out .aux)
       
   447