git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] NO_PERL support

From
Robin H. Johnson <robbat2@gentoo.org>
Date
Apr 3, 2009, 07:03 UTC
Message-ID
<20090403T065545Z@curie.orbis-terrarum.net>

The attached patch adds NO_PERL to the build system, in the same fashion as NO_TCLTK.

Effects:
- No perl-based scripts or code are installed:
	$SCRIPT_PERL
	git-instaweb
	gitweb
	git-cvsserver
	git-svn
- git-add does NOT have interactive support.
- None of the tests for the disabled stuff gets run.

This patch has been a optional part of the Gentoo build of Git for a full year now, originally introduced with v1.5.4.4.

-- 
Robin Hugh Johnson
Gentoo Linux Developer & Infra Guy
E-Mail     : robbat2@gentoo.org
GnuPG FP   : 11AC BA4F 4778 E3F6 E4ED  F38E B27B 944E 3488 4E85


Implement 95% of the NO_PERL functionality, to build Git without any Perl
support, because some Gentoo users want a Git without any Perl whatesoever
(Gentoo bug #214168).

Remaining bits are doing configure.ac as well as git-remote usage in:
t5502-quickfetch.sh
t5512-ls-remote.sh
t5520-pull.sh

Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
Updated-by: Bernd Lommerzheim <bernd@lommerzheim.com>
Bugzilla-URL: http://bugs.gentoo.org/show_bug.cgi?id=214168
Notes: Ported from 20080423-git-1.5.5.1-noperl.patch
Notes: Ported from 20080322-git-1.5.4.5-noperl.patch
Notes: Ported from 20080528-git-1.5.6.1-noperl.patch
Notes: Ported from 20080626-git-1.5.6.1-noperl.patch and 20081123-git-1.6.0.4-noperl-cvsserver.patch
Notes: Ported from 20090126-git-1.6.1.1-noperl.patch
Notes: t3701-add-interactive.sh block added 2009/04/02 as it was missed, broke
       testsuite with USE=-perl.

diff --git a/Makefile b/Makefile
index 0675c43..0adb2b5 100644
--- a/Makefile
+++ b/Makefile
@@ -139,6 +139,8 @@ all::
 # Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
 # MakeMaker (e.g. using ActiveState under Cygwin).
 #
+# Define NO_PERL if you do not want Perl scripts at all.
+#
 # Define NO_TCLTK if you do not want Tcl/Tk GUI.
 #
 # The TCL_PATH variable governs the location of the Tcl interpreter
@@ -277,6 +279,8 @@ SCRIPT_SH += git-stash.sh
 SCRIPT_SH += git-submodule.sh
 SCRIPT_SH += git-web--browse.sh
 
+SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
+ifndef NO_PERL
 SCRIPT_PERL += git-add--interactive.perl
 SCRIPT_PERL += git-archimport.perl
 SCRIPT_PERL += git-cvsexportcommit.perl
@@ -285,10 +289,11 @@ SCRIPT_PERL += git-cvsserver.perl
 SCRIPT_PERL += git-relink.perl
 SCRIPT_PERL += git-send-email.perl
 SCRIPT_PERL += git-svn.perl
-
-SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
-	  $(patsubst %.perl,%,$(SCRIPT_PERL)) \
-	  git-instaweb
+SCRIPTS += $(patsubst %.perl,%,$(SCRIPT_PERL)) \
+			git-instaweb
+else
+SCRIPT_PERL =
+endif
 
 # Empty...
 EXTRA_PROGRAMS =
@@ -335,7 +340,10 @@ BUILT_INS += git-whatchanged$X
 ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
 
 # what 'all' will build but not install in gitexecdir
-OTHER_PROGRAMS = git$X gitweb/gitweb.cgi
+OTHER_PROGRAMS = git$X
+ifndef NO_PERL
+OTHER_PROGRAMS += gitweb/gitweb.cgi
+endif
 
 # Set paths to tools early so that they can be used for version tests.
 ifndef SHELL_PATH
@@ -868,6 +876,10 @@ else
 	endif
 endif
 
+ifdef NO_PERL
+	BASIC_CFLAGS += -DNO_PERL
+endif
+
 ifdef ZLIB_PATH
 	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
 	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
@@ -1067,6 +1079,11 @@ endif
 ifeq ($(TCLTK_PATH),)
 NO_TCLTK=NoThanks
 endif
+ifeq ($(PERL_PATH),)
+NO_PERL=NoThanks
+export NO_PERL
+export NO_PERL_MAKEMAKER
+endif
 
 QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
 QUIET_SUBDIR1  =
@@ -1142,7 +1159,9 @@ ifndef NO_TCLTK
 	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
 	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
 endif
+ifndef NO_PERL
 	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
+endif
 	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1)
 
 please_set_SHELL_PATH_to_a_more_modern_shell:
@@ -1189,6 +1208,7 @@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
 	chmod +x $@+ && \
 	mv $@+ $@
 
