diff options
Diffstat (limited to 'Construct')
-rw-r--r-- | Construct | 538 |
1 files changed, 0 insertions, 538 deletions
diff --git a/Construct b/Construct deleted file mode 100644 index fce4470..0000000 --- a/Construct +++ /dev/null @@ -1,538 +0,0 @@ -# -# Construct file to build scons during development. -# (Kind of ironic that we're using the classic Perl Cons -# to build its Python child...) -# - -# -# Copyright (c) 2001, 2002 Steven Knight -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -print <<_EOF_; - - Using Cons to build the SCons packages is no longer supported, - and this Construct file is deprecated. - - Use SCons to build its own packages instead. - - See the README file for details. - -_EOF_ -exit 0; - -$project = 'scons'; - -Default qw( . ); - -# -# An internal "whereis" routine to figure out if we have a -# given program available. Put it in the "cons::" package -# so subsidiary Conscript files can get at it easily, too. -# -use Config; -sub cons::whereis { - my $file = shift; - foreach my $dir (split(/$Config{path_sep}/, $ENV{PATH})) { - $f = File::Spec->catfile($dir, $file); - return $f if -x $f && ! -d $f; - } - return undef -} - -sub cons::read_file { - my $file = shift; - open(F, "<$file") || die "cannot open $file: $!"; - my @lines = <F>; - close(F); - return wantarray ? @lines : join('', @lines); -} - -# -# We let the presence or absence of various utilities determine -# whether or not we bother to build certain pieces of things. -# This will allow people to still do SCons work even if they -# don't have Aegis or RPM installed, for example. -# -$aegis = cons::whereis('aegis'); -$aesub = cons::whereis('aesub'); -$rpm = cons::whereis('rpm'); -$dh_builddeb = cons::whereis('dh_builddeb'); -$fakeroot = cons::whereis('fakeroot'); - -# My installation on Red Hat doesn't like any debhelper version -# beyond 2, so let's use 2 as the default on any non-Debian build. -$DH_COMPAT = (-f "/etc/debian_version") ? 3 : 2; - -# -# Now grab the information that we "build" into the files (using sed). -# -chomp($date = $ARG{date}); -if (! $date) { - ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); - $year += 1900; - $date = sprintf("%4d/%02d/%02d %02d:%02d:%02d", - $year, $mon, $mday, $hour, $min, $sec); -} - -$developer = $ARG{developer} || $ENV{USERNAME} || $ENV{LOGNAME} || $ENV{USER}; - -$revision = $ARG{version}; -chomp($revision = `$aesub '\$version' 2>/dev/null`) if $aesub && ! $revision; -$revision = '0.05' if ! $revision; - -@arr = split(/\./, $revision); -@arr = ($arr[0], map {length($_) == 1 ? "0$_" : $_} @arr[1 .. $#arr]); -$revision = join('.', @arr); - -# Here's how we'd turn the calculated $revision into our package $version. -# This makes it difficult to coordinate with other files (debian/changelog -# and rpm/scons.spec) that hard-code the version number, so just go with -# the flow for now. -#pop @arr if $#arr >= 2; -#map {s/^[CD]//, s/^0*(\d\d)$/$1/} @arr; -#$version = join('.', @arr); -$version = '0.05'; - -$change = $ARG{change}; -chomp($change = `$aesub '\$change' 2>/dev/null`) if $aesub && ! $change; - -chomp($python_ver = `python -c "import sys; print sys.version[0:3]"`); - -chomp($platform = `python -c "from distutils.util import get_platform; print get_platform()"`); - -if ($platform eq "win32") { - $archsuffix = "zip" -} else { - $archsuffix = "tar.gz" -} - -use Cwd; -$test1_dir = File::Spec->catfile(cwd, "build", "test1"); -$test2_dir = File::Spec->catfile(cwd, "build", "test2"); - -$lib_project = File::Spec->catfile("lib", "$project"); - -# Originally, we were going to package the build engine in a -# private SCons library that contained the version number, so -# we could easily have multiple side-by-side versions of SCons -# installed. Keep this around in case we ever want to go back -# to that scheme. Note that this also requires changes to -# runtest.py and src/setup.py. -#$lib_project = File::Spec->catfile("lib", "$project-$version"); - -$test1_lib_dir = File::Spec->catfile($test1_dir, $lib_project); - -$test2_lib_dir = File::Spec->catfile($test2_dir, - "lib", - "python${python_ver}", - "site-packages"); - -$unpack_dir = File::Spec->catfile(cwd, "build", "unpack"); - -$env = new cons( ENV => { - AEGIS_PROJECT => $ENV{AEGIS_PROJECT}, - PATH => $ENV{PATH}, - }, - - TEST1_LIB_DIR => $test1_lib_dir, - TEST2_LIB_DIR => $test2_lib_dir, - - DATE => $date, - DEVELOPER => $developer, - REVISION => $revision, - VERSION => $version, - - SED => 'sed', - # Use %(-%) around the date so date - # changes don't cause rebuilds. - SEDFLAGS => " %( -e 's+__DATE__+%DATE+' %)" . - " -e 's+__DEVELOPER__+%DEVELOPER+'" . - " -e 's+__FILE__+%<+'" . - " -e 's+__REVISION__+%REVISION+'" . - " -e 's+__VERSION__+%VERSION+'", - SEDCOM => "%SED %SEDFLAGS %< > %>", - ); - -# -# Define SCons packages. -# -# In the original, more complicated packaging scheme, we were going -# to have separate packages for: -# -# python-scons only the build engine -# scons-script only the script -# scons the script plus the build engine -# -# We're now only delivering a single "scons" package, but this is still -# "built" as two sub-packages (the build engine and the script), so -# the definitions remain here, even though we're not using them for -# separate packages. -# - -$python_scons = { - 'pkg' => "python-$project", - 'src_subdir' => 'engine', - 'inst_subdir' => File::Spec->catfile("lib", - "python1.5", - "site-packages"), - 'prefix' => $test2_dir, - - 'debian_deps' => [ qw(debian/rules debian/control - debian/changelog debian/copyright - debian/python-scons.postinst - debian/python-scons.prerm) ], - - 'files' => [ qw(LICENSE.txt README.txt setup.cfg setup.py) ], - 'filemap' => { - 'LICENSE.txt' => '../LICENSE.txt', - } -}; - -# -# The original packaging scheme would have have required us to push -# the Python version number into the package name (python1.5-scons, -# python2.0-scons, etc.), which would have required a definition -# like the following. Leave this here in case we ever decide to do -# this in the future, but note that this would require some modification -# to src/engine/setup.py before it would really work. -# -#$python2_scons = { -# 'pkg' => "python2-$project", -# 'src_subdir' => 'engine', -# 'inst_subdir' => File::Spec->catfile("lib", -# "python2.1", -# "site-packages"), -# 'prefix' => $test2_dir, -# -# 'debian_deps' => [ qw(debian/rules debian/control -# debian/changelog debian/copyright -# debian/python2-scons.postinst -# debian/python2-scons.prerm) ], -# -# 'files' => [ qw(LICENSE.txt README.txt setup.cfg setup.py) ], -# 'filemap' => { -# 'LICENSE.txt' => '../LICENSE.txt', -# } -#}; - -$scons_script = { - 'pkg' => "$project-script", - 'src_subdir' => 'script', - 'inst_subdir' => 'bin', - 'prefix' => $test2_dir, - - 'debian_deps' => [ qw(debian/rules debian/control - debian/changelog debian/copyright - debian/python-scons.postinst - debian/python-scons.prerm) ], - - 'files' => [ qw(LICENSE.txt README.txt setup.cfg setup.py) ], - 'filemap' => { - 'LICENSE.txt' => '../LICENSE.txt', - 'scons' => 'scons.py', - } -}; - -$scons = { - 'pkg' => $project, - 'inst_subdir' => undef, - 'prefix' => $test1_dir, - - 'debian_deps' => [ qw(debian/rules debian/control - debian/changelog debian/copyright - debian/scons.postinst - debian/scons.prerm) ], - - 'files' => [ qw(CHANGES.txt LICENSE.txt - README.txt RELEASE.txt - os_spawnv_fix.diff scons.1 - script/scons.bat setup.cfg setup.py) ], - 'filemap' => { - 'scons.1' => '../doc/man/scons.1', - }, - - 'subpkgs' => [ $python_scons, $scons_script ], - 'subinst_dirs' => { "python-$project" => $lib_project, - "$project-script" => 'bin', - }, -}; - -my @src_deps; - -for $p ($scons) { - # - # Initialize variables with the right directories for this package. - # - my $pkg = $p->{'pkg'}; - - my $src = 'src'; - $src = File::Spec->catfile($src, $p->{'src_subdir'}) if $p->{'src_subdir'}; - - my $build = File::Spec->catfile('build', $pkg); - - my $prefix = $p->{'prefix'}; - my $install = $prefix; - if ($p->{'inst_subdir'}) { - $install = File::Spec->catfile($install, $p->{'inst_subdir'}); - } - - # - # Read up the list of source files from our MANIFEST.in. - # This list should *not* include LICENSE.txt, MANIFEST, - # README.txt, or setup.py. Make a copy of the list for the - # destination files. - # - my @src_files = cons::read_file("$src/MANIFEST.in"); - chomp(@src_files); - my @dst_files = map(File::Spec->catfile($install, $_), @src_files); - - if ($p->{'subpkgs'}) { - # - # This package includes some sub-packages. Read up their - # MANIFEST.in files, and add them to our source and destination - # file lists, modifying them as appropriate to add the - # specified subdirs. - # - foreach $sp (@{$p->{'subpkgs'}}) { - my $ssubdir = $sp->{'src_subdir'}; - my $isubdir = $p->{'subinst_dirs'}->{$sp->{'pkg'}}; - my $manifest = File::Spec->catfile($src, $ssubdir, 'MANIFEST.in'); - my @f = cons::read_file($manifest); - chomp(@f); - push(@src_files, map(File::Spec->catfile($sp->{'src_subdir'}, $_), - @f)); - push(@dst_files, map(File::Spec->catfile($install, $isubdir, $_), - @f)); - my $k; - foreach $k (keys %{$sp->{'filemap'}}) { - my $f = $sp->{'filemap'}->{$k}; - next if ! defined $f; - $k = File::Spec->catfile($sp->{'src_subdir'}, $k); - $p->{'filemap'}->{$k} = File::Spec->catfile($sp->{'src_subdir'}, - $f); - } - } - } - - # - # Now that we have the "normal" source files, add those files - # that are standard for each distribution. Note that we don't - # add these to dst_files, because they don't get installed. - # And we still have the MANIFEST to add. - # - push(@src_files, @{$p->{'files'}}); - - # - # Now run everything in src_file through the sed command we - # concocted to expand __FILE__, __VERSION__, etc. - # - foreach $b (@src_files) { - my $s = $p->{'filemap'}->{$b} || $b; - $env->Command("$build/$b", "$src/$s", "%SEDCOM"); - } - - # - # NOW, finally, we can create the MANIFEST, which we do - # by having Perl spit out the contents of the @src_files - # array we've carefully created. After we've added - # MANIFEST itself to the array, of course. - # - push(@src_files, "MANIFEST"); - $env->Command("$build/MANIFEST", "$src/MANIFEST.in", - qq([perl] open(F, ">%>"); print F join("\\n", sort qw(@src_files)), "\\n"; close(F))); - - # - # Use the Python distutils to generate the packages. - # - my $archive = "$build/dist/$pkg-$version.$archsuffix"; - - push(@src_deps, $archive); - - my @build_targets = ( - "$build/dist/$pkg-$version.$platform.$archsuffix", - $archive, - "$build/dist/$pkg-$version.win32.exe", - ); - my @install_targets = @build_targets; - - # We can get away with calling setup.py using a directory path - # like this because we put a preamble in it that will chdir() - # to the directory in which setup.py exists. - my @bdist_dirs = ("$build/build/lib", "$build/build/scripts"); - my $commands = qq(rm -rf @bdist_dirs && python $build/setup.py bdist - python $build/setup.py sdist - python $build/setup.py bdist_wininst); - - if ($rpm) { - chomp($cwd = `pwd`); - $topdir = "$cwd/$build/build/bdist.$platform/rpm"; - - $BUILDdir = "$topdir/BUILD/$pkg-$version"; - $RPMSdir = "$topdir/RPMS/noarch"; - $SOURCESdir = "$topdir/SOURCES"; - $SPECSdir = "$topdir/SPECS"; - $SRPMSdir = "$topdir/SRPMS"; - - $specfile = "$SPECSdir/$pkg-$version-1.spec"; - $sourcefile = "$SOURCESdir/$pkg-$version.$archsuffix"; - $rpm = "$RPMSdir/$pkg-$version-1.noarch.rpm"; - $src_rpm = "$SRPMSdir/$pkg-$version-1.src.rpm"; - - # We'd like to use the following here: - # - # $env->InstallAs($specfile, "rpm/$pkg.spec"); - # $env->InstallAs($sourcefile, $archive); - # - # but it looks like InstallAs doesn't propogate the - # signatures correctly, which means that the RPM file - # wouldn't always get rebuilt when it should. Work - # around it. - use File::Copy; - $env->Command($specfile, "rpm/$pkg.spec", - "[perl] File::Copy::copy('%<', '%>')"); - $env->Command($sourcefile, $archive, - "[perl] File::Copy::copy('%<', '%>')"); - - if (! -d $BUILDdir) { - $cmd = "mkdir -p $BUILDdir; "; - } - my @targets = ( $rpm, $src_rpm ); - $env->Command(\@targets, $specfile, - "${cmd}rpm --define '_topdir $topdir' -ba %<"); - $env->Depends(\@targets, $sourcefile); - - push(@install_targets, @targets); - }; - - @build_src_files = map("$build/$_", @src_files); - - if ($dh_builddeb && $fakeroot) { - # Debian builds directly into build/dist, so we don't - # need to add the .debs to the install_targets. - my $deb = "build/dist/${pkg}_$version-1_all.deb"; - $env->Command($deb, @build_src_files, qq( - fakeroot make -f debian/rules VERSION=%VERSION DH_COMPAT=$DH_COMPAT ENVOKED_BY_CONSTRUCT=1 binary-$pkg - env DH_COMPAT=$DH_COMPAT dh_clean)); - $env->Depends($deb, @{$p->{'debian_deps'}}); - } - - # - # Now set up creation and installation of the packages. - # - $env->Command([@build_targets], @build_src_files, $commands); - - $env->Install("build/dist", @install_targets); - - # - # Unpack the archive created by the distutils into build/unpack. - # - my @unpack_files = map("$unpack_dir/$pkg-$version/$_", @src_files); - - # We'd like to replace the last three lines with the following: - # - # tar zxf %< -C $unpack_dir - # - # but that gives heartburn to Cygwin's tar, so work around it - # with separate zcat-tar-rm commands. - Command $env [@unpack_files], $archive, qq( - rm -rf $unpack_dir/$pkg-$version - zcat %< > .temp - tar xf .temp -C $unpack_dir - rm -f .temp - ); - - # - # Run setup.py in the unpacked subdirectory to "install" everything - # into our build/test subdirectory. Auxiliary modules that we need - # (TestCmd.py, TestSCons.py, unittest.py) will be copied in by - # etc/Conscript. The runtest.py script will set PYTHONPATH so that - # the tests only look under build/test. This makes sure that our - # tests pass with what we really packaged, not because of something - # hanging around in the development directory. - # - # We can get away with calling setup.py using a directory path - # like this because we put a preamble in it that will chdir() - # to the directory in which setup.py exists. - Command $env [@dst_files], @unpack_files, qq( - rm -rf $install - python $unpack_dir/$pkg-$version/setup.py install --prefix=$prefix - ); -} - -# -# Arrange for supporting packages to be installed in the test directories. -# -Export qw( env ); - -Build "etc/Conscript"; - -# -# Documentation. -# -Link 'build/doc' => 'doc'; - -Build 'build/doc/Conscript'; - - -# -# If we're running in the actual Aegis project, pack up a complete -# source archive from the project files and files in the change, -# so we can share it with helpful developers who don't use Aegis. -# -# First, lie and say that we've seen any files removed by this -# change, so they don't get added to the source files list -# that goes into the archive. -# - -if ($change) { - foreach (`aegis -list -unf -c $change cf 2>/dev/null`) { - $seen{"$1\n"}++ if /^(?:source|test) remove(?:\s.*)+\s(\S+)$/; - } - - eval '@src_files = grep(! $seen{$_}++, - `aegis -list -terse pf 2>/dev/null`, - `aegis -list -terse cf 2>/dev/null`)'; - - @src_files = grep($_ !~ /(\.aeignore|\.consign)$/, @src_files); - - if (@src_files) { - chomp(@src_files); - - foreach $file (@src_files) { - $env->Command("build/$project-src/$file", - $file, - qq(%SEDCOM - chmod --reference=%< %>) - ); - } - - $env->Command("build/dist/$project-src-$version.tar.gz", - @src_deps, - map("build/$project-src/$_", @src_files), - qq( - rm -rf build/$project-src-$version - cp -rp build/$project-src build/$project-src-$version - find build/$project-src-$version -name .consign -exec rm {} \\; - tar zcf %> -C build $project-src-$version - )); - } -} |