]> git.donarmstrong.com Git - debhelper.git/blobdiff - Debian/Debhelper/Buildsystem.pm
Improve build system auto-selection process
[debhelper.git] / Debian / Debhelper / Buildsystem.pm
index 9730928d33deed509f778cd6d50482713140c842..7f7465a42840171f1b73c34754da47d0a5376196 100644 (file)
@@ -47,7 +47,9 @@ sub DEFAULT_BUILD_DIRECTORY {
 #                  specified or empty, defaults to the current directory.
 # - builddir -     specifies build directory to use. Path is relative to the
 #                  current (top) directory. If undef or empty,
-#                  DEFAULT_BUILD_DIRECTORY directory will be used. 
+#                  DEFAULT_BUILD_DIRECTORY directory will be used.
+# - parallel -     max number of parallel processes to be spawned for building
+#                  sources (-1 = unlimited; 1 = no parallel)
 # Derived class can override the constructor to initialize common object
 # parameters. Do NOT use constructor to execute commands or otherwise
 # configure/setup build environment. There is absolutely no guarantee the
@@ -58,6 +60,7 @@ sub new {
 
        my $this = bless({ sourcedir => '.',
                           builddir => undef,
+                          parallel => undef,
                           cwd => Cwd::getcwd() }, $class);
 
        if (exists $opts{sourcedir}) {
@@ -71,6 +74,9 @@ sub new {
        if (exists $opts{builddir}) {
                $this->_set_builddir($opts{builddir});
        }
+       if (defined $opts{parallel}) {
+               $this->{parallel} = $opts{parallel};
+       }
        return $this;
 }
 
@@ -103,18 +109,27 @@ sub _set_builddir {
 }
 
 # This instance method is called to check if the build system is able
-# to auto build a source package. Additional argument $step describes
-# which operation the caller is going to perform (either configure,
-# build, test, install or clean). You must override this method for the
-# build system module to be ever picked up automatically. This method is
-# used in conjuction with @Dh_Buildsystems::BUILDSYSTEMS.
+# to build a source package. It will be called during build
+# system auto-selection process inside the root directory of the debian
+# source package. Current build step will be passed as an additional
+# argument. The value returned must be 0 if the source is not buildable
+# or a positive integer otherwise.
 #
-# This method is supposed to be called inside the source root directory.
-# Use $this->get_buildpath($path) method to get full path to the files
-# in the build directory.
+# Generally, it is enough to look for invariant unique build system
+# files shipped with clean source to determine if the source might
+# be buildable or not. However, if the build system enhances (i.e.
+# derives) from the other auto-buildable build system, this method
+# may also check if the source has already been built with this build
+# system partitially by looking for temporary files or other common
+# results the build system produces during the build process. The
+# latter checks must be unique to the current build system and must
+# be very unlikely to be true for either its parent or other build
+# systems. If it is determined that the source has already built
+# partitially with this build system, the value returned must be
+# greater than the one of the SUPER call.
 sub check_auto_buildable {
        my $this=shift;
-       my ($step) = @_;
+       my ($step)=@_;
        return 0;
 }
 
@@ -243,6 +258,11 @@ sub get_source_rel2builddir {
        return $dir;
 }
 
+sub get_parallel {
+       my $this=shift;
+       return $this->{parallel};
+}
+
 # When given a relative path to the build directory, converts it
 # to the path that is relative to the source directory. If $path is
 # not given, returns a path to the build directory that is relative
@@ -320,20 +340,20 @@ sub rmdir_builddir {
        my $only_empty=shift;
        if ($this->get_builddir()) {
                my $buildpath = $this->get_buildpath();
-               if (-d $buildpath && ! $dh{NO_ACT}) {
-                       my @spdir = File::Spec->splitdir($this->get_build_rel2sourcedir());
+               if (-d $buildpath) {
+                       my @dir = File::Spec->splitdir($this->get_build_rel2sourcedir());
                        my $peek;
-                       if (!$only_empty) {
+                       if (not $only_empty) {
                                doit("rm", "-rf", $buildpath);
-                               pop @spdir;
+                               pop @dir;
                        }
                        # If build directory is relative and had 2 or more levels, delete
-                       # empty parent directories until the source directory level.
+                       # empty parent directories until the source or top directory level.
                        if (not File::Spec->file_name_is_absolute($buildpath)) {
-                               while (($peek=pop(@spdir)) && $peek ne '.' && $peek ne '..') {
-                                       my $dir = $this->get_sourcepath(File::Spec->catdir(@spdir, $peek));
-                                       verbose_print("rmdir $dir");
-                                       last if ! rmdir($dir);
+                               while (($peek=pop @dir) && $peek ne '.' && $peek ne '..') {
+                                       my $dir = $this->get_sourcepath(File::Spec->catdir(@dir, $peek));
+                                       doit("rmdir", "--ignore-fail-on-non-empty", $dir);
+                                       last if -d $dir;
                                }
                        }
                }