source: josm/trunk/tools/japicc/modules/Internals/SysFiles.pm @ 12016

Last change on this file since 12016 was 11682, checked in by Don-vip, 3 years ago

update to japi-compliance-checker 2.1

File size: 5.9 KB
Line 
1###########################################################################
2# A module to find system files
3#
4# Copyright (C) 2016-2017 Andrey Ponomarenko's ABI Laboratory
5#
6# Written by Andrey Ponomarenko
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License or the GNU Lesser
10# General Public License as published by the Free Software Foundation.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# and the GNU Lesser General Public License along with this program.
19# If not, see <http://www.gnu.org/licenses/>.
20###########################################################################
21use strict;
22
23my %Cache;
24
25my %DefaultBinPaths;
26
27my %OS_AddPath=(
28"macos"=>{
29    "bin"=>{"/Developer/usr/bin"=>1}},
30"beos"=>{
31    "bin"=>{"/boot/common/bin"=>1,"/boot/system/bin"=>1,"/boot/develop/abi"=>1}}
32);
33
34sub getCmdPath($)
35{
36    my $Name = $_[0];
37   
38    if(defined $Cache{"getCmdPath"}{$Name}) {
39        return $Cache{"getCmdPath"}{$Name};
40    }
41    my $Path = searchCmd($Name);
42    if(not $Path and $In::Opt{"OS"} eq "windows")
43    { # search for *.exe file
44        $Path = searchCmd($Name.".exe");
45    }
46    if (not $Path) {
47        $Path = searchCmd_Path($Name);
48    }
49    if($Path=~/\s/) {
50        $Path = "\"".$Path."\"";
51    }
52    return ($Cache{"getCmdPath"}{$Name} = $Path);
53}
54
55sub searchCmd($)
56{
57    my $Name = $_[0];
58   
59    if(defined $Cache{"searchCmd"}{$Name}) {
60        return $Cache{"searchCmd"}{$Name};
61    }
62    if(my $JdkPath = $In::Opt{"JdkPath"})
63    {
64        if(-x $JdkPath."/".$Name) {
65            return ($Cache{"searchCmd"}{$Name} = $JdkPath."/".$Name);
66        }
67       
68        if(-x $JdkPath."/bin/".$Name) {
69            return ($Cache{"searchCmd"}{$Name} = $JdkPath."/bin/".$Name);
70        }
71    }
72    if(my $DefaultPath = getCmdPath_Default($Name)) {
73        return ($Cache{"searchCmd"}{$Name} = $DefaultPath);
74    }
75    return ($Cache{"searchCmd"}{$Name} = "");
76}
77
78sub searchCmd_Path($)
79{
80    my $Name = $_[0];
81   
82    if(defined $Cache{"searchCmd_Path"}{$Name}) {
83        return $Cache{"searchCmd_Path"}{$Name};
84    }
85   
86    if(defined $In::Opt{"SysPaths"}{"bin"})
87    {
88        foreach my $Path (sort {length($a)<=>length($b)} keys(%{$In::Opt{"SysPaths"}{"bin"}}))
89        {
90            if(-f $Path."/".$Name or -f $Path."/".$Name.".exe") {
91                return ($Cache{"searchCmd_Path"}{$Name} = join_P($Path,$Name));
92            }
93        }
94    }
95
96    return ($Cache{"searchCmd_Path"}{$Name} = "");
97}
98
99sub getCmdPath_Default($)
100{ # search in PATH
101    if(defined $Cache{"getCmdPath_Default"}{$_[0]}) {
102        return $Cache{"getCmdPath_Default"}{$_[0]};
103    }
104    return ($Cache{"getCmdPath_Default"}{$_[0]} = getCmdPath_Default_I($_[0]));
105}
106
107sub getCmdPath_Default_I($)
108{ # search in PATH
109    my $Name = $_[0];
110   
111    my $TmpDir = $In::Opt{"Tmp"};
112   
113    if($Name=~/find/)
114    { # special case: search for "find" utility
115        if(`find \"$TmpDir\" -maxdepth 0 2>\"$TmpDir/null\"`) {
116            return "find";
117        }
118    }
119    if(getVersion($Name)) {
120        return $Name;
121    }
122    if($In::Opt{"OS"} eq "windows")
123    {
124        if(`$Name /? 2>\"$TmpDir/null\"`) {
125            return $Name;
126        }
127    }
128    if($Name!~/which/)
129    {
130        if(my $WhichCmd = getCmdPath("which"))
131        {
132            if(`$WhichCmd $Name 2>\"$TmpDir/null\"`) {
133                return $Name;
134            }
135        }
136    }
137    foreach my $Path (sort {length($a)<=>length($b)} keys(%DefaultBinPaths))
138    {
139        if(-f $Path."/".$Name) {
140            return join_P($Path,$Name);
141        }
142    }
143    return "";
144}
145
146sub detectDefaultPaths($$)
147{
148    my ($Bin, $Java) = @_;
149   
150    if($Cache{"detectDefaultPaths"}{$Bin}{$Java})
151    { # enter once
152        return;
153    }
154    $Cache{"detectDefaultPaths"}{$Bin}{$Java} = 1;
155   
156    if(not keys(%{$In::Opt{"SysPaths"}}))
157    { # run once
158        foreach my $Type (keys(%{$OS_AddPath{$In::Opt{"OS"}}}))
159        { # additional search paths
160            foreach my $Path (keys(%{$OS_AddPath{$In::Opt{"OS"}}{$Type}}))
161            {
162                next if(not -d $Path);
163                $In::Opt{"SysPaths"}{$Type}{$Path} = $OS_AddPath{$In::Opt{"OS"}}{$Type}{$Path};
164            }
165        }
166        if($In::Opt{"OS"} ne "windows")
167        {
168            foreach my $Type ("include", "lib", "bin")
169            { # autodetecting system "devel" directories
170                foreach my $Path (cmdFind("/", "d", "*$Type*", 1)) {
171                    $In::Opt{"SysPaths"}{$Type}{$Path} = 1;
172                }
173                if(-d "/usr")
174                {
175                    foreach my $Path (cmdFind("/usr", "d", "*$Type*", 1)) {
176                        $In::Opt{"SysPaths"}{$Type}{$Path} = 1;
177                    }
178                }
179            }
180        }
181    }
182   
183    if($Bin)
184    {
185        detectBinDefaultPaths();
186        foreach my $Path (keys(%DefaultBinPaths)) {
187            $In::Opt{"SysPaths"}{"bin"}{$Path} = $DefaultBinPaths{$Path};
188        }
189    }
190   
191    if($Java)
192    {
193        if(my $JavacCmd = getCmdPath("javac"))
194        {
195            if(my $Ver = `$JavacCmd -version 2>&1`)
196            {
197                if($Ver=~/javac\s+(.+)/) {
198                    printMsg("INFO", "Using Java ".$1);
199                }
200            }
201        }
202    }
203}
204
205sub detectBinDefaultPaths()
206{
207    my $EnvPaths = $ENV{"PATH"};
208    if($In::Opt{"OS"} eq "beos") {
209        $EnvPaths .= ":".$ENV{"BETOOLS"};
210    }
211    elsif($In::Opt{"OS"} eq "windows"
212    and my $JHome = $ENV{"JAVA_HOME"}) {
213        $EnvPaths .= ";$JHome\\bin";
214    }
215    my $Sep = ($In::Opt{"OS"} eq "windows")?";":":|;";
216    foreach my $Path (sort {length($a)<=>length($b)} split(/$Sep/, $EnvPaths))
217    {
218        $Path=~s/[\/\\]+\Z//g;
219        if($Path) {
220            $DefaultBinPaths{$Path} = 1;
221        }
222    }
223}
224
225return 1;
Note: See TracBrowser for help on using the repository browser.