Makefileon commit git-gui: add a simple msgfmt replacement (cd38c86)
   1all::
   2
   3# Define V=1 to have a more verbose compile.
   4#
   5# Define NO_MSGFMT if you do not have msgfmt from the GNU gettext
   6# package and want to use our rough pure Tcl po->msg translator.
   7# TCL_PATH must be vaild for this to work.
   8#
   9
  10GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
  11        @$(SHELL_PATH) ./GIT-VERSION-GEN
  12-include GIT-VERSION-FILE
  13
  14uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
  15
  16SCRIPT_SH = git-gui.sh
  17GITGUI_BUILT_INS = git-citool
  18ALL_PROGRAMS = $(GITGUI_BUILT_INS) $(patsubst %.sh,%,$(SCRIPT_SH))
  19ALL_LIBFILES = $(wildcard lib/*.tcl)
  20PRELOAD_FILES = lib/class.tcl
  21
  22ifndef SHELL_PATH
  23        SHELL_PATH = /bin/sh
  24endif
  25
  26ifndef gitexecdir
  27        gitexecdir := $(shell git --exec-path)
  28endif
  29
  30ifndef sharedir
  31        sharedir := $(dir $(gitexecdir))share
  32endif
  33
  34ifndef INSTALL
  35        INSTALL = install
  36endif
  37
  38RM_F      ?= rm -f
  39RMDIR     ?= rmdir
  40
  41INSTALL_D0 = $(INSTALL) -d -m755 # space is required here
  42INSTALL_D1 =
  43INSTALL_R0 = $(INSTALL) -m644 # space is required here
  44INSTALL_R1 =
  45INSTALL_X0 = $(INSTALL) -m755 # space is required here
  46INSTALL_X1 =
  47INSTALL_L0 = rm -f # space is required here
  48INSTALL_L1 = && ln # space is required here
  49INSTALL_L2 =
  50INSTALL_L3 =
  51
  52REMOVE_D0  = $(RMDIR) # space is required here
  53REMOVE_D1  = || true
  54REMOVE_F0  = $(RM_F) # space is required here
  55REMOVE_F1  =
  56CLEAN_DST  = true
  57
  58ifndef V
  59        QUIET          = @
  60        QUIET_GEN      = $(QUIET)echo '   ' GEN $@ &&
  61        QUIET_BUILT_IN = $(QUIET)echo '   ' BUILTIN $@ &&
  62        QUIET_INDEX    = $(QUIET)echo '   ' INDEX $(dir $@) &&
  63        QUIET_MSGFMT0  = $(QUIET)printf '    MSGFMT %12s ' $@ && v=`
  64        QUIET_MSGFMT1  = 2>&1` && echo "$$v" | sed -e 's/fuzzy translations/fuzzy/' | sed -e 's/ messages//g'
  65        QUIET_2DEVNULL = 2>/dev/null
  66
  67        INSTALL_D0 = dir=
  68        INSTALL_D1 = && echo ' ' DEST $$dir && $(INSTALL) -d -m755 "$$dir"
  69        INSTALL_R0 = src=
  70        INSTALL_R1 = && echo '   ' INSTALL 644 `basename $$src` && $(INSTALL) -m644 $$src
  71        INSTALL_X0 = src=
  72        INSTALL_X1 = && echo '   ' INSTALL 755 `basename $$src` && $(INSTALL) -m755 $$src
  73
  74        INSTALL_L0 = dst=
  75        INSTALL_L1 = && src=
  76        INSTALL_L2 = && dst=
  77        INSTALL_L3 = && echo '   ' 'LINK       ' `basename "$$dst"` '->' `basename "$$src"` && rm -f "$$dst" && ln "$$src" "$$dst"
  78
  79        CLEAN_DST = echo ' ' UNINSTALL
  80        REMOVE_D0 = dir=
  81        REMOVE_D1 = && echo ' ' REMOVE $$dir && test -d "$$dir" && $(RMDIR) "$$dir" || true
  82        REMOVE_F0 = dst=
  83        REMOVE_F1 = && echo '   ' REMOVE `basename "$$dst"` && $(RM_F) "$$dst"
  84endif
  85
  86TCL_PATH   ?= tclsh
  87TCLTK_PATH ?= wish
  88
  89ifeq ($(findstring $(MAKEFLAGS),s),s)
  90QUIET_GEN =
  91QUIET_BUILT_IN =
  92endif
  93
  94DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
  95gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
  96SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
  97TCL_PATH_SQ = $(subst ','\'',$(TCL_PATH))
  98TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
  99TCLTK_PATH_SED = $(subst ','\'',$(subst \,\\,$(TCLTK_PATH)))
 100
 101gg_libdir ?= $(sharedir)/git-gui/lib
 102libdir_SQ  = $(subst ','\'',$(gg_libdir))
 103libdir_SED = $(subst ','\'',$(subst \,\\,$(gg_libdir)))
 104exedir     = $(dir $(gitexecdir))share/git-gui/lib
 105
 106GITGUI_SCRIPT   := $$0
 107GITGUI_RELATIVE :=
 108
 109ifeq ($(exedir),$(gg_libdir))
 110        GITGUI_RELATIVE := 1
 111endif
 112
 113ifeq ($(uname_O),Cygwin)
 114        GITGUI_SCRIPT := `cygpath --windows --absolute "$(GITGUI_SCRIPT)"`
 115        ifeq ($(GITGUI_RELATIVE),)
 116                gg_libdir := $(shell cygpath --windows --absolute "$(gg_libdir)")
 117        endif
 118endif
 119
 120$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
 121        $(QUIET_GEN)rm -f $@ $@+ && \
 122        sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
 123                -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \
 124                -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \
 125                -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
 126                -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \
 127                -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \
 128                $@.sh >$@+ && \
 129        chmod +x $@+ && \
 130        mv $@+ $@
 131
 132$(GITGUI_BUILT_INS): git-gui
 133        $(QUIET_BUILT_IN)rm -f $@ && ln git-gui $@
 134
 135XGETTEXT   ?= xgettext
 136ifdef NO_MSGFMT
 137        MSGFMT ?= $(TCL_PATH) po/po2msg.sh
 138else
 139        MSGFMT ?= msgfmt
 140endif
 141
 142msgsdir     = $(gg_libdir)/msgs
 143msgsdir_SQ  = $(subst ','\'',$(msgsdir))
 144PO_TEMPLATE = po/git-gui.pot
 145ALL_POFILES = $(wildcard po/*.po)
 146ALL_MSGFILES = $(subst .po,.msg,$(ALL_POFILES))
 147
 148$(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES)
 149        $(XGETTEXT) -kmc -LTcl -o $@ $(SCRIPT_SH) $(ALL_LIBFILES)
 150update-po:: $(PO_TEMPLATE)
 151        $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; )
 152$(ALL_MSGFILES): %.msg : %.po
 153        $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) $(QUIET_MSGFMT1)
 154
 155lib/tclIndex: $(ALL_LIBFILES)
 156        $(QUIET_INDEX)if echo \
 157          $(foreach p,$(PRELOAD_FILES),source $p\;) \
 158          auto_mkindex lib '*.tcl' \
 159        | $(TCL_PATH) $(QUIET_2DEVNULL); then : ok; \
 160        else \
 161         echo 1>&2 "    * $(TCL_PATH) failed; using unoptimized loading"; \
 162         rm -f $@ ; \
 163         echo '# Autogenerated by git-gui Makefile' >$@ && \
 164         echo >>$@ && \
 165         $(foreach p,$(PRELOAD_FILES) $(ALL_LIBFILES),echo '$(subst lib/,,$p)' >>$@ &&) \
 166         echo >>$@ ; \
 167        fi
 168
 169# These can record GITGUI_VERSION
 170$(patsubst %.sh,%,$(SCRIPT_SH)): GIT-VERSION-FILE GIT-GUI-VARS
 171lib/tclIndex: GIT-GUI-VARS
 172
 173TRACK_VARS = \
 174        $(subst ','\'',SHELL_PATH='$(SHELL_PATH_SQ)') \
 175        $(subst ','\'',TCL_PATH='$(TCL_PATH_SQ)') \
 176        $(subst ','\'',TCLTK_PATH='$(TCLTK_PATH_SQ)') \
 177        $(subst ','\'',gitexecdir='$(gitexecdir_SQ)') \
 178        $(subst ','\'',gg_libdir='$(libdir_SQ)') \
 179#end TRACK_VARS
 180
 181GIT-GUI-VARS: .FORCE-GIT-GUI-VARS
 182        @VARS='$(TRACK_VARS)'; \
 183        if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
 184                echo 1>&2 "    * new locations or Tcl/Tk interpreter"; \
 185                echo 1>$@ "$$VARS"; \
 186        fi
 187
 188all:: $(ALL_PROGRAMS) lib/tclIndex $(ALL_MSGFILES)
 189
 190install: all
 191        $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1)
 192        $(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
 193        $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true
 194        $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(INSTALL_D1)
 195        $(QUIET)$(INSTALL_R0)lib/tclIndex $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)'
 196        $(QUIET)$(foreach p,$(ALL_LIBFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' &&) true
 197        $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(INSTALL_D1)
 198        $(QUIET)$(foreach p,$(ALL_MSGFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true
 199
 200uninstall:
 201        $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
 202        $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1)
 203        $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true
 204        $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(libdir_SQ)'
 205        $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/tclIndex $(REMOVE_F1)
 206        $(QUIET)$(foreach p,$(ALL_LIBFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true
 207        $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(msgsdir_SQ)'
 208        $(QUIET)$(foreach p,$(ALL_MSGFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(msgsdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true
 209        $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(REMOVE_D1)
 210        $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(REMOVE_D1)
 211        $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(REMOVE_D1)
 212        $(QUIET)$(REMOVE_D0)`dirname '$(DESTDIR_SQ)$(libdir_SQ)'` $(REMOVE_D1)
 213
 214dist-version:
 215        @mkdir -p $(TARDIR)
 216        @echo $(GITGUI_VERSION) > $(TARDIR)/version
 217
 218clean::
 219        rm -f $(ALL_PROGRAMS) lib/tclIndex po/*.msg
 220        rm -f GIT-VERSION-FILE GIT-GUI-VARS
 221
 222.PHONY: all install uninstall dist-version clean
 223.PHONY: .FORCE-GIT-VERSION-FILE
 224.PHONY: .FORCE-GIT-GUI-VARS