1*6236dae4SAndroid Build Coastguard Worker########################################################################### 2*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 3*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 4*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 5*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 6*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 7*6236dae4SAndroid Build Coastguard Worker# 8*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Evgeny Grin (Karlson2k), <[email protected]>. 9*6236dae4SAndroid Build Coastguard Worker# 10*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 11*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 12*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 13*6236dae4SAndroid Build Coastguard Worker# 14*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 15*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 16*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 17*6236dae4SAndroid Build Coastguard Worker# 18*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 20*6236dae4SAndroid Build Coastguard Worker# 21*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 22*6236dae4SAndroid Build Coastguard Worker# 23*6236dae4SAndroid Build Coastguard Worker########################################################################### 24*6236dae4SAndroid Build Coastguard Worker 25*6236dae4SAndroid Build Coastguard Worker# This Perl package helps with path transforming when running curl tests on 26*6236dae4SAndroid Build Coastguard Worker# native Windows and MSYS/Cygwin. 27*6236dae4SAndroid Build Coastguard Worker# Following input formats are supported (via built-in Perl functions): 28*6236dae4SAndroid Build Coastguard Worker# (1) /some/path - absolute path in POSIX-style 29*6236dae4SAndroid Build Coastguard Worker# (2) D:/some/path - absolute path in Windows-style 30*6236dae4SAndroid Build Coastguard Worker# (3) some/path - relative path 31*6236dae4SAndroid Build Coastguard Worker# (4) D:some/path - path relative to current directory on Windows drive 32*6236dae4SAndroid Build Coastguard Worker# (paths like 'D:' are treated as 'D:./') (*) 33*6236dae4SAndroid Build Coastguard Worker# (5) \some/path - path from root directory on current Windows drive (*) 34*6236dae4SAndroid Build Coastguard Worker# All forward '/' and back '\' slashes are treated identically except leading 35*6236dae4SAndroid Build Coastguard Worker# slash in forms (1) and (5). 36*6236dae4SAndroid Build Coastguard Worker# Forward slashes are simpler processed in Perl, do not require extra escaping 37*6236dae4SAndroid Build Coastguard Worker# for shell (unlike back slashes) and accepted by Windows native programs, so 38*6236dae4SAndroid Build Coastguard Worker# all functions return paths with only forward slashes. 39*6236dae4SAndroid Build Coastguard Worker# All returned paths don't contain any duplicated slashes, only single slashes 40*6236dae4SAndroid Build Coastguard Worker# are used as directory separators on output. 41*6236dae4SAndroid Build Coastguard Worker# On non-Windows platforms functions acts as transparent wrappers for similar 42*6236dae4SAndroid Build Coastguard Worker# Perl's functions or return unmodified string (depending on functionality), 43*6236dae4SAndroid Build Coastguard Worker# so all functions can be unconditionally used on all platforms. 44*6236dae4SAndroid Build Coastguard Worker# 45*6236dae4SAndroid Build Coastguard Worker# (*) CAUTION! Forms (4) and (5) are not recommended to use as they can be 46*6236dae4SAndroid Build Coastguard Worker# interpreted incorrectly in Perl and MSYS/Cygwin environment have low 47*6236dae4SAndroid Build Coastguard Worker# control on Windows current drive and Windows current path on specific 48*6236dae4SAndroid Build Coastguard Worker# drive. 49*6236dae4SAndroid Build Coastguard Worker 50*6236dae4SAndroid Build Coastguard Workerpackage pathhelp; 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard Workeruse strict; 53*6236dae4SAndroid Build Coastguard Workeruse warnings; 54*6236dae4SAndroid Build Coastguard Workeruse Cwd 'abs_path'; 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard WorkerBEGIN { 57*6236dae4SAndroid Build Coastguard Worker use base qw(Exporter); 58*6236dae4SAndroid Build Coastguard Worker 59*6236dae4SAndroid Build Coastguard Worker our @EXPORT_OK = qw( 60*6236dae4SAndroid Build Coastguard Worker os_is_win 61*6236dae4SAndroid Build Coastguard Worker exe_ext 62*6236dae4SAndroid Build Coastguard Worker sys_native_abs_path 63*6236dae4SAndroid Build Coastguard Worker sys_native_current_path 64*6236dae4SAndroid Build Coastguard Worker build_sys_abs_path 65*6236dae4SAndroid Build Coastguard Worker ); 66*6236dae4SAndroid Build Coastguard Worker} 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Worker 69*6236dae4SAndroid Build Coastguard Worker####################################################################### 70*6236dae4SAndroid Build Coastguard Worker# Block for cached static variables 71*6236dae4SAndroid Build Coastguard Worker# 72*6236dae4SAndroid Build Coastguard Worker{ 73*6236dae4SAndroid Build Coastguard Worker # Cached static variable, Perl 5.0-compatible. 74*6236dae4SAndroid Build Coastguard Worker my $is_win = $^O eq 'MSWin32' 75*6236dae4SAndroid Build Coastguard Worker || $^O eq 'cygwin' 76*6236dae4SAndroid Build Coastguard Worker || $^O eq 'msys'; 77*6236dae4SAndroid Build Coastguard Worker 78*6236dae4SAndroid Build Coastguard Worker # Returns boolean true if OS is any form of Windows. 79*6236dae4SAndroid Build Coastguard Worker sub os_is_win { 80*6236dae4SAndroid Build Coastguard Worker return $is_win; 81*6236dae4SAndroid Build Coastguard Worker } 82*6236dae4SAndroid Build Coastguard Worker 83*6236dae4SAndroid Build Coastguard Worker # Cached static variable, Perl 5.0-compatible. 84*6236dae4SAndroid Build Coastguard Worker my $cygdrive_present; 85*6236dae4SAndroid Build Coastguard Worker 86*6236dae4SAndroid Build Coastguard Worker # Returns boolean true if Windows drives mounted with '/cygdrive/' prefix. 87*6236dae4SAndroid Build Coastguard Worker sub drives_mounted_on_cygdrive { 88*6236dae4SAndroid Build Coastguard Worker return $cygdrive_present if defined $cygdrive_present; 89*6236dae4SAndroid Build Coastguard Worker $cygdrive_present = ((-e '/cygdrive/') && (-d '/cygdrive/')) ? 1 : 0; 90*6236dae4SAndroid Build Coastguard Worker return $cygdrive_present; 91*6236dae4SAndroid Build Coastguard Worker } 92*6236dae4SAndroid Build Coastguard Worker} 93*6236dae4SAndroid Build Coastguard Worker 94*6236dae4SAndroid Build Coastguard Worker####################################################################### 95*6236dae4SAndroid Build Coastguard Worker# Returns current working directory in Windows format on Windows. 96*6236dae4SAndroid Build Coastguard Worker# 97*6236dae4SAndroid Build Coastguard Workersub sys_native_current_path { 98*6236dae4SAndroid Build Coastguard Worker return Cwd::getcwd() if !os_is_win(); 99*6236dae4SAndroid Build Coastguard Worker 100*6236dae4SAndroid Build Coastguard Worker my $cur_dir; 101*6236dae4SAndroid Build Coastguard Worker if($^O eq 'MSWin32') { 102*6236dae4SAndroid Build Coastguard Worker $cur_dir = Cwd::getcwd(); 103*6236dae4SAndroid Build Coastguard Worker } 104*6236dae4SAndroid Build Coastguard Worker else { 105*6236dae4SAndroid Build Coastguard Worker $cur_dir = Cygwin::posix_to_win_path(Cwd::getcwd()); 106*6236dae4SAndroid Build Coastguard Worker } 107*6236dae4SAndroid Build Coastguard Worker $cur_dir =~ s{[/\\]+}{/}g; 108*6236dae4SAndroid Build Coastguard Worker return $cur_dir; 109*6236dae4SAndroid Build Coastguard Worker} 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Worker####################################################################### 112*6236dae4SAndroid Build Coastguard Worker# Converts given path to system native absolute path, i.e. to Windows 113*6236dae4SAndroid Build Coastguard Worker# absolute format on Windows platform. Both relative and absolute 114*6236dae4SAndroid Build Coastguard Worker# formats are supported for input. 115*6236dae4SAndroid Build Coastguard Worker# 116*6236dae4SAndroid Build Coastguard Workersub sys_native_abs_path { 117*6236dae4SAndroid Build Coastguard Worker my ($path) = @_; 118*6236dae4SAndroid Build Coastguard Worker 119*6236dae4SAndroid Build Coastguard Worker # Return untouched on non-Windows platforms. 120*6236dae4SAndroid Build Coastguard Worker return Cwd::abs_path($path) if !os_is_win(); 121*6236dae4SAndroid Build Coastguard Worker 122*6236dae4SAndroid Build Coastguard Worker # Do not process empty path. 123*6236dae4SAndroid Build Coastguard Worker return $path if ($path eq ''); 124*6236dae4SAndroid Build Coastguard Worker 125*6236dae4SAndroid Build Coastguard Worker my $res; 126*6236dae4SAndroid Build Coastguard Worker if($^O eq 'msys' || $^O eq 'cygwin') { 127*6236dae4SAndroid Build Coastguard Worker $res = Cygwin::posix_to_win_path(Cwd::abs_path($path)); 128*6236dae4SAndroid Build Coastguard Worker } 129*6236dae4SAndroid Build Coastguard Worker elsif($path =~ m{^/(cygdrive/)?([a-z])/(.*)}) { 130*6236dae4SAndroid Build Coastguard Worker $res = uc($2) . ":/" . $3; 131*6236dae4SAndroid Build Coastguard Worker } 132*6236dae4SAndroid Build Coastguard Worker else { 133*6236dae4SAndroid Build Coastguard Worker $res = Cwd::abs_path($path); 134*6236dae4SAndroid Build Coastguard Worker } 135*6236dae4SAndroid Build Coastguard Worker 136*6236dae4SAndroid Build Coastguard Worker $res =~ s{[/\\]+}{/}g; 137*6236dae4SAndroid Build Coastguard Worker return $res; 138*6236dae4SAndroid Build Coastguard Worker} 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard Worker####################################################################### 141*6236dae4SAndroid Build Coastguard Worker# Converts given path to build system format absolute path, i.e. to 142*6236dae4SAndroid Build Coastguard Worker# MSYS/Cygwin POSIX-style absolute format on Windows platform. Both 143*6236dae4SAndroid Build Coastguard Worker# relative and absolute formats are supported for input. 144*6236dae4SAndroid Build Coastguard Worker# 145*6236dae4SAndroid Build Coastguard Workersub build_sys_abs_path { 146*6236dae4SAndroid Build Coastguard Worker my ($path) = @_; 147*6236dae4SAndroid Build Coastguard Worker 148*6236dae4SAndroid Build Coastguard Worker # Return untouched on non-Windows platforms. 149*6236dae4SAndroid Build Coastguard Worker return Cwd::abs_path($path) if !os_is_win(); 150*6236dae4SAndroid Build Coastguard Worker 151*6236dae4SAndroid Build Coastguard Worker my $res; 152*6236dae4SAndroid Build Coastguard Worker if($^O eq 'msys' || $^O eq 'cygwin') { 153*6236dae4SAndroid Build Coastguard Worker $res = Cygwin::win_to_posix_path($path, 1); 154*6236dae4SAndroid Build Coastguard Worker } 155*6236dae4SAndroid Build Coastguard Worker else { 156*6236dae4SAndroid Build Coastguard Worker $res = Cwd::abs_path($path); 157*6236dae4SAndroid Build Coastguard Worker 158*6236dae4SAndroid Build Coastguard Worker if($res =~ m{^([A-Za-z]):(.*)}) { 159*6236dae4SAndroid Build Coastguard Worker $res = "/" . lc($1) . $2; 160*6236dae4SAndroid Build Coastguard Worker $res = '/cygdrive' . $res if(drives_mounted_on_cygdrive()); 161*6236dae4SAndroid Build Coastguard Worker } 162*6236dae4SAndroid Build Coastguard Worker } 163*6236dae4SAndroid Build Coastguard Worker 164*6236dae4SAndroid Build Coastguard Worker return $res; 165*6236dae4SAndroid Build Coastguard Worker} 166*6236dae4SAndroid Build Coastguard Worker 167*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 168*6236dae4SAndroid Build Coastguard Worker# Return file extension for executable files on this operating system 169*6236dae4SAndroid Build Coastguard Worker# 170*6236dae4SAndroid Build Coastguard Workersub exe_ext { 171*6236dae4SAndroid Build Coastguard Worker my ($component, @arr) = @_; 172*6236dae4SAndroid Build Coastguard Worker if ($ENV{'CURL_TEST_EXE_EXT'}) { 173*6236dae4SAndroid Build Coastguard Worker return $ENV{'CURL_TEST_EXE_EXT'}; 174*6236dae4SAndroid Build Coastguard Worker } 175*6236dae4SAndroid Build Coastguard Worker if ($ENV{'CURL_TEST_EXE_EXT_'.$component}) { 176*6236dae4SAndroid Build Coastguard Worker return $ENV{'CURL_TEST_EXE_EXT_'.$component}; 177*6236dae4SAndroid Build Coastguard Worker } 178*6236dae4SAndroid Build Coastguard Worker if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' || 179*6236dae4SAndroid Build Coastguard Worker $^O eq 'dos' || $^O eq 'os2') { 180*6236dae4SAndroid Build Coastguard Worker return '.exe'; 181*6236dae4SAndroid Build Coastguard Worker } 182*6236dae4SAndroid Build Coastguard Worker return ''; 183*6236dae4SAndroid Build Coastguard Worker} 184*6236dae4SAndroid Build Coastguard Worker 185*6236dae4SAndroid Build Coastguard Worker1; # End of module 186