From ff9cc6c7ec262a5437da97e395d542a95f4967b4 Mon Sep 17 00:00:00 2001 From: ketmar Date: Wed, 2 Oct 2013 12:02:43 +0300 Subject: [PATCH] Jambase.misc.fsys: removed ugly jam-based path normalization; we have cool NormalizePath rule! --- defaults/misc/fsys/Jambase.misc.fsys | 121 ++++------------------------------- 1 file changed, 12 insertions(+), 109 deletions(-) diff --git a/defaults/misc/fsys/Jambase.misc.fsys b/defaults/misc/fsys/Jambase.misc.fsys index e46aa1e..52d6f78 100644 --- a/defaults/misc/fsys/Jambase.misc.fsys +++ b/defaults/misc/fsys/Jambase.misc.fsys @@ -3,18 +3,18 @@ rule IsRootDir { # # handle "C:", "C:/", "/cygdrive" and "/cygdrive/" in Cygwin if $(NT) { - switch $(<) { + switch $(<:G=:R=) { case "*:" : res = "1" ; case '*:\' : res = "1" ; } } else if $(UNIX) && $(OS) = CYGWIN { - switch $(<) { + switch $(<:G=:R=) { case "?:" : res = "1" ; case "?:/" : res = "1" ; case "/cygdrive" : res = "1" ; case "/cygdrive/" : res = "1" ; } - } else if $(<) = "/" || $(<) = $(<:P) { + } else if $(<:G=:R=) = "/" || $(<) = $(<:D) { res = "1" ; } # @@ -42,105 +42,16 @@ rule AddTrailingSlash { } -# $(2): return empty as "." -rule FDirNormalizeDots { - local _d = [ RemoveTrailingSlashes $(<) ] ; - # - if ! $(_d) { - if $(2) { _d = "." ; } else { _d = ; } - } else if ! [ IsRootDir $(_d) ] { - local _t = $(_d:D=) ; - local _p = [ RemoveTrailingSlashes $(_d:P) ] ; - # - if $(_t) = $(DOT) { - _d = [ FDirNormalizeDots $(_p) ] ; - } else { - _d = [ FDirNormalizeDots $(_p) ] ; - _d += $(_t) ; - if $(_d[1]) = "/" && $(_d[1]) = "/" { _d = "" $(_d[2-]) ; } - } - } - _d = $(_d:J=$(PATH_SEPARATOR)) ; - return $(_d) ; -} - - -# $(2): return empty as "." -rule FDirNormalizeI { - local _d = [ RemoveTrailingSlashes $(<) ] ; - # - #Echo "FDirNormalizeI:" "$(_d)" ; - # - if ! $(_d) { - if $(2) { _d = "." ; } else { _d = ; } - } else if ! [ IsRootDir $(_d) ] { - local _t = $(_d:D=) ; - local _p = [ RemoveTrailingSlashes $(_d:P) ] ; - # - # check if we have only 'dotdots' here (fuck windoze and cygwin for now) - if $(_p) ~= '^(\.\.?/+)*\.\.?$' { - #Echo "DOTDOTS:" "$(_p)" ; - _d = $(_p) $(_t) ; - } else { - if $(_t) = $(DOTDOT) { - # .. - #Echo "XDOTDOT-I:" "$(_t)" ; - while 1 { - if [ IsRootDir $(_p) ] { - #Echo "XDOTDOT-R:" "$(_t)" "_p:" "$(_p)" ; - if ! $(_p) { _p = $(_t) ; } - #Echo "XDOTDOT-X:" "$(_p)" ; - return $(_p) ; - } - # cut one - _t = $(_p:D=) ; - _p = [ RemoveTrailingSlashes $(_p:P) ]; - if $(_t) != $(DOT) { break ; } - } - #Echo "XDOTDOT-O:" "$(_t)" ; - _d = [ FDirNormalizeI $(_p) : $(2) ] ; - } else if $(_t) = $(DOT) { - # . - _d = [ FDirNormalizeI $(_p) : $(2) ] ; - } else { - _d = [ FDirNormalizeI $(_p) : $(2) ] ; - _d += $(_t) ; - if $(_d[1]) = "/" && $(_d[1]) = "/" { _d = "" $(_d[2-]) ; } - } - } - #} else { - # Echo "ROOTDIR:" "$(_d)" ; - } - _d = $(_d:J=$(PATH_SEPARATOR)) ; - return $(_d) ; -} - - -# $2: return empty dir as "./"? -rule FDirNormalize { - #Echo "FDirNormalize-i:" "$(<)" ; - local res = [ FDirNormalizeDots $(<) : $(2) ] ; - res = [ FDirNormalizeI $(res) : $(2) ] ; - if ! $(res) && $(2) { res = "./" ; } - #Echo "FDirNormalize-o:" "$(res)" ; - return $(res) ; -} - - # $2: return empty path as "./"? rule FPathNormalize { - #Echo "FPathNormalize-i:" "$(<)" ; - local res = [ FDirNormalizeDots $(<) : $(2) ] ; - res = [ FDirNormalizeI $(res) : $(2) ] ; - # + #Echo "FPathNormalize-i:" $(<) "$2:" $(2) ; + local res = [ NormalizePath $(<[1]) : "" ] ; + if $(2) && ! $(res) { return "./" ; } if $(res) { - res += $(PATH_SEPARATOR) ; - res = $(res:J) ; - } else if $(2) { - res = "./" ; + res = [ AddTrailingSlash $(res) ] ; + if $(res) ~= '^[^/]' { res = "./$(res)" ; } } - # - #Echo "FPathNormalize-o:" "$(res)" ; + #Echo "FPathNormalize-o:" $(res) ; return $(res) ; } @@ -152,7 +63,6 @@ rule FPathNormalize { rule MkDirI { # Ignore timestamps on directories: we only care if they exist. NoUpdate $(<) ; - # Don't create . or any directory already created. if $(<:G=) != $(DOT) && ! $($(<)-mkdir) { # Cheesy gate to prevent multiple invocations on same dir @@ -161,17 +71,13 @@ rule MkDirI { $(<)-mkdir = true ; Depends dirs : $(<) ; MkDir1 $(<) ; - # Recursively make parent directories. # $(<:P) = $(<)'s parent, & we recurse until root - local s = $(<:P) ; - + local s = $(<:GRD) ; if [ IsRootDir $(s) ] { s = ; } - if $(s) = $(<) { # The parent is the same as the dir. - # We're at the root, which some OS's can't stat, so we mark - # it as NotFile. + # We're at the root, which some OS's can't stat, so we mark it as NotFile. NotFile $(s) ; } else if $(s:G=) { # There's a parent; recurse. @@ -196,7 +102,6 @@ rule MkDir { } } - actions MkDir1 { $(MKDIR) $(<) } @@ -298,9 +203,7 @@ actions File { # Copies _sources_ into _directory_ # rule Bulk { - local i ; - - for i in $(>) { + for local i in $(>) { File $(i:D=$(<)) : $(i) ; } } -- 2.11.4.GIT