#!/usr/bin/perl
#
# Copyright (c) 2001-2007 Hypertriton, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
@Scripts = qw(
mkdep
mkconcurrent.pl
manlinks.pl
cmpfiles.pl
cleanfiles.pl
gen-declspecs.pl
gen-includes.pl
install-manpages.sh);
@LibtoolFiles = qw(
config.guess
config.sub
configure.in
configure
ltmain.sh
ltconfig);
$SHAREDIR = '%SHAREDIR%';
%copied = ();
#
# Install file as-is.
#
sub InstallASIS
{
my $file = shift;
my $dst = shift;
if (!defined($dst)) { $dst = 'mk/'.$file; }
print STDERR " $file";
unless (open(SRC, $SHAREDIR.'/'.$file)) {
print STDERR "Reading $SHAREDIR/$file: $!\n";
return (0);
}
unless (open(DST, ">$dst")) {
print STDERR "Writing to $dst: $!\n";
return (0);
}
print DST ;
close(DST);
close(SRC);
return (1);
}
#
# Copy files needed by .
#
sub CopyDepsWWW
{
if (!-e 'xsl') {
unless (mkdir('xsl', 0755)) {
print STDERR "xsl/: $!\n";
return (0);
}
}
InstallASIS('ml.xsl', 'xsl/ml.xsl') || return (0);
InstallASIS('hstrip.pl') || return (0);
}
#
# Copy files needed by .
#
sub CopyDepsLIB
{
if (! -e 'mk/libtool') {
unless (mkdir('mk/libtool', 0755)) {
print STDERR "mk/libtool/: $!\n";
return (0);
}
}
foreach my $f (@LibtoolFiles) {
InstallASIS('libtool/'.$f) || return (0);
}
chmod(0755, 'mk/libtool/config.sub') ||
print STDERR "mk/libtool/config.sub: $!\n";
return (1);
}
#
# Install a .mk file. Scan the file for include dependency and install
# these as well.
#
sub InstallMK ($)
{
my ($file) = @_;
my $dst = 'mk/'.$file;
my $path = $SHAREDIR.'/'.$file;
my @deps = ();
print STDERR " $file";
unless (open(SRC, $SHAREDIR.'/'.$file)) {
print STDERR "$SHAREDIR/$file: $!\n";
return 0;
}
chop(@src = );
close(SRC);
unless (open(DEST, ">$dst")) {
print STDERR "dst $dst: $!\n";
close(SRC);
return 0;
}
foreach $_ (@src) {
print DEST $_, "\n";
if (/^include\s*.+\/mk\/(.+)\s*$/) {
if (!exists($copied{$1})) {
push @deps, $1;
$copied{$1}++;
}
}
}
close(DEST);
foreach my $dep (@deps) {
InstallMK($dep);
}
if ($file eq 'build.www.mk') {
CopyDepsWWW() || return (0);
}
if ($file eq 'build.lib.mk') {
CopyDepsLIB() || return (0);
}
$copied{$file}++;
return 1;
}
if (!-d 'mk' && @ARGV < 1) {
print STDERR "Usage: $0 [module-name ...]\n";
exit(1);
}
if (!-e 'mk' || @ARGV > 0) {
if (! -e 'mk') {
unless (mkdir('mk', 0755)) {
print STDERR "mk/: $!\n";
exit (1);
}
}
print STDERR "Installing in mk:";
foreach my $type (@ARGV) {
InstallMK("build.${type}.mk");
}
print STDERR ".\n";
} else {
unless (opendir(MKDIR, 'mk')) {
print "mk/: $!\n";
exit(1);
}
print STDERR "Updating mk:";
foreach my $f (readdir(MKDIR)) {
if ($f =~ /^\./ || -d 'mk/'.$f) { next; }
if ($f =~ /^(build\.[\w]+\.mk)$/) {
InstallMK($f);
} elsif (-e $SHAREDIR.'/'.$f) {
InstallASIS($f);
}
}
print STDERR ".\n";
closedir(MKDIR);
}
print STDERR "Installing scripts:";
foreach my $script (@Scripts) {
InstallASIS($script);
}
print STDERR ".\n";
if (!-e 'configure.in' &&
open(CONFIN, '>configure.in')) {
print CONFIN << 'EOF';
# Public domain
#
# Sample BSDbuild configure script source. Standard Bourne script fragments
# and BSDBuild directives are both allowed. See mkconfigure(1) for details.
#
# To generate a configure script, use the command:
# $ cat configure.in |mkconfigure > configure
#
# Name and version of the application. HDEFINE() will write the value of
# the variable to config/progname.h and config/version.h.
HDEFINE(PROGNAME, "foo")
HDEFINE(VERSION, "1.0-beta")
# An optional codename for the current release.
HDEFINE(RELEASE, "Foo")
# We can insert arbitrary Bourne script.
echo "Building release: ${RELEASE}"
# Register a ./configure option named "--enable-warnings".
REGISTER("--enable-warnings", "Enable compiler warnings [default: no]")
# Check for a suitable C compiler.
CHECK(cc)
# Add current directory to C include.
C_INCDIR($SRC)
# We could have also used:
# MDEFINE(CFLAGS, "$CFLAGS -I$SRC")
# Set our preferred -Wall switches.
if [ "${enable_warnings}" = "yes" ]; then
# HAVE_GCC has been set by CHECK(cc).
if [ "${HAVE_GCC}" = "yes" ]; then
MDEFINE(CFLAGS, "$CFLAGS -Wall -Werror -Wmissing-prototypes")
MDEFINE(CFLAGS, "$CFLAGS -Wno-unused")
fi
fi
EOF
close(CONFIN);
system("$BINDIR/mkconfigure < configure.in > configure");
if ($? != 0) {
print STDERR "mkconfigure failed\n";
exit(1);
}
chmod(0755, 'configure') || print STDERR "chmod: $!\n";
}
if (!-e 'Makefile' &&
open(MAKE, '>Makefile')) {
if ($type eq 'prog') {
print MAKE << 'EOF';
# Sample Makefile for a program.
# Path to parent directory of "mk".
TOP=.
# Executable output name (exact meaning is platform-dependent)
PROG=foo
#
# Source files. See the source for a list of all
# possible source types allowed.
#
SRCS=foo.c bar.cc baz.m
include ${TOP}/Makefile.config
include ${TOP}/mk/build.prog.mk
EOF
} elsif ($type eq 'lib') {
print MAKE << 'EOF';
# Sample Makefile for a library.
# Path to parent directory of "mk".
TOP=.
# Library output name (exact meaning is platform-dependent)
LIB= foo
#
# Source files. See the source for a list of all
# possible source types allowed.
#
SRCS= foo.c bar.cc baz.m
include ${TOP}/Makefile.config
include ${TOP}/mk/build.lib.mk
EOF
} elsif ($type eq 'www') {
print MAKE << 'EOF';
# Sample Makefile for a webpage or website.
# Path to parent directory of "mk".
TOP=.
#
# Target HTML files. The actual source files must be named foo.htm and
# bar.htm, and will be processed into a number of language and character
# set variants (ie. foo.html.en). Standard Apache-compatible variant maps
# will be generated as well.
#
HTML= foo.html bar.html
include ${TOP}/mk/build.www.mk
EOF
}
close(MAKE);
}
if (!-e 'Makefile.config' &&
open(MAKE, '>Makefile.config')) {
print MAKE "# File is auto-generated, do not edit\n";
close(MAKE);
}