diff options
author | Andrey Ponomarenko <aponomarenko@rosalab.ru> | 2012-03-11 11:57:02 +0400 |
---|---|---|
committer | Andrey Ponomarenko <aponomarenko@rosalab.ru> | 2012-03-11 11:57:02 +0400 |
commit | ab282100b2bf768a25be2a27675cd98e4e20f1d7 (patch) | |
tree | c251d91f14f566bfef9249f6c9635c893e641f7a /Makefile.pl | |
parent | b1c490a9b86ca77b32c462ee56d2a10cf66b2a31 (diff) | |
download | abi-compliance-checker-ab282100b2bf768a25be2a27675cd98e4e20f1d7.tar.gz |
ABI Compliance Checker 1.96.8
Diffstat (limited to 'Makefile.pl')
-rwxr-xr-x | Makefile.pl | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/Makefile.pl b/Makefile.pl new file mode 100755 index 0000000..c08bb72 --- /dev/null +++ b/Makefile.pl @@ -0,0 +1,259 @@ +#!/usr/bin/perl +########################################################################### +# Makefile for ABI Compliance Checker +# Install/remove the tool for GNU/Linux and FreeBSD +# +# Copyright (C) 2009-2010 The Linux Foundation. +# Copyright (C) 2009-2011 Institute for System Programming, RAS. +# Copyright (C) 2011-2012 Nokia Corporation and/or its subsidiary(-ies). +# Copyright (C) 2011-2012 ROSA Laboratory. +# +# Written by Andrey Ponomarenko +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License or the GNU Lesser +# General Public License as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# and the GNU Lesser General Public License along with this program. +# If not, see <http://www.gnu.org/licenses/>. +########################################################################### +use Getopt::Long; +Getopt::Long::Configure ("posix_default", "no_ignore_case"); +use File::Path qw(mkpath rmtree); +use File::Copy qw(copy); +use File::Basename qw(dirname); +use Cwd qw(abs_path); +use File::Find; +use Config; +use strict; + +my $TOOL_SNAME = "abi-compliance-checker"; +my $ARCHIVE_DIR = abs_path(dirname($0)); + +my $HELP_MSG = " +NAME: + Makefile for ABI Compliance Checker + +DESCRIPTION: + Install $TOOL_SNAME command and private modules. + +USAGE: + sudo perl $0 -install -prefix=/usr + sudo perl $0 -update -prefix=/usr + sudo perl $0 -remove -prefix=/usr + +OPTIONS: + -h|-help + Print this help. + + --prefix=PREFIX + Install files in PREFIX [/usr/local]. + + -install + Command to install the tool. + + -update + Command to update existing installation. + + -remove + Command to remove the tool. + +EXTRA OPTIONS: + --destdir=DESTDIR + This option is for maintainers to build + RPM or DEB packages inside the build root. + The environment variable DESTDIR is also + supported. +\n"; + +if(not @ARGV) { + print $HELP_MSG; + exit(0); +} + +my ($PREFIX, $DESTDIR, $Help, $Install, $Update, $Remove); + +GetOptions( + "h|help!" => \$Help, + "prefix=s" => \$PREFIX, + "destdir=s" => \$DESTDIR, + "install!" => \$Install, + "update!" => \$Update, + "remove!" => \$Remove +) or exit(1); + +sub scenario() +{ + if($Help) { + print $HELP_MSG; + exit(0); + } + if($Config{"osname"}!~/linux|freebsd|openbsd|netbsd/) + { # MS Windows, Mac OS X + print STDERR "The tool is ready-to-use without the need to install.\n"; + print STDERR "This Makefile is for GNU/Linux and BSD systems.\n"; + exit(1); + } + if(not $Install and not $Update and not $Remove) { + print STDERR "ERROR: command is not selected (-install, -update or -remove)\n"; + exit(1); + } + if($PREFIX ne "/") { + $PREFIX=~s/[\/]+\Z//g; + } + if(not $PREFIX) + { # default prefix + $PREFIX = "/usr/local"; + } + if(my $Var = $ENV{"DESTDIR"}) + { + print "Using DESTDIR environment variable\n"; + $DESTDIR = $Var; + } + if($DESTDIR) + { + if($DESTDIR ne "/") { + $DESTDIR=~s/[\/]+\Z//g; + } + if($DESTDIR!~/\A\//) { + print STDERR "ERROR: destdir is not absolute path\n"; + exit(1); + } + if(not -d $DESTDIR) { + print STDERR "ERROR: you should create destdir directory first\n"; + exit(1); + } + $PREFIX = $DESTDIR.$PREFIX; + if(not -d $PREFIX) { + print STDERR "ERROR: you should create installation directory first (destdir + prefix):\n mkdir -p $PREFIX\n"; + exit(1); + } + } + else + { + if($PREFIX!~/\A\//) { + print STDERR "ERROR: prefix is not absolute path\n"; + exit(1); + } + if(not -d $PREFIX) { + print STDERR "ERROR: you should create prefix directory first\n"; + exit(1); + } + } + + print "INSTALL PREFIX: $PREFIX\n"; + + # paths + my $EXE_PATH = "$PREFIX/bin"; + my $MODULES_PATH = "$PREFIX/share/$TOOL_SNAME"; + my $REL_PATH = "../share/$TOOL_SNAME"; + + if(not -w $PREFIX) { + print STDERR "ERROR: you should be root\n"; + exit(1); + } + if($Remove or $Update) + { + # remove executable + print "-- Removing $EXE_PATH/$TOOL_SNAME\n"; + unlink($EXE_PATH."/".$TOOL_SNAME); + + # remove modules + print "-- Removing $MODULES_PATH\n"; + rmtree($MODULES_PATH); + } + if($Install or $Update) + { + if(-e $EXE_PATH."/".$TOOL_SNAME or -e $MODULES_PATH) + { # check installed + if(not $Remove) { + print STDERR "ERROR: you should remove old version first (`sudo perl $0 -remove --prefix=$PREFIX`)\n"; + exit(1); + } + } + + # configure + my $Content = readFile($ARCHIVE_DIR."/".$TOOL_SNAME.".pl"); + if($DESTDIR) { # relative path + $Content=~s/ACC_MODULES_INSTALL_PATH/$REL_PATH/; + } + else { # absolute path + $Content=~s/ACC_MODULES_INSTALL_PATH/$MODULES_PATH/; + } + + # copy executable + print "-- Installing $EXE_PATH/$TOOL_SNAME\n"; + mkpath($EXE_PATH); + writeFile($EXE_PATH."/".$TOOL_SNAME, $Content); + chmod(0755, $EXE_PATH."/".$TOOL_SNAME); + + # copy modules + if(-d $ARCHIVE_DIR."/modules") + { + print "-- Installing $MODULES_PATH\n"; + mkpath($MODULES_PATH); + copyDir($ARCHIVE_DIR."/modules", $MODULES_PATH); + } + + # check PATH + if($ENV{"PATH"}!~/(\A|:)\Q$EXE_PATH\E(\Z|:)/) { + print "WARNING: your PATH variable doesn't include \'$EXE_PATH\'\n"; + } + } + exit(0); +} + +sub copyDir($$) +{ + my ($From, $To) = @_; + my %Files; + find(\&wanted, $From); + sub wanted { + $Files{$File::Find::dir."/$_"} = 1 if($_ ne "."); + } + foreach my $Path (sort keys(%Files)) + { + if($Config{"osname"}!~/win/ and $Path=~/Targets\/(windows|symbian)/) { + next; + } + my $Inst = $Path; + $Inst=~s/\A\Q$ARCHIVE_DIR\E/$To/; + if(-d $Path) + { # directories + mkpath($Inst); + } + else + { # files + mkpath(dirname($Inst)); + copy($Path, $Inst); + } + } +} + +sub readFile($) +{ + my $Path = $_[0]; + return "" if(not $Path or not -f $Path); + open(FILE, $Path) || die ("can't open file \'$Path\': $!\n"); + local $/ = undef; + my $Content = <FILE>; + close(FILE); + return $Content; +} + +sub writeFile($$) +{ + my ($Path, $Content) = @_; + return if(not $Path); + open(FILE, ">".$Path) || die ("can't open file \'$Path\': $!\n"); + print FILE $Content; + close(FILE); +} + +scenario();
\ No newline at end of file |