1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/base_paths.h"
#include <ostream>
#include <string>
#include "build/build_config.h"
#include "base/environment.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/path_service.h"
#include "base/nix/xdg_util.h"
#if defined(OS_FREEBSD)
#include <sys/param.h>
#include <sys/sysctl.h>
#elif defined(OS_SOLARIS)
#include <stdlib.h>
#endif
namespace base {
#if defined(OS_LINUX)
const char kSelfExe[] = "/proc/self/exe";
#endif
// The name of this file relative to the source root. This is used for checking
// that the source checkout is in the correct place.
static const char kThisSourceFile[] = "base/base_paths_linux.cc";
bool PathProviderPosix(int key, FilePath* result) {
FilePath path;
switch (key) {
case base::FILE_EXE:
case base::FILE_MODULE: { // TODO(evanm): is this correct?
#if defined(OS_LINUX)
FilePath bin_dir;
if (!file_util::ReadSymbolicLink(FilePath(kSelfExe), &bin_dir)) {
NOTREACHED() << "Unable to resolve " << kSelfExe << ".";
return false;
}
*result = bin_dir;
return true;
#elif defined(OS_FREEBSD)
int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
char bin_dir[PATH_MAX + 1];
size_t length = sizeof(bin_dir);
int error = sysctl(name, 4, bin_dir, &length, NULL, 0);
if (error < 0 || length == 0 || strlen(bin_dir) == 0) {
NOTREACHED() << "Unable to resolve path.";
return false;
}
bin_dir[strlen(bin_dir)] = 0;
*result = FilePath(bin_dir);
return true;
#elif defined(OS_SOLARIS)
char bin_dir[PATH_MAX + 1];
if (realpath(getexecname(), bin_dir) == NULL) {
NOTREACHED() << "Unable to resolve " << getexecname() << ".";
return false;
}
*result = FilePath(bin_dir);
return true;
#elif defined(OS_OPENBSD)
// There is currently no way to get the executable path on OpenBSD
*result = FilePath("/usr/local/chrome/chrome");
return true;
#endif
}
case base::DIR_SOURCE_ROOT: {
// Allow passing this in the environment, for more flexibility in build
// tree configurations (sub-project builds, gyp --output_dir, etc.)
scoped_ptr<base::Environment> env(base::Environment::Create());
std::string cr_source_root;
if (env->GetVar("CR_SOURCE_ROOT", &cr_source_root)) {
path = FilePath(cr_source_root);
if (file_util::PathExists(path.Append(kThisSourceFile))) {
*result = path;
return true;
} else {
LOG(WARNING) << "CR_SOURCE_ROOT is set, but it appears to not "
<< "point to the correct source root directory.";
}
}
// On POSIX, unit tests execute two levels deep from the source root.
// For example: out/{Debug|Release}/net_unittest
if (PathService::Get(base::DIR_EXE, &path)) {
path = path.DirName().DirName();
if (file_util::PathExists(path.Append(kThisSourceFile))) {
*result = path;
return true;
}
}
// In a case of WebKit-only checkout, executable files are put into
// <root of checkout>/out/{Debug|Release}, and we should return
// <root of checkout>/Source/WebKit/chromium for DIR_SOURCE_ROOT.
if (PathService::Get(base::DIR_EXE, &path)) {
path = path.DirName().DirName().Append("Source/WebKit/chromium");
if (file_util::PathExists(path.Append(kThisSourceFile))) {
*result = path;
return true;
}
}
// If that failed (maybe the build output is symlinked to a different
// drive) try assuming the current directory is the source root.
if (file_util::GetCurrentDirectory(&path) &&
file_util::PathExists(path.Append(kThisSourceFile))) {
*result = path;
return true;
}
LOG(ERROR) << "Couldn't find your source root. "
<< "Try running from your chromium/src directory.";
return false;
}
case base::DIR_CACHE:
scoped_ptr<base::Environment> env(base::Environment::Create());
FilePath cache_dir(base::nix::GetXDGDirectory(env.get(), "XDG_CACHE_HOME",
".cache"));
*result = cache_dir;
return true;
}
return false;
}
} // namespace base
|