blob: feef81223a0f1435219a0d48ebdbd1bc75368089 [file] [log] [blame]
Shinichiro Hamajib69bf8a2015-06-10 14:52:06 +09001// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Fumitoshi Ukai744bb2b2015-06-25 00:10:52 +090015package kati
Shinichiro Hamaji71fae4c2015-05-25 17:48:34 +090016
Fumitoshi Ukaidd058ff2015-07-03 14:29:41 +090017import (
Fumitoshi Ukaidd058ff2015-07-03 14:29:41 +090018 "os"
19 "path/filepath"
20)
Shinichiro Hamaji71fae4c2015-05-25 17:48:34 +090021
22func exists(filename string) bool {
Fumitoshi Ukaibc40a462015-06-02 15:51:16 +090023 _, err := os.Stat(filename)
24 if os.IsNotExist(err) {
Shinichiro Hamaji71fae4c2015-05-25 17:48:34 +090025 return false
26 }
Shinichiro Hamaji71fae4c2015-05-25 17:48:34 +090027 return true
28}
Fumitoshi Ukaidd058ff2015-07-03 14:29:41 +090029
Fumitoshi Ukai09fcd522015-07-15 14:31:50 +090030type vpath struct {
31 pattern string
32 dirs []string
33}
34
35type searchPaths struct {
36 vpaths []vpath // vpath directives
37 dirs []string // VPATH variable
38}
39
40func (s searchPaths) exists(target string) (string, bool) {
Fumitoshi Ukaidd058ff2015-07-03 14:29:41 +090041 if exists(target) {
42 return target, true
43 }
Fumitoshi Ukai09fcd522015-07-15 14:31:50 +090044 for _, vpath := range s.vpaths {
45 if !matchPattern(vpath.pattern, target) {
46 continue
47 }
48 for _, dir := range vpath.dirs {
49 vtarget := filepath.Join(dir, target)
Fumitoshi Ukaidd058ff2015-07-03 14:29:41 +090050 if exists(vtarget) {
51 return vtarget, true
52 }
53 }
54 }
Fumitoshi Ukai09fcd522015-07-15 14:31:50 +090055 for _, dir := range s.dirs {
56 vtarget := filepath.Join(dir, target)
57 if exists(vtarget) {
58 return vtarget, true
59 }
60 }
Fumitoshi Ukaidd058ff2015-07-03 14:29:41 +090061 return target, false
62}