+ifndef NO_PERL
 $(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak
 
 perl/perl.mak: GIT-CFLAGS perl/Makefile perl/Makefile.PL
@@ -1248,6 +1268,7 @@ git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
 	    $@.sh > $@+ && \
 	chmod +x $@+ && \
 	mv $@+ $@
+endif # NO_PERL
 
 configure: configure.ac
 	$(QUIET_GEN)$(RM) $@ $<+ && \
@@ -1455,9 +1476,12 @@ install: all
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
 	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
-	$(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X git-shell$X git-cvsserver '$(DESTDIR_SQ)$(bindir_SQ)'
+	$(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X git-shell$X '$(DESTDIR_SQ)$(bindir_SQ)'
 	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
+ifndef NO_PERL
 	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
+	$(INSTALL) git-cvsserver '$(DESTDIR_SQ)$(bindir_SQ)'
+endif
 ifndef NO_TCLTK
 	$(MAKE) -C gitk-git install
 	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
@@ -1565,9 +1589,11 @@ clean:
 	$(RM) -r $(GIT_TARNAME) .doc-tmp-dir
 	$(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
 	$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
-	$(RM) gitweb/gitweb.cgi
 	$(MAKE) -C Documentation/ clean
+ifndef NO_PERL
+	$(RM) gitweb/gitweb.cgi
 	$(MAKE) -C perl clean
+endif
 	$(MAKE) -C templates/ clean
 	$(MAKE) -C t/ clean
 ifndef NO_TCLTK
diff --git a/builtin-add.c b/builtin-add.c
index 08443f2..01e18a1 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -15,7 +15,9 @@ static const char * const builtin_add_usage[] = {
 	"git add [options] [--] <filepattern>...",
 	NULL
 };
+#ifndef NO_PERL
 static int patch_interactive, add_interactive;
+#endif
 static int take_worktree_changes;
 
 static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
@@ -158,6 +160,7 @@ static const char **validate_pathspec(int argc, const char **argv, const char *p
 	return pathspec;
 }
 
+#ifndef NO_PERL
 int interactive_add(int argc, const char **argv, const char *prefix)
 {
 	int status, ac;
@@ -186,6 +189,7 @@ int interactive_add(int argc, const char **argv, const char *prefix)
 	free(args);
 	return status;
 }
+#endif
 
 static struct lock_file lock_file;
 
@@ -199,8 +203,10 @@ static struct option builtin_add_options[] = {
 	OPT__DRY_RUN(&show_only),
 	OPT__VERBOSE(&verbose),
 	OPT_GROUP(""),
+#ifndef NO_PERL
 	OPT_BOOLEAN('i', "interactive", &add_interactive, "interactive picking"),
 	OPT_BOOLEAN('p', "patch", &patch_interactive, "interactive patching"),
+#endif
 	OPT_BOOLEAN('f', "force", &ignored_too, "allow adding otherwise ignored files"),
 	OPT_BOOLEAN('u', "update", &take_worktree_changes, "update tracked files"),
 	OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, "record only the fact that the path will be added later"),
@@ -252,10 +258,12 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
 	argc = parse_options(argc, argv, builtin_add_options,
 			  builtin_add_usage, 0);
+#ifndef NO_PERL
 	if (patch_interactive)
 		add_interactive = 1;
 	if (add_interactive)
 		exit(interactive_add(argc, argv, prefix));
+#endif
 
 	git_config(add_config, NULL);
 
diff --git a/builtin-commit.c b/builtin-commit.c
index 46e649c..944f3ac 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -100,7 +100,9 @@ static struct option builtin_commit_options[] = {
 	OPT_GROUP("Commit contents options"),
 	OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
 	OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
+#ifndef NO_PERL
 	OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
+#endif
 	OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
 	OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
 	OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
@@ -223,6 +225,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
 	struct string_list partial;
 	const char **pathspec = NULL;
 
+#ifndef NO_PERL
 	if (interactive) {
 		interactive_add(argc, argv, prefix);
 		if (read_cache_preload(NULL) < 0)
@@ -230,6 +233,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
 		commit_style = COMMIT_AS_IS;
 		return get_index_file();
 	}
+#endif
 
 	if (*argv)
 		pathspec = get_pathspec(prefix, argv);
diff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh
index 67c431d..83a5535 100644
--- a/t/lib-git-svn.sh
+++ b/t/lib-git-svn.sh
@@ -9,6 +9,12 @@ then
 	test_done
 	exit
 fi
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping git-svn tests, NO_PERL defined' :
+	test_done
+	exit
+fi
 
 GIT_DIR=$PWD/.git
 GIT_SVN_DIR=$GIT_DIR/svn/git-svn
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index eb63718..e3bcf20 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -3,6 +3,12 @@
 test_description='git remote porcelain-ish'
 
 . ./test-lib.sh
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping git-cvsimport tests, NO_PERL defined' :
+	test_done
+	exit
+fi
 
 setup_repository () {
 	mkdir "$1" && (
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index b4e2b4d..2e74ce5 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -38,7 +38,7 @@ test_expect_success \
 	"echo King of the bongo >file &&
 	test_must_fail git commit -m foo -a file"
 
-test_expect_success \
+[ -z "$NO_PERL" ] && test_expect_success \
 	"using paths with --interactive" \
 	"echo bong-o-bong >file &&
 	! (echo 7 | git commit -m foo --interactive file)"
@@ -119,7 +119,7 @@ test_expect_success \
 	"echo 'gak' >file && \
 	 git commit -m 'author' --author 'Rubber Duck <rduck@convoy.org>' -a"
 
-test_expect_success \
+[ -z "$NO_PERL" ] && test_expect_success \
 	"interactive add" \
 	"echo 7 | git commit --interactive | grep 'What now'"
 
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index cb3d183..1d5355d 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -2,6 +2,12 @@
 
 test_description='git send-email'
 . ./test-lib.sh
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping git-send-email tests, NO_PERL defined' :
+	test_done
+	exit
+fi
 
 PROG='git send-email'
 test_expect_success \
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 245a7c3..6cd779a 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -13,6 +13,12 @@ then
     test_done
     exit
 fi
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping git-cvsexportcommit tests, NO_PERL defined' :
+	test_done
+	exit
+fi
 
 CVSROOT=$(pwd)/cvsroot
 CVSWORK=$(pwd)/cvswork
diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh
index 6a37f71..84a0d31 100755
--- a/t/t9400-git-cvsserver-server.sh
+++ b/t/t9400-git-cvsserver-server.sh
@@ -17,6 +17,12 @@ then
     test_done
     exit
 fi
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping git-cvsserver tests, NO_PERL defined' :
+	test_done
+	exit
+fi
 perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
     test_expect_success 'skipping git-cvsserver tests, Perl SQLite interface unavailable' :
     test_done
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh
index 6ed10d0..d4580a4 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/t/t9500-gitweb-standalone-no-errors.sh
@@ -72,6 +72,13 @@ safe_chmod () {
 }
 
 . ./test-lib.sh
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping gitweb-standalone-no-errors tests, NO_PERL defined' :
+	test_done
+	exit
+fi
+
 
 perl -MEncode -e 'decode_utf8("", Encode::FB_CROAK)' >/dev/null 2>&1 || {
     test_expect_success 'skipping gitweb tests, perl version is too old' :
diff --git a/t/t9600-cvsimport.sh b/t/t9600-cvsimport.sh
index d2379e7..75bf178 100755
--- a/t/t9600-cvsimport.sh
+++ b/t/t9600-cvsimport.sh
@@ -16,6 +16,12 @@ then
 	test_done
 	exit
 fi
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping git-cvsimport tests, NO_PERL defined' :
+	test_done
+	exit
+fi
 
 cvsps_version=`cvsps -h 2>&1 | sed -ne 's/cvsps version //p'`
 case "$cvsps_version" in
diff a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
--- a/t/t3701-add-interactive.sh	2009-04-02 14:26:45.000000000 -0700
+++ b/t/t3701-add-interactive.sh	2009-04-02 23:06:20.543358154 -0700
@@ -3,6 +3,13 @@
 test_description='add -i basic tests'
 . ./test-lib.sh
 
+if test -n "$NO_PERL"
+then
+	test_expect_success 'skipping add-interactive tests, NO_PERL defined' :
+	test_done
+	exit
+fi
+
 test_expect_success 'setup (initial)' '
 	echo content >file &&
 	git add file &&
Next: Jeff King
Message 1 of 30 in “NO_PERL support”
  1. NO_PERL supportRobin H. Johnson, Apr 3, 2009
  2. Jeff KingApr 3, 2009
  3. Johannes SchindelinApr 3, 2009
  4. Jeff KingApr 3, 2009
  5. Johannes SchindelinApr 3, 2009
  6. Miklos VajnaApr 3, 2009
  7. Jeff KingApr 3, 2009
  8. Johannes SixtApr 3, 2009
  9. Jeff KingApr 3, 2009
  10. Jeff KingApr 3, 2009
  11. Robin H. JohnsonApr 3, 2009
  12. Jeff KingApr 3, 2009
  13. Junio C HamanoApr 3, 2009
  14. Jeff KingApr 3, 2009
  15. Junio C HamanoApr 3, 2009
  16. Jeff KingApr 3, 2009
  17. 0/4 NO_PERL supportJeff King, Apr 3, 2009
  18. 1/4 commit: abort commit if interactive add failedJeff King, Apr 3, 2009
  19. 2/4 tests: remove exit after test_done callJeff King, Apr 3, 2009
  20. 3/4 Makefile: allow building without perlJeff King, Apr 3, 2009
  21. Robin H. JohnsonApr 4, 2009
  22. Jeff KingApr 4, 2009
  23. Robin H. JohnsonApr 4, 2009
  24. Jeff KingApr 4, 2009
  25. Robin H. JohnsonApr 5, 2009
  26. Jeff KingApr 7, 2009
  27. 4/4 tests: skip perl tests if NO_PERL is definedJeff King, Apr 3, 2009
  28. Robin H. JohnsonApr 4, 2009
  29. Jeff KingApr 4, 2009
  30. Jeff KingApr 7, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.