[PATCH 3/3] Allow make targets to be run outside of $srcdir

David Shea dshea at redhat.com
Thu Sep 12 19:22:31 UTC 2013


---
 Makefile.am         | 98 +++++++++++++++++++++++++++--------------------------
 configure.ac        |  2 +-
 scripts/makeupdates | 52 ++++++++++++++++++----------
 3 files changed, 85 insertions(+), 67 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 756131b..363bdd0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -47,14 +47,14 @@ tag:
 	@echo "Tagged as $(ARCHIVE_TAG)"
 
 po-pull:
-	rm -f po/en at boldquot.gmo po/en at boldquot.po
-	rm -f po/en at quot.gmo po/en at quot.po
+	rm -f $(srcdir)/po/en at boldquot.gmo $(srcdir)/po/en at boldquot.po
+	rm -f $(srcdir)/po/en at quot.gmo $(srcdir)/po/en at quot.po
 	rpm -q transifex-client &>/dev/null || ( echo "need to run: yum install transifex-client"; exit 1 )
 	tx pull $(TX_PULL_ARGS)
 
 scratch: po-pull
 	$(MAKE) ARCHIVE_TAG=HEAD dist
-	git checkout -- po/$(PACKAGE_NAME).pot
+	git checkout -- $(srcdir)/po/$(PACKAGE_NAME).pot
 
 scratch-bumpver: po-pull
 	@opts="-n $(PACKAGE_NAME) -v $(PACKAGE_VERSION) -r $(PACKAGE_RELEASE) -b $(PACKAGE_BUGREPORT)" ; \
@@ -67,11 +67,11 @@ scratch-bumpver: po-pull
 	if [ ! -z "$(BZDEBUG)" ]; then \
 		opts="$${opts} -d" ; \
 	fi ; \
-	scripts/makebumpver $${opts} || exit 1 ; \
+	( cd $(srcdir) && scripts/makebumpver $${opts} ) || exit 1 ; \
 	$(MAKE) -C po $(PACKAGE_NAME).pot-update ; 
 
 release:
-	$(MAKE) dist && $(MAKE) tag && git checkout -- po/$(PACKAGE_NAME).pot
+	$(MAKE) dist && $(MAKE) tag && git checkout -- $(srcdir)/po/$(PACKAGE_NAME).pot
 
 api:
 	doxygen docs/api.cfg
@@ -87,12 +87,14 @@ bumpver: po-pull
 	if [ ! -z "$(BZDEBUG)" ]; then \
 		opts="$${opts} -d" ; \
 	fi ; \
-	scripts/makebumpver $${opts} || exit 1 ; \
-	$(MAKE) -C po $(PACKAGE_NAME).pot-update ; \
+	( cd $(srcdir) && scripts/makebumpver $${opts} ) || exit 1 ; \
+	$(MAKE) -C po $(PACKAGE_NAME).pot-update && \
 	tx push $(TX_PUSH_ARGS)
 
 install-buildrequires:
-	yum install $$(grep BuildRequires: anaconda.spec.in | cut -d ' ' -f 2)
+	srcdir="$(srcdir)" && \
+	: $${srcdir:=.} && \
+	yum install $$(grep BuildRequires: $${srcdir}/anaconda.spec.in | cut -d ' ' -f 2)
 
 # Generate an updates.img based on the changed files since the release
 # was tagged.  Updates are copied to ./updates-img and then the image is
@@ -105,59 +107,59 @@ updates:
 	if [ "$${keep}" = "Y" ]; then \
 		opts="$${opts} -k" ; \
 	fi ; \
-	scripts/makeupdates $${opts}
+	( cd $(srcdir) && scripts/makeupdates $${opts} -b '$(abs_builddir)' )
 
 # UNIT TESTING TARGETS
 unittests-logpicker:
-	PYTHONPATH=pyanaconda/isys/.libs:tests/:.:utils/ nosetests -v old_tests/logpicker_test
+	PYTHONPATH=$(builddir)/pyanaconda/isys/.libs:tests/:$(srcdir):utils/ nosetests -v old_tests/logpicker_test
 
 # GUI TESTING
 runspoke:
