1#************************************************************** 2# 3# Licensed to the Apache Software Foundation (ASF) under one 4# or more contributor license agreements. See the NOTICE file 5# distributed with this work for additional information 6# regarding copyright ownership. The ASF licenses this file 7# to you under the Apache License, Version 2.0 (the 8# "License"); you may not use this file except in compliance 9# with the License. You may obtain a copy of the License at 10# 11# http://www.apache.org/licenses/LICENSE-2.0 12# 13# Unless required by applicable law or agreed to in writing, 14# software distributed under the License is distributed on an 15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16# KIND, either express or implied. See the License for the 17# specific language governing permissions and limitations 18# under the License. 19# 20#************************************************************** 21 22 23 24use lib ("$ENV{SOLARENV}/bin/modules"); 25use macosxotoolhelper; 26 27sub action($$$) 28{ 29 my %action = 30 ('app/UREBIN/URELIB' => '@executable_path', 31 'app/OOO/URELIB' => '@executable_path/', 32 'app/OOO/OOO' => '@executable_path', 33 'app/SDK/URELIB' => '@executable_path', 34 'app/BRAND/URELIB' => '@executable_path', 35 'app/BRAND/OOO' => '@executable_path', 36 'app/NONE/URELIB' => '@__VIA_LIBRARY_PATH__', 37 'app/NONE/OOO' => '@__VIA_LIBRARY_PATH__', 38 'app/NONE/NONE' => '@__VIA_LIBRARY_PATH__', 39 'shl/URELIB/URELIB' => '@loader_path', 40 'shl/OOO/URELIB' => '@loader_path', 41 'shl/OOO/OOO' => '@loader_path', 42 'shl/LOADER/LOADER' => '@loader_path', 43 'shl/OXT/URELIB' => '@executable_path', 44 'shl/BOXT/URELIB' => '@executable_path', 45 'shl/BOXT/OOO' => '@loader_path', 46 'shl/NONE/URELIB' => '@__VIA_LIBRARY_PATH__', 47 'shl/NONE/OOO' => '@__VIA_LIBRARY_PATH__', 48 'shl/NONE/NONE' => '@__VIA_LIBRARY_PATH__'); 49 50# ('app/UREBIN/URELIB' => '@executable_path/../lib', 51# 'app/OOO/URELIB' => '@executable_path/../ure-link/lib', 52# 'app/OOO/OOO' => '@executable_path', 53# 'app/SDK/URELIB' => '@executable_path/../../ure-link/lib', 54# 'app/BRAND/URELIB' => '@executable_path/../basis-link/ure-link/lib', 55# 'app/BRAND/OOO' => '@executable_path/../basis-link/program', 56# 'app/NONE/URELIB' => '@__VIA_LIBRARY_PATH__', 57# 'app/NONE/OOO' => '@__VIA_LIBRARY_PATH__', 58# 'app/NONE/NONE' => '@__VIA_LIBRARY_PATH__', 59# 'shl/URELIB/URELIB' => '@loader_path', 60# 'shl/OOO/URELIB' => '@loader_path/../ure-link/lib', 61# 'shl/OOO/OOO' => '@loader_path', 62# 'shl/LOADER/LOADER' => '@loader_path', 63# 'shl/OXT/URELIB' => '@executable_path/urelibs', 64# 'shl/BOXT/URELIB' => '@executable_path/urelibs', 65# 'shl/BOXT/OOO' => '@loader_path/../../../basis-link/program', 66# 'shl/NONE/URELIB' => '@__VIA_LIBRARY_PATH__', 67# 'shl/NONE/OOO' => '@__VIA_LIBRARY_PATH__', 68# 'shl/NONE/NONE' => '@__VIA_LIBRARY_PATH__'); 69 70 my ($type, $loc1, $loc2) = @_; 71 my $act = $action{"$type/$loc1/$loc2"}; 72 die "illegal combination $type/$loc1/$loc2" unless defined $act; 73 return $act; 74} 75 76@ARGV == 3 || @ARGV >= 2 && $ARGV[0] eq "extshl" or die 77 'Usage: app|shl|extshl UREBIN|URELIB|OOO|SDK|BRAND|OXT|BOXT|NONE|LOADER <filepath>*'; 78$type = shift @ARGV; 79$loc = shift @ARGV; 80if ($type eq "SharedLibrary") 81{ 82 $type = "shl"; 83} 84if ($type eq "Executable") 85{ 86 $type = "app" 87} 88if ($type eq "Library") 89{ 90 $type = "shl" 91} 92if ($type eq "extshl") 93{ 94 $type = "shl"; 95 my $change = ""; 96 my %inames; 97 foreach $file (@ARGV) 98 { 99 my $iname = otoolD($file); 100 (defined $iname ? $iname : $file . "\n") =~ m'^(.*?([^/]+))\n$' or 101 die "unexpected otool -D output"; 102 $change .= " -change $1 " . action($type, $loc, $loc) . "/$2"; 103 $inames{$file} = $2; 104 } 105 if( $loc eq "LOADER" ) 106 { 107 foreach $file (@ARGV) 108 { 109 my $call = "${::CC_PATH}install_name_tool$change -id \@loader_path/$inames{$file} $file"; 110 system($call) == 0 or die "cannot $call"; 111 } 112 } 113 else 114 { 115 foreach $file (@ARGV) 116 { 117 my $call = "${::CC_PATH}install_name_tool$change -id \@_______$loc/$inames{$file} $file"; 118 system($call) == 0 or die "cannot $call"; 119 } 120 } 121} 122foreach $file (@ARGV) 123{ 124 my $call = "${::CC_PATH}otool -L $file"; 125 open(IN, "-|", $call) or die "cannot $call"; 126 my $change = ""; 127 while (<IN>) 128 { 129 $change .= " -change $1 " . action($type, $loc, $2) . "$3" 130 if m'^\s*(@_{7}([^/]+)(/.+)) \(compatibility version \d+\.\d+\.\d+, current version \d+\.\d+\.\d+\)\n$'; 131 } 132 close(IN); 133 if ($change ne "") 134 { 135 $call = "${::CC_PATH}install_name_tool$change $file"; 136 system($call) == 0 or die "cannot $call"; 137 } 138} 139