aboutsummaryrefslogtreecommitdiff
path: root/Makefile.pl
diff options
context:
space:
mode:
authorAndrey Ponomarenko <aponomarenko@rosalab.ru>2012-03-11 11:57:02 +0400
committerAndrey Ponomarenko <aponomarenko@rosalab.ru>2012-03-11 11:57:02 +0400
commitab282100b2bf768a25be2a27675cd98e4e20f1d7 (patch)
treec251d91f14f566bfef9249f6c9635c893e641f7a /Makefile.pl
parentb1c490a9b86ca77b32c462ee56d2a10cf66b2a31 (diff)
downloadabi-compliance-checker-ab282100b2bf768a25be2a27675cd98e4e20f1d7.tar.gz
ABI Compliance Checker 1.96.8
Diffstat (limited to 'Makefile.pl')
-rwxr-xr-xMakefile.pl259
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