-	ANACONDA_DATA=${PWD}/data \
-	ANACONDA_WIDGETS_OVERRIDES=${PWD}/widgets/python \
-	ANACONDA_WIDGETS_DATA=${PWD}/widgets/data \
-	ANACONDA_INSTALL_CLASSES=${PWD}/pyanaconda/installclasses \
-	PYTHONPATH=.:pyanaconda/isys/.libs:widgets/python/:widgets/src/.libs/ \
-	LD_LIBRARY_PATH=widgets/src/.libs \
-	UIPATH=pyanaconda/ui/gui/ \
-	GI_TYPELIB_PATH=widgets/src/ \
-	pyanaconda/ui/gui/tools/run-spoke.py ${SPOKE_MODULE} ${SPOKE_CLASS}
+	ANACONDA_DATA=$(srcdir)/data \
+	ANACONDA_WIDGETS_OVERRIDES=$(srcdir)/widgets/python \
+	ANACONDA_WIDGETS_DATA=$(srcdir)/widgets/data \
+	ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
+	PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
+	LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
+	UIPATH=$(srcdir)/pyanaconda/ui/gui/ \
+	GI_TYPELIB_PATH=$(builddir)/widgets/src/ \
+	$(srcdir)/pyanaconda/ui/gui/tools/run-spoke.py ${SPOKE_MODULE} ${SPOKE_CLASS}
 
 runhub:
-	ANACONDA_DATA=${PWD}/data \
-	ANACONDA_WIDGETS_OVERRIDES=${PWD}/widgets/python \
-	ANACONDA_WIDGETS_DATA=${PWD}/widgets/data \
-	ANACONDA_INSTALL_CLASSES=${PWD}/pyanaconda/installclasses \
-	PYTHONPATH=.:pyanaconda/isys/.libs:widgets/python/:widgets/src/.libs/ \
-	LD_LIBRARY_PATH=widgets/src/.libs \
-	UIPATH=pyanaconda/ui/gui/ \
-	GI_TYPELIB_PATH=widgets/src/ \
-	pyanaconda/ui/gui/tools/run-hub.py ${HUB_MODULE} ${HUB_CLASS}
+	ANACONDA_DATA=$(srcdir)/data \
+	ANACONDA_WIDGETS_OVERRIDES=$(srcdir)/widgets/python \
+	ANACONDA_WIDGETS_DATA=$(srcdir)/widgets/data \
+	ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
+	PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
+	LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
+	UIPATH=$(srcdir)/pyanaconda/ui/gui/ \
+	GI_TYPELIB_PATH=$(builddir)/widgets/src/ \
+	$(srcdir)/pyanaconda/ui/gui/tools/run-hub.py ${HUB_MODULE} ${HUB_CLASS}
 
 runtextspoke:
-	ANACONDA_DATA=${PWD}/data \
-	ANACONDA_INSTALL_CLASSES=${PWD}/pyanaconda/installclasses \
-	PYTHONPATH=.:pyanaconda/isys/.libs:widgets/python/:widgets/src/.libs/ \
-	LD_LIBRARY_PATH=widgets/src/.libs \
-	pyanaconda/ui/tui/tools/run-text-spoke.py ${SPOKE_MODULE} ${SPOKE_CLASS}
+	ANACONDA_DATA=$(srcdir)/data \
+	ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
+	PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
+	LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
+	$(srcdir)/pyanaconda/ui/tui/tools/run-text-spoke.py ${SPOKE_MODULE} ${SPOKE_CLASS}
 
 runtexthub:
-	ANACONDA_DATA=${PWD}/data \
-	ANACONDA_INSTALL_CLASSES=${PWD}/pyanaconda/installclasses \
-	PYTHONPATH=.:pyanaconda/isys/.libs:widgets/python/:widgets/src/.libs/ \
-	LD_LIBRARY_PATH=widgets/src/.libs \
-	pyanaconda/ui/tui/tools/run-text-hub.py ${HUB_MODULE} ${HUB_CLASS}
+	ANACONDA_DATA=$(srcdir)/data \
+	ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
+	PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
+	LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
+	$(srcdir)/pyanaconda/ui/tui/tools/run-text-hub.py ${HUB_MODULE} ${HUB_CLASS}
 
 
 runglade:
-	ANACONDA_DATA=${PWD}/data \
-	ANACONDA_WIDGETS_OVERRIDES=${PWD}/widgets/python \
-	ANACONDA_WIDGETS_DATA=${PWD}/widgets/data \
-	ANACONDA_INSTALL_CLASSES=${PWD}/pyanaconda/installclasses \
-	PYTHONPATH=.:pyanaconda/isys/.libs:widgets/python/:widgets/src/.libs/ \
-	LD_LIBRARY_PATH=widgets/src/.libs \
-	UIPATH=pyanaconda/ui/gui/ \
-	GI_TYPELIB_PATH=widgets/src/ \
-	GLADE_CATALOG_SEARCH_PATH=${PWD}/widgets/glade \
-	GLADE_MODULE_SEARCH_PATH=${PWD}/widgets/src/.libs \
+	ANACONDA_DATA=$(srcdir)/data \
+	ANACONDA_WIDGETS_OVERRIDES=$(srcdir)/widgets/python \
+	ANACONDA_WIDGETS_DATA=$(srcdir)/widgets/data \
+	ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
+	PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
+	LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
+	UIPATH=$(srcdir)/pyanaconda/ui/gui/ \
+	GI_TYPELIB_PATH=$(builddir)/widgets/src/ \
+	GLADE_CATALOG_SEARCH_PATH=$(srcdir)/widgets/glade \
+	GLADE_MODULE_SEARCH_PATH=$(builddir)/widgets/src/.libs \
 	glade ${GLADE_FILE}
diff --git a/configure.ac b/configure.ac
index 624adad..2be4698 100644
--- a/configure.ac
+++ b/configure.ac
@@ -208,7 +208,7 @@ CFLAGS="`cflags_filter $CFLAGS`"
 LIBS=
 
 # Get the release number from the spec file
-rel="`awk '/Release:/ { split($2, r, "%"); print r[[1]] }' anaconda.spec.in`"
+rel="`awk '/Release:/ { split($2, r, "%"); print r[[1]] }' $srcdir/anaconda.spec.in`"
 AC_SUBST(PACKAGE_RELEASE, [$rel])
 
 # Perform arch related tests
diff --git a/scripts/makeupdates b/scripts/makeupdates
index 273428a..f34b4c7 100755
--- a/scripts/makeupdates
+++ b/scripts/makeupdates
@@ -312,15 +312,22 @@ def isysChanged(tag):
 def widgetsChanged(tag):
     return _compilableChanged(tag, 'widgets')
 
-def copyUpdatedIsys(updates, cwd):
-    os.chdir(cwd)
-
-    if not os.path.isfile('Makefile'):
+def checkAutotools(srcdir, builddir):
+    # Assumes that cwd is srcdir
+    if not os.path.isfile(os.path.join(builddir, 'Makefile')):
         if not os.path.isfile('configure'):
             os.system('./autogen.sh')
-        os.system('./configure --prefix=`rpm --eval %_prefix`')
+        os.chdir(builddir)
+        os.system(os.path.join(srcdir, 'configure') + ' --prefix=`rpm --eval %_prefix` --enable-gtk-doc --enable-introspection')
+        os.chdir(srcdir)
+
+def copyUpdatedIsys(updates, srcdir, builddir):
+    os.chdir(srcdir)
+    print("copyUpdatedIsys BUILDDIR %s" % builddir)
+
+    checkAutotools(srcdir, builddir)
 
-    os.system('make -j %d' % multiprocessing.cpu_count())
+    os.system('make -C %s -j %d' % (builddir, multiprocessing.cpu_count()))
 
     # Updates get overlaid onto the runtime filesystem. Anaconda expects them
     # to be in /run/install/updates, so put them in
@@ -332,13 +339,13 @@ def copyUpdatedIsys(updates, cwd):
     if not os.path.isdir(tmpupdates):
         os.makedirs(tmpupdates)
 
-    isysmodule = os.path.realpath(cwd + '/pyanaconda/isys/.libs/_isys.so')
+    isysmodule = os.path.realpath(os.path.join(builddir,'pyanaconda/isys/.libs/_isys.so'))
 
     if os.path.isfile(isysmodule):
         shutil.copy2(isysmodule, tmpupdates)
 
-def copyUpdatedWidgets(updates, cwd):
-    os.chdir(cwd)
+def copyUpdatedWidgets(updates, srcdir, builddir):
+    os.chdir(srcdir)
 
     if os.path.isdir("/lib64"):
         libdir = "/lib64/"
@@ -351,22 +358,19 @@ def copyUpdatedWidgets(updates, cwd):
     if not os.path.isdir(updates + libdir + "girepository-1.0"):
         os.makedirs(updates + libdir + "girepository-1.0")
 
-    if not os.path.isfile('Makefile'):
-        if not os.path.isfile('configure'):
-            os.system('./autogen.sh')
-        os.system('./configure --prefix=`rpm --eval %_prefix` --enable-gtk-doc --enable-introspection')
+    checkAutotools(srcdir, builddir)
 
-    os.system('make')
+    os.system('make -C %s' % builddir)
 
     files = ["libAnacondaWidgets.so", "libAnacondaWidgets.so.1", "libAnacondaWidgets.so.1.0.0"]
     for f in files:
-        path = os.path.normpath(cwd + "/widgets/src/.libs/" + f)
+        path = os.path.normpath(builddir + "/widgets/src/.libs/" + f)
         if os.path.islink(path) and not os.path.exists(updates + libdir + os.path.basename(path)):
             os.symlink(os.readlink(path), updates + libdir + os.path.basename(path))
         elif os.path.isfile(path):
             shutil.copy2(path, updates + libdir)
 
-    typelib = os.path.realpath(cwd + "/widgets/src/AnacondaWidgets-1.0.typelib")
+    typelib = os.path.realpath(builddir + "/widgets/src/AnacondaWidgets-1.0.typelib")
     if os.path.isfile(typelib):
         shutil.copy2(typelib, updates + libdir + "girepository-1.0")
 
@@ -782,6 +786,9 @@ def main():
     parser.add_argument('-f', '--fetch', action='store', type=str, metavar="ARCH",
                         help='autofetch new dependencies from Koji for ARCH')
 
+    parser.add_argument('-b', '--builddir', action='store', type=str,
+                        metavar='BUILDDIR', help='build directory for shared objects')
+
     args = parser.parse_args()
 
     if not os.path.isfile(configure) and not os.path.isfile(spec):
@@ -796,6 +803,15 @@ def main():
             args.tag = getArchiveTagOffset(configure, spec, args.offset)
         sys.stdout.write("Using tag: %s\n" % args.tag)
 
+    if args.builddir:
+        if os.path.isabs(args.builddir):
+            builddir = args.builddir
+        else:
+            builddir = os.path.join(cwd, args.builddir)
+    else:
+        builddir = cwd
+    print("BUILDDIR %s" % builddir)
+
     if not os.path.isdir(updates):
         os.makedirs(updates)
 
@@ -803,10 +819,10 @@ def main():
 
     if args.compile:
         if isysChanged(args.tag):
-            copyUpdatedIsys(updates, cwd)
+            copyUpdatedIsys(updates, cwd, builddir)
 
         if widgetsChanged(args.tag):
-            copyUpdatedWidgets(updates, cwd)
+            copyUpdatedWidgets(updates, cwd, builddir)
 
     if args.add_rpms:
         # as using -a or --add mutltiple times
-- 
1.8.3.1



More information about the anaconda-patches mailing list