1 | # ============================================================ # |
---|
2 | # # |
---|
3 | # File : provide_libs.pl # |
---|
4 | # Purpose : # |
---|
5 | # # |
---|
6 | # Coded by Ralf Westram (coder@reallysoft.de) in June 2009 # |
---|
7 | # Institute of Microbiology (Technical University Munich) # |
---|
8 | # www.arb-home.de # |
---|
9 | # # |
---|
10 | # ============================================================ # |
---|
11 | |
---|
12 | use strict; |
---|
13 | use warnings; |
---|
14 | |
---|
15 | my %needed_by = ( |
---|
16 | # 'libXm.so' => 'arb_ntree', # this would also link the motif lib (not done atm) |
---|
17 | ); |
---|
18 | |
---|
19 | my %needed_by_opengl = ( |
---|
20 | 'libGLEW.so' => 'arb_edit4', |
---|
21 | 'libGLw.so' => 'arb_edit4', |
---|
22 | ); |
---|
23 | |
---|
24 | my $verbose = 0; # for debugging this script |
---|
25 | |
---|
26 | # libs get copied to ../lib/addlibs |
---|
27 | |
---|
28 | sub getModtime($) { |
---|
29 | my ($fileOrDir) = @_; |
---|
30 | my $modtime = (stat($fileOrDir))[9]; |
---|
31 | return $modtime; |
---|
32 | } |
---|
33 | |
---|
34 | sub update_lib($$$) { |
---|
35 | my ($libname, $binary, $addlibsdir) = @_; |
---|
36 | |
---|
37 | if (not -f $binary) { |
---|
38 | print "Can't use '$binary' to detect used '$libname' (no such file)\n"; |
---|
39 | } |
---|
40 | else { |
---|
41 | my ($linked_symbolic,$linked_real) = (undef,undef); |
---|
42 | my $cmd = 'ldd '.$binary; |
---|
43 | |
---|
44 | $verbose==0 || print "$cmd\n"; |
---|
45 | open(LDD,$cmd.'|') || die "failed to fork '$cmd' (Reason: $!)"; |
---|
46 | foreach (<LDD>) { |
---|
47 | chomp; |
---|
48 | if (/^\s+([^\s]+)\s+=>\s+([^\s]*)\s+\(.*\)$/) { |
---|
49 | my ($symbolic,$real) = ($1,$2); |
---|
50 | $verbose==0 || print "ldd-out: symbolic='$symbolic' real='$real'\n"; |
---|
51 | if ($symbolic =~ /^$libname\./) { |
---|
52 | ($linked_symbolic,$linked_real) = ($symbolic,$real); |
---|
53 | } |
---|
54 | } |
---|
55 | else { |
---|
56 | $verbose==0 || print "cant parse ldd-out: '$_'\n"; |
---|
57 | } |
---|
58 | } |
---|
59 | close(LDD) || die "failed to execute '$cmd' (Reason: $! exitcode=$?)"; |
---|
60 | |
---|
61 | my $keep = undef; |
---|
62 | if (not defined $linked_symbolic) { |
---|
63 | print "Warning: $binary is NOT linked against $libname ($libname will not be provided)\n"; |
---|
64 | } |
---|
65 | else { |
---|
66 | print "$binary links against '$linked_symbolic' ($linked_real)\n"; |
---|
67 | |
---|
68 | my $source = $linked_real; |
---|
69 | my $dest = $addlibsdir.'/'.$linked_symbolic; |
---|
70 | my $doCopy = 0; |
---|
71 | |
---|
72 | if (-f $dest) { |
---|
73 | my $mod_source = getModtime($source); |
---|
74 | my $mod_dest = getModtime($dest); |
---|
75 | |
---|
76 | if ($mod_dest != $mod_source) { |
---|
77 | print "Modification time of $source differs -> force update\n"; |
---|
78 | $doCopy = 1; |
---|
79 | } |
---|
80 | else { |
---|
81 | print "$dest is up-to-date\n"; |
---|
82 | } |
---|
83 | } |
---|
84 | else { $doCopy = 1; } |
---|
85 | |
---|
86 | if ($doCopy==1) { |
---|
87 | $cmd = "cp -p '$source' '$dest'"; |
---|
88 | print "Updating $dest\n"; |
---|
89 | system($cmd)==0 || die "Failed to execute '$cmd' (Reason: $?)"; |
---|
90 | } |
---|
91 | |
---|
92 | if (not -f $dest) { die "oops .. where is $dest?"; } |
---|
93 | $keep = $linked_symbolic; |
---|
94 | } |
---|
95 | |
---|
96 | # delete older copies |
---|
97 | opendir(DIR,$addlibsdir) || die "can't read directory '$addlibsdir' (Reason: $!)"; |
---|
98 | foreach (readdir(DIR)) { |
---|
99 | if (/^$libname/) { |
---|
100 | # print "Matching file: '$_'\n"; |
---|
101 | if ((not defined $keep) or ($_ ne $keep)) { |
---|
102 | my $toRemove = $addlibsdir.'/'.$_; |
---|
103 | print "removing obsolete file '$toRemove'\n"; |
---|
104 | unlink($toRemove) || die "Failed to unlink '$toRemove' (Reason: $!)"; |
---|
105 | } |
---|
106 | } |
---|
107 | } |
---|
108 | closedir(DIR); |
---|
109 | } |
---|
110 | } |
---|
111 | sub provide_libs($$$) { |
---|
112 | my ($arbhome,$addlibsdir,$opengl) = @_; |
---|
113 | my $bindir = $arbhome.'/bin'; |
---|
114 | |
---|
115 | chdir($arbhome) || die "can't cd to '$arbhome' (Reason: $!)"; |
---|
116 | print "Updating additional libs\n"; |
---|
117 | |
---|
118 | foreach my $lib (keys %needed_by) { |
---|
119 | update_lib($lib, $bindir.'/'.$needed_by{$lib}, $addlibsdir); |
---|
120 | } |
---|
121 | if ($opengl==1) { |
---|
122 | foreach my $lib (keys %needed_by_opengl) { |
---|
123 | update_lib($lib, $bindir.'/'.$needed_by_opengl{$lib}, $addlibsdir); |
---|
124 | } |
---|
125 | } |
---|
126 | } |
---|
127 | |
---|
128 | sub main() { |
---|
129 | my $args = scalar(@ARGV); |
---|
130 | if ($args==0) { |
---|
131 | die 'Usage: provide_libs.pl "opengl=$(OPENGL)" "link_static=$(LINK_STATIC)" "arbhome=$(ARBHOME)"'; |
---|
132 | } |
---|
133 | |
---|
134 | my %arg = (); |
---|
135 | foreach (@ARGV) { |
---|
136 | if (/^([^=]+)=(.*)$/) { $arg{$1} = $2; } |
---|
137 | else { die "can't handle argument '$_'"; } |
---|
138 | } |
---|
139 | |
---|
140 | if ($verbose>0) { foreach (sort keys %arg) { print "$_='".$arg{$_}."'\n"; } } |
---|
141 | |
---|
142 | my $opengl = $arg{opengl}; |
---|
143 | my $arbhome = $arg{arbhome}; |
---|
144 | my $link_static = $arg{link_static}; |
---|
145 | |
---|
146 | if (defined $opengl and defined $arbhome and defined $link_static) { |
---|
147 | if (not -d $arbhome) { die "Expected directory '$arbhome'"; } |
---|
148 | |
---|
149 | my $addlibsdir = $arbhome.'/lib/addlibs'; |
---|
150 | if (not -d $addlibsdir) { die "Expected directory '$addlibsdir'"; } |
---|
151 | |
---|
152 | if ($link_static == 1) { |
---|
153 | print "No libs provided to $addlibsdir (we are linking static)\n"; |
---|
154 | } |
---|
155 | else { |
---|
156 | provide_libs($arbhome,$addlibsdir,$opengl); |
---|
157 | } |
---|
158 | } |
---|
159 | else { |
---|
160 | die "Expected arguments are 'devel=', 'arbhome=' and 'link_static='"; |
---|
161 | } |
---|
162 | } |
---|
163 | main(); |
---|