[libvirt] [PATCH v4 01/20] build: mandate use of a build dir != src dir

Pavel Hrdina phrdina at redhat.com
Fri Nov 8 15:42:02 UTC 2019


Historically we've allowed builds in the main src dir, but meson does
not support this. Explicitly force separate build dir in autotools to
align with meson. We must re-enable dependency tracking which the RPM
%configure macro turns off. Without this, the build dir doesn't get
the source directory tree mirrored.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---

Notes:
    New in v2.
    
    Changes in v4:
        - Fixed Travis rules and documentation

 .travis.yml            |  3 ++-
 README-hacking         | 11 ++++++++---
 README.md              | 11 +++++++----
 bootstrap.conf         |  6 ++++++
 configure.ac           |  6 ++++++
 docs/compiling.html.in | 10 ++++++----
 docs/windows.html.in   |  3 ++-
 libvirt.spec.in        | 10 +++++++++-
 8 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 478909d3bb..8b70c1c937 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -53,7 +53,8 @@ matrix:
       script:
         # We can't run 'distcheck' or 'syntax-check' because they fail on
         # macOS, but doing 'install' and 'dist' gives us some useful coverage
-        - ./autogen.sh --prefix=$(pwd)/install-root && make -j3 && make -j3 install && make -j3 dist
+        - mkdir build && cd build
+        - ../autogen.sh --prefix=$(pwd)/install-root && make -j3 && make -j3 install && make -j3 dist
 
 git:
   submodules: true
diff --git a/README-hacking b/README-hacking
index ec04271c6a..7da940eb13 100644
--- a/README-hacking
+++ b/README-hacking
@@ -11,7 +11,7 @@ We've opted to keep only the highest-level sources in the GIT repository.
 This eases our maintenance burden, (fewer merges etc.), but imposes more
 requirements on anyone wishing to build from the just-checked-out sources.
 Note the requirements to build the released archive are much less and
-are just the requirements of the standard ./configure && make procedure.
+are just the requirements of the standard configure && make procedure.
 Specific development tools and versions will be checked for and listed by
 the bootstrap script.
 
@@ -34,10 +34,14 @@ reduce download time and disk space requirements:
 
         $ export GNULIB_SRCDIR=/path/to/gnulib
 
+We require to have the build directory different than the source directory:
+
+        $ mkdir build && cd build
+
 The next step is to get all required pieces from gnulib,
-to run autoreconf, and to invoke ./configure:
+to run autoreconf, and to invoke ../autogen.sh:
 
-        $ ./autogen.sh
+        $ ../autogen.sh
 
 And there you are!  Just
 
@@ -47,6 +51,7 @@ And there you are!  Just
 At this point, there should be no difference between your local copy,
 and the GIT master copy:
 
+        $ cd ..
         $ git diff
 
 should output no difference.
diff --git a/README.md b/README.md
index 4d1e86259d..44b0dd87c5 100644
--- a/README.md
+++ b/README.md
@@ -38,11 +38,13 @@ Installation
 ------------
 
 Libvirt uses the GNU Autotools build system, so in general can be built
-and installed with the usual commands. For example, to build in a manner
-that is suitable for installing as root, use:
+and installed with the usual commands, however, we mandate to have the
+build directory different than the source directory. For example, to build
+in a manner that is suitable for installing as root, use:
 
 ```
-$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
+$ mkdir build && cd build
+$ ../configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
 $ make
 $ sudo make install
 ```
@@ -50,7 +52,8 @@ $ sudo make install
 While to build & install as an unprivileged user
 
 ```
-$ ./configure --prefix=$HOME/usr
+$ mkdir build && cd build
+$ ../configure --prefix=$HOME/usr
 $ make
 $ make install
 ```
diff --git a/bootstrap.conf b/bootstrap.conf
index 0c7de2d2aa..4c784487e2 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -164,3 +164,9 @@ bootstrap_post_import_hook()
   sed 's,\.\./\.\./\.\.,../..,g; s/^TESTS /GNULIB_TESTS /' $m > $m-t
   mv -f $m-t $m
 }
+
+bootstrap_epilogue()
+{
+    echo "$0: done.  Now you can run 'mkdir build && cd build && ../configure'."
+    exit 0
+}
diff --git a/configure.ac b/configure.ac
index 233fbeaaf3..32b246842e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,6 +17,12 @@ dnl License along with this library.  If not, see
 dnl <http://www.gnu.org/licenses/>.
 
 AC_INIT([libvirt], [5.10.0], [libvir-list at redhat.com], [], [https://libvirt.org])
+
+if test $srcdir = "."
+then
+  AC_MSG_ERROR([Build directory must be different from source directory])
+fi
+
 AC_CONFIG_SRCDIR([src/libvirt.c])
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_HEADERS([config.h])
diff --git a/docs/compiling.html.in b/docs/compiling.html.in
index 8dcceb3eb9..5869ebb90f 100644
--- a/docs/compiling.html.in
+++ b/docs/compiling.html.in
@@ -9,13 +9,15 @@
     <h2><a id="compiling">Compiling a release tarball</a></h2>
 
     <p>
-      libvirt uses the standard configure/make/install steps:
+      libvirt uses the standard configure/make/install steps and mandates
+      that the build directory is different that the source directory:
     </p>
 
     <pre>
 $ xz -c libvirt-x.x.x.tar.xz | tar xvf -
 $ cd libvirt-x.x.x
-$ ./configure</pre>
+$ mkdir build && cd build
+$ ../configure</pre>
 
     <p>
       The <i>configure</i> script can be given options to change its default
@@ -28,7 +30,7 @@ $ ./configure</pre>
     </p>
 
     <pre>
-$ ./configure <i>--help</i></pre>
+$ ../configure <i>--help</i></pre>
 
     <p>
       When you have determined which options you want to use (if any),
@@ -49,7 +51,7 @@ $ ./configure <i>--help</i></pre>
     </p>
 
     <pre>
-$ ./configure <i>[possible options]</i>
+$ ../configure <i>[possible options]</i>
 $ make
 $ <b>sudo</b> <i>make install</i></pre>
 
diff --git a/docs/windows.html.in b/docs/windows.html.in
index 096d118bf7..a0ff525e1a 100644
--- a/docs/windows.html.in
+++ b/docs/windows.html.in
@@ -180,7 +180,8 @@
     </p>
 
 <pre>
-./configure \
+mkdir build && cd build
+../configure \
   --without-sasl \
   --without-polkit \
   --without-python \
diff --git a/libvirt.spec.in b/libvirt.spec.in
index dcad08cb5f..723ced3535 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1163,7 +1163,13 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec)
 %endif
 
 rm -f po/stamp-po
-%configure --with-runstatedir=%{_rundir} \
+
+%define _configure ../configure
+mkdir %{_vpath_builddir}
+cd %{_vpath_builddir}
+
+%configure --enable-dependency-tracking \
+           --with-runstatedir=%{_rundir} \
            %{?arg_qemu} \
            %{?arg_openvz} \
            %{?arg_lxc} \
@@ -1232,6 +1238,7 @@ rm -fr %{buildroot}
 
 export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec)
 
+cd %{_vpath_builddir}
 %make_install %{?_smp_mflags} SYSTEMD_UNIT_DIR=%{_unitdir} V=1
 
 rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
@@ -1313,6 +1320,7 @@ mv $RPM_BUILD_ROOT%{_datadir}/systemtap/tapset/libvirt_qemu_probes.stp \
 %endif
 
 %check
+cd %{_vpath_builddir}
 if ! make %{?_smp_mflags} check VIR_TEST_DEBUG=1
 then
   cat test-suite.log || true
-- 
2.23.0




More information about the libvir-list mailing list