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 valid for this to work. 8# 9 10GIT-VERSION-FILE: FORCE 11 @$(SHELL_PATH) ./GIT-VERSION-GEN 12ifneq ($(MAKECMDGOALS),clean) 13-include GIT-VERSION-FILE 14endif 15 16uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') 17uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') 18uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not') 19 20SCRIPT_SH = git-gui.sh 21GITGUI_MAIN := git-gui 22GITGUI_BUILT_INS = git-citool 23ALL_LIBFILES = $(wildcard lib/*.tcl) 24PRELOAD_FILES = lib/class.tcl 25NONTCL_LIBFILES = \ 26 lib/git-gui.ico \ 27 $(wildcard lib/win32_*.js) \ 28#end NONTCL_LIBFILES 29 30ifndef SHELL_PATH 31 SHELL_PATH = /bin/sh 32endif 33 34ifndef gitexecdir 35 gitexecdir := $(shell git --exec-path) 36endif 37 38ifndef sharedir 39ifeq (git-core,$(notdir $(gitexecdir))) 40 sharedir := $(dir $(patsubst %/,%,$(dir $(gitexecdir))))share 41else 42 sharedir := $(dir $(gitexecdir))share 43endif 44endif 45 46ifndef INSTALL 47 INSTALL = install 48endif 49 50RM_RF ?= rm -rf 51RMDIR ?= rmdir 52 53INSTALL_D0 = $(INSTALL) -d -m 755 # space is required here 54INSTALL_D1 = 55INSTALL_R0 = $(INSTALL) -m 644 # space is required here 56INSTALL_R1 = 57INSTALL_X0 = $(INSTALL) -m 755 # space is required here 58INSTALL_X1 = 59INSTALL_A0 = find # space is required here 60INSTALL_A1 = | cpio -pud 61INSTALL_L0 = rm -f # space is required here 62INSTALL_L1 = && ln # space is required here 63INSTALL_L2 = 64INSTALL_L3 = 65 66REMOVE_D0 = $(RMDIR) # space is required here 67REMOVE_D1 = || true 68REMOVE_F0 = $(RM_RF) # space is required here 69REMOVE_F1 = 70CLEAN_DST = true 71 72ifndef V 73 QUIET = @ 74 QUIET_GEN = $(QUIET)echo ' ' GEN '$@' && 75 QUIET_INDEX = $(QUIET)echo ' ' INDEX $(dir $@) && 76 QUIET_MSGFMT0 = $(QUIET)printf ' MSGFMT %12s ' $@ && v=` 77 QUIET_MSGFMT1 = 2>&1` && echo "$$v" | sed -e 's/fuzzy translations/fuzzy/' | sed -e 's/ messages*//g' 78 QUIET_2DEVNULL = 2>/dev/null 79 80 INSTALL_D0 = dir= 81 INSTALL_D1 = && echo ' ' DEST $$dir && $(INSTALL) -d -m 755 "$$dir" 82 INSTALL_R0 = src= 83 INSTALL_R1 = && echo ' ' INSTALL 644 `basename $$src` && $(INSTALL) -m 644 $$src 84 INSTALL_X0 = src= 85 INSTALL_X1 = && echo ' ' INSTALL 755 `basename $$src` && $(INSTALL) -m 755 $$src 86 INSTALL_A0 = src= 87 INSTALL_A1 = && echo ' ' INSTALL ' ' `basename "$$src"` && find "$$src" | cpio -pud 88 89 INSTALL_L0 = dst= 90 INSTALL_L1 = && src= 91 INSTALL_L2 = && dst= 92 INSTALL_L3 = && echo ' ' 'LINK ' `basename "$$dst"` '->' `basename "$$src"` && rm -f "$$dst" && ln "$$src" "$$dst" 93 94 CLEAN_DST = echo ' ' UNINSTALL 95 REMOVE_D0 = dir= 96 REMOVE_D1 = && echo ' ' REMOVE $$dir && test -d "$$dir" && $(RMDIR) "$$dir" || true 97 REMOVE_F0 = dst= 98 REMOVE_F1 = && echo ' ' REMOVE `basename "$$dst"` && $(RM_RF) "$$dst" 99endif 100 101TCLTK_PATH ?= wish 102ifeq (./,$(dir $(TCLTK_PATH))) 103 TCL_PATH ?= $(subst wish,tclsh,$(TCLTK_PATH)) 104else 105 TCL_PATH ?= $(dir $(TCLTK_PATH))$(notdir $(subst wish,tclsh,$(TCLTK_PATH))) 106endif 107 108ifeq ($(uname_S),Darwin) 109 TKFRAMEWORK = /Library/Frameworks/Tk.framework/Resources/Wish.app 110 ifeq ($(shell echo "$(uname_R)" | awk -F. '{if ($$1 >= 9) print "y"}')_$(shell test -d $(TKFRAMEWORK) || echo n),y_n) 111 TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish.app 112 ifeq ($(shell test -d $(TKFRAMEWORK) || echo n),n) 113 TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish\ Shell.app 114 endif 115 endif 116 TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app) 117endif 118 119ifeq ($(findstring $(MAKEFLAGS),s),s) 120QUIET_GEN = 121endif 122 123-include config.mak 124 125DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) 126gitexecdir_SQ = $(subst ','\'',$(gitexecdir)) 127SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) 128TCL_PATH_SQ = $(subst ','\'',$(TCL_PATH)) 129TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) 130TCLTK_PATH_SED = $(subst ','\'',$(subst \,\\,$(TCLTK_PATH))) 131 132gg_libdir ?= $(sharedir)/git-gui/lib 133libdir_SQ = $(subst ','\'',$(gg_libdir)) 134libdir_SED = $(subst ','\'',$(subst \,\\,$(gg_libdir_sed_in))) 135exedir = $(dir $(gitexecdir))share/git-gui/lib 136 137GITGUI_SCRIPT := $$0 138GITGUI_RELATIVE := 139GITGUI_MACOSXAPP := 140 141ifeq ($(uname_O),Cygwin) 142 GITGUI_SCRIPT := `cygpath --windows --absolute "$(GITGUI_SCRIPT)"` 143 144 # Is this a Cygwin Tcl/Tk binary? If so it knows how to do 145 # POSIX path translation just like cygpath does and we must 146 # keep libdir in POSIX format so Cygwin packages of git-gui 147 # work no matter where the user installs them. 148 # 149 ifeq ($(shell echo 'puts [file normalize /]' | '$(TCL_PATH_SQ)'),$(shell cygpath --mixed --absolute /)) 150 gg_libdir_sed_in := $(gg_libdir) 151 else 152 gg_libdir_sed_in := $(shell cygpath --windows --absolute "$(gg_libdir)") 153 endif 154else 155 ifeq ($(exedir),$(gg_libdir)) 156 GITGUI_RELATIVE := 1 157 endif 158 gg_libdir_sed_in := $(gg_libdir) 159endif 160ifeq ($(uname_S),Darwin) 161 ifeq ($(shell test -d $(TKFRAMEWORK) && echo y),y) 162 GITGUI_MACOSXAPP := YesPlease 163 endif 164endif 165ifneq (,$(findstring MINGW,$(uname_S))) 166ifeq ($(shell expr "$(uname_R)" : '1\.'),2) 167 NO_MSGFMT=1 168endif 169 GITGUI_WINDOWS_WRAPPER := YesPlease 170 GITGUI_RELATIVE := 1 171endif 172 173ifdef GITGUI_MACOSXAPP 174GITGUI_MAIN := git-gui.tcl 175 176git-gui: GIT-VERSION-FILE GIT-GUI-VARS 177 $(QUIET_GEN)rm -f $@ $@+ && \ 178 echo '#!$(SHELL_PATH_SQ)' >$@+ && \ 179 echo 'if test "z$$*" = zversion ||' >>$@+ && \ 180 echo ' test "z$$*" = z--version' >>$@+ && \ 181 echo then >>$@+ && \ 182 echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \ 183 echo else >>$@+ && \ 184 echo ' libdir="$${GIT_GUI_LIB_DIR:-$(libdir_SQ)}"' >>$@+ && \ 185 echo ' 'exec \"'$$libdir/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\" \ 186 '"$$0" "$$@"' >>$@+ && \ 187 echo fi >>$@+ && \ 188 chmod +x $@+ && \ 189 mv $@+ $@ 190 191Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-VARS \ 192 macosx/Info.plist \ 193 macosx/git-gui.icns \ 194 macosx/AppMain.tcl \ 195 $(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE) 196 $(QUIET_GEN)rm -rf '$@' '$@'+ && \ 197 mkdir -p '$@'+/Contents/MacOS && \ 198 mkdir -p '$@'+/Contents/Resources/Scripts && \ 199 cp '$(subst ','\'',$(subst \,,$(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)))' \ 200 '$@'+/Contents/MacOS && \ 201 cp macosx/git-gui.icns '$@'+/Contents/Resources && \ 202 sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ 203 -e 's/@@GITGUI_TKEXECUTABLE@@/$(TKEXECUTABLE)/g' \ 204 macosx/Info.plist \ 205 >'$@'+/Contents/Info.plist && \ 206 sed -e 's|@@gitexecdir@@|$(gitexecdir_SQ)|' \ 207 -e 's|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ 208 macosx/AppMain.tcl \ 209 >'$@'+/Contents/Resources/Scripts/AppMain.tcl && \ 210 mv '$@'+ '$@' 211endif 212 213ifdef GITGUI_WINDOWS_WRAPPER 214GITGUI_MAIN := git-gui.tcl 215 216git-gui: windows/git-gui.sh 217 cp $< $@ 218endif 219 220$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS 221 $(QUIET_GEN)rm -f $@ $@+ && \ 222 sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ 223 -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \ 224 -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \ 225 -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \ 226 -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ 227 -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ 228 -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ 229 git-gui.sh >$@+ && \ 230 chmod +x $@+ && \ 231 mv $@+ $@ 232 233XGETTEXT ?= xgettext 234ifdef NO_MSGFMT 235 MSGFMT ?= $(TCL_PATH) po/po2msg.sh 236else 237 MSGFMT ?= msgfmt 238 ifneq ($(shell $(MSGFMT) --tcl -l C -d . /dev/null 2>/dev/null; echo $$?),0) 239 MSGFMT := $(TCL_PATH) po/po2msg.sh 240 endif 241endif 242 243msgsdir = $(gg_libdir)/msgs 244msgsdir_SQ = $(subst ','\'',$(msgsdir)) 245PO_TEMPLATE = po/git-gui.pot 246ALL_POFILES = $(wildcard po/*.po) 247ALL_MSGFILES = $(subst .po,.msg,$(ALL_POFILES)) 248 249$(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES) 250 $(XGETTEXT) -kmc -LTcl -o $@ $(SCRIPT_SH) $(ALL_LIBFILES) 251update-po:: $(PO_TEMPLATE) 252 $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) 253$(ALL_MSGFILES): %.msg : %.po 254 $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) 255 256lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS 257 $(QUIET_INDEX)if echo \ 258 $(foreach p,$(PRELOAD_FILES),source $p\;) \ 259 auto_mkindex lib $(patsubst lib/%,%,$(sort $(ALL_LIBFILES))) \ 260 | $(TCL_PATH) $(QUIET_2DEVNULL); then : ok; \ 261 else \ 262 echo >&2 " * $(TCL_PATH) failed; using unoptimized loading"; \ 263 rm -f $@ ; \ 264 echo '# Autogenerated by git-gui Makefile' >$@ && \ 265 echo >>$@ && \ 266 $(foreach p,$(PRELOAD_FILES) $(sort $(ALL_LIBFILES)),echo '$(subst lib/,,$p)' >>$@ &&) \ 267 echo >>$@ ; \ 268 fi 269 270TRACK_VARS = \ 271 $(subst ','\'',SHELL_PATH='$(SHELL_PATH_SQ)') \ 272 $(subst ','\'',TCL_PATH='$(TCL_PATH_SQ)') \ 273 $(subst ','\'',TCLTK_PATH='$(TCLTK_PATH_SQ)') \ 274 $(subst ','\'',gitexecdir='$(gitexecdir_SQ)') \ 275 $(subst ','\'',gg_libdir='$(libdir_SQ)') \ 276 GITGUI_MACOSXAPP=$(GITGUI_MACOSXAPP) \ 277#end TRACK_VARS 278 279GIT-GUI-VARS: FORCE 280 @VARS='$(TRACK_VARS)'; \ 281 if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \ 282 echo >&2 " * new locations or Tcl/Tk interpreter"; \ 283 echo >$@ "$$VARS"; \ 284 fi 285 286ifdef GITGUI_MACOSXAPP 287all:: git-gui Git\ Gui.app 288endif 289ifdef GITGUI_WINDOWS_WRAPPER 290all:: git-gui 291endif 292all:: $(GITGUI_MAIN) lib/tclIndex $(ALL_MSGFILES) 293 294install: all 295 $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1) 296 $(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)' 297 $(QUIET)$(INSTALL_X0)git-gui--askpass $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)' 298 $(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 299ifdef GITGUI_WINDOWS_WRAPPER 300 $(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)' 301endif 302 $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(INSTALL_D1) 303 $(QUIET)$(INSTALL_R0)lib/tclIndex $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' 304ifdef GITGUI_MACOSXAPP 305 $(QUIET)$(INSTALL_A0)'Git Gui.app' $(INSTALL_A1) '$(DESTDIR_SQ)$(libdir_SQ)' 306 $(QUIET)$(INSTALL_X0)git-gui.tcl $(INSTALL_X1) '$(DESTDIR_SQ)$(libdir_SQ)' 307endif 308 $(QUIET)$(foreach p,$(ALL_LIBFILES) $(NONTCL_LIBFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' &&) true 309 $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(INSTALL_D1) 310 $(QUIET)$(foreach p,$(ALL_MSGFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true 311 312uninstall: 313 $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)' 314 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1) 315 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askpass $(REMOVE_F1) 316 $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true 317ifdef GITGUI_WINDOWS_WRAPPER 318 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1) 319endif 320 $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(libdir_SQ)' 321 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/tclIndex $(REMOVE_F1) 322ifdef GITGUI_MACOSXAPP 323 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)/Git Gui.app' $(REMOVE_F1) 324 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.tcl $(REMOVE_F1) 325endif 326 $(QUIET)$(foreach p,$(ALL_LIBFILES) $(NONTCL_LIBFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true 327 $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(msgsdir_SQ)' 328 $(QUIET)$(foreach p,$(ALL_MSGFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(msgsdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true 329 $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(REMOVE_D1) 330 $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(REMOVE_D1) 331 $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(REMOVE_D1) 332 $(QUIET)$(REMOVE_D0)`dirname '$(DESTDIR_SQ)$(libdir_SQ)'` $(REMOVE_D1) 333 334dist-version: 335 @mkdir -p $(TARDIR) 336 @echo $(GITGUI_VERSION) > $(TARDIR)/version 337 338clean:: 339 $(RM_RF) $(GITGUI_MAIN) lib/tclIndex po/*.msg 340 $(RM_RF) GIT-VERSION-FILE GIT-GUI-VARS 341ifdef GITGUI_MACOSXAPP 342 $(RM_RF) 'Git Gui.app'* git-gui 343endif 344ifdef GITGUI_WINDOWS_WRAPPER 345 $(RM_RF) git-gui 346endif 347 348.PHONY: all install uninstall dist-version clean 349.PHONY: FORCE 350