Adds a profile-opt target for easy compilation of a python binary using
gcc's profile guided optimization.
diff --git a/Makefile.pre.in b/Makefile.pre.in
index bb70301..02cc59c 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -176,6 +176,10 @@
 PYTHON=		python$(EXE)
 BUILDPYTHON=	python$(BUILDEXE)
 
+# The task to run while instrument when building the profile-opt target
+PROFILE_TASK=	Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+#PROFILE_TASK=	Lib/test/regrtest.py
+
 # === Definitions added by makesetup ===
 
 
@@ -349,6 +353,27 @@
 all:		build_all
 build_all:	$(BUILDPYTHON) oldsharedmods sharedmods
 
+# Compile a binary with gcc profile guided optimization.
+profile-opt:
+	@echo "Building with support for profile generation:"
+	$(MAKE) clean
+	$(MAKE) build_all_generate_profile
+	@echo "Running benchmark to generate profile data:"
+	$(MAKE) profile-removal
+	$(MAKE) run_profile_task
+	@echo "Rebuilding with profile guided optimizations:"
+	$(MAKE) clean
+	$(MAKE) build_all_use_profile
+
+build_all_generate_profile:
+	$(MAKE) all CFLAGS="$(CFLAGS) -fprofile-generate" LIBS="$(LIBS) -lgcov"
+
+run_profile_task:
+	./$(BUILDPYTHON) $(PROFILE_TASK)
+
+build_all_use_profile:
+	$(MAKE) all CFLAGS="$(CFLAGS) -fprofile-use"
+
 # Build the interpreter
 $(BUILDPYTHON):	Modules/python.o $(LIBRARY) $(LDLIBRARY)
 		$(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
@@ -1099,7 +1124,10 @@
 	find $(srcdir)/build -name 'fficonfig.h' -exec rm -f {} ';' || true
 	find $(srcdir)/build -name 'fficonfig.py' -exec rm -f {} ';' || true
 
-clobber: clean
+profile-removal:
+	find . -name '*.gc??' -exec rm -f {} ';'
+
+clobber: clean profile-removal
 	-rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \
 		tags TAGS \
 		config.cache config.log pyconfig.h Modules/config.c