Remove PathService and base_paths, add simple src/exe_path Change-Id: I65353d1ed955358b368bd114625c1270d86a55c7 Reviewed-on: https://gn-review.googlesource.com/1544 Commit-Queue: Scott Graham <scottmg@chromium.org> Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/base/base_paths.cc b/base/base_paths.cc deleted file mode 100644 index e3f322e..0000000 --- a/base/base_paths.cc +++ /dev/null
@@ -1,51 +0,0 @@ -// Copyright (c) 2006-2008 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 "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/path_service.h" - -namespace base { - -bool PathProvider(int key, FilePath* result) { - // NOTE: DIR_CURRENT is a special case in PathService::Get - - switch (key) { - case DIR_EXE: - if (!PathService::Get(FILE_EXE, result)) - return false; - *result = result->DirName(); - return true; - case DIR_MODULE: - if (!PathService::Get(FILE_MODULE, result)) - return false; - *result = result->DirName(); - return true; - case DIR_ASSETS: - return PathService::Get(DIR_MODULE, result); - case DIR_TEMP: - return GetTempDir(result); - case base::DIR_HOME: - *result = GetHomeDir(); - return true; - case DIR_TEST_DATA: { - FilePath test_data_path; - if (!PathService::Get(DIR_SOURCE_ROOT, &test_data_path)) - return false; - test_data_path = test_data_path.Append(FILE_PATH_LITERAL("base")); - test_data_path = test_data_path.Append(FILE_PATH_LITERAL("test")); - test_data_path = test_data_path.Append(FILE_PATH_LITERAL("data")); - if (!PathExists(test_data_path)) // We don't want to create this. - return false; - *result = test_data_path; - return true; - } - default: - return false; - } -} - -} // namespace base
diff --git a/base/base_paths.h b/base/base_paths.h deleted file mode 100644 index b67e3db..0000000 --- a/base/base_paths.h +++ /dev/null
@@ -1,55 +0,0 @@ -// Copyright (c) 2012 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. - -#ifndef BASE_BASE_PATHS_H_ -#define BASE_BASE_PATHS_H_ - -// This file declares path keys for the base module. These can be used with -// the PathService to access various special directories and files. - -#include "build_config.h" - -#if defined(OS_WIN) -#include "base/base_paths_win.h" -#elif defined(OS_MACOSX) -#include "base/base_paths_mac.h" -#elif defined(OS_ANDROID) -#include "base/base_paths_android.h" -#endif - -#if defined(OS_POSIX) || defined(OS_FUCHSIA) -#include "base/base_paths_posix.h" -#endif - -namespace base { - -enum BasePathKey { - PATH_START = 0, - - DIR_CURRENT, // Current directory. - DIR_EXE, // Directory containing FILE_EXE. - DIR_MODULE, // Directory containing FILE_MODULE. - DIR_ASSETS, // Directory that contains application assets. - DIR_TEMP, // Temporary directory. - DIR_HOME, // User's root home directory. On Windows this will look - // like "C:\Users\<user>" which isn't necessarily a great - // place to put files. - FILE_EXE, // Path and filename of the current executable. - FILE_MODULE, // Path and filename of the module containing the code for - // the PathService (which could differ from FILE_EXE if the - // PathService were compiled into a shared object, for - // example). - DIR_SOURCE_ROOT, // Returns the root of the source tree. This key is useful - // for tests that need to locate various resources. It - // should not be used outside of test code. - DIR_USER_DESKTOP, // The current user's Desktop. - - DIR_TEST_DATA, // Used only for testing. - - PATH_END -}; - -} // namespace base - -#endif // BASE_BASE_PATHS_H_
diff --git a/base/base_paths_mac.h b/base/base_paths_mac.h deleted file mode 100644 index ac75402..0000000 --- a/base/base_paths_mac.h +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright (c) 2006-2008 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. - -#ifndef BASE_BASE_PATHS_MAC_H_ -#define BASE_BASE_PATHS_MAC_H_ - -// This file declares Mac-specific path keys for the base module. -// These can be used with the PathService to access various special -// directories and files. - -namespace base { - -enum { - PATH_MAC_START = 200, - - DIR_APP_DATA, // ~/Library/Application Support - - PATH_MAC_END -}; - -} // namespace base - -#endif // BASE_BASE_PATHS_MAC_H_
diff --git a/base/base_paths_mac.mm b/base/base_paths_mac.mm deleted file mode 100644 index 6eb6e07..0000000 --- a/base/base_paths_mac.mm +++ /dev/null
@@ -1,127 +0,0 @@ -// Copyright (c) 2012 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. - -// Defines base::PathProviderMac which replaces base::PathProviderPosix for Mac -// in base/path_service.cc. - -#include <dlfcn.h> -#import <Foundation/Foundation.h> -#include <mach-o/dyld.h> -#include <stdint.h> - -#include "base/base_paths.h" -#include "base/compiler_specific.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/mac/bundle_locations.h" -#include "base/mac/foundation_util.h" -#include "base/path_service.h" -#include "base/strings/string_util.h" -#include "base/threading/thread_restrictions.h" -#include "build_config.h" - -namespace { - -void GetNSExecutablePath(base::FilePath* path) { - DCHECK(path); - // Executable path can have relative references ("..") depending on - // how the app was launched. - uint32_t executable_length = 0; - _NSGetExecutablePath(NULL, &executable_length); - DCHECK_GT(executable_length, 1u); - std::string executable_path; - int rv = _NSGetExecutablePath( - base::WriteInto(&executable_path, executable_length), - &executable_length); - DCHECK_EQ(rv, 0); - - // _NSGetExecutablePath may return paths containing ./ or ../ which makes - // FilePath::DirName() work incorrectly, convert it to absolute path so that - // paths such as DIR_SOURCE_ROOT can work, since we expect absolute paths to - // be returned here. - // TODO(bauerb): http://crbug.com/259796, http://crbug.com/373477 - base::ThreadRestrictions::ScopedAllowIO allow_io; - *path = base::MakeAbsoluteFilePath(base::FilePath(executable_path)); -} - -// Returns true if the module for |address| is found. |path| will contain -// the path to the module. Note that |path| may not be absolute. -bool GetModulePathForAddress(base::FilePath* path, - const void* address) WARN_UNUSED_RESULT; - -bool GetModulePathForAddress(base::FilePath* path, const void* address) { - Dl_info info; - if (dladdr(address, &info) == 0) - return false; - *path = base::FilePath(info.dli_fname); - return true; -} - -} // namespace - -namespace base { - -bool PathProviderMac(int key, base::FilePath* result) { - switch (key) { - case base::FILE_EXE: - GetNSExecutablePath(result); - return true; - case base::FILE_MODULE: - return GetModulePathForAddress(result, - reinterpret_cast<const void*>(&base::PathProviderMac)); - case base::DIR_APP_DATA: { - bool success = base::mac::GetUserDirectory(NSApplicationSupportDirectory, - result); -#if defined(OS_IOS) - // On IOS, this directory does not exist unless it is created explicitly. - if (success && !base::PathExists(*result)) - success = base::CreateDirectory(*result); -#endif // defined(OS_IOS) - return success; - } - case base::DIR_SOURCE_ROOT: - // Go through PathService to catch overrides. - if (!PathService::Get(base::FILE_EXE, result)) - return false; - - // Start with the executable's directory. - *result = result->DirName(); - -#if !defined(OS_IOS) - if (base::mac::AmIBundled()) { - // The bundled app executables (Chromium, TestShell, etc) live five - // levels down, eg: - // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium - *result = result->DirName().DirName().DirName().DirName().DirName(); - } else { - // Unit tests execute two levels deep from the source root, eg: - // src/xcodebuild/{Debug|Release}/base_unittests - *result = result->DirName().DirName(); - } -#endif - return true; - case base::DIR_USER_DESKTOP: -#if defined(OS_IOS) - // iOS does not have desktop directories. - NOTIMPLEMENTED(); - return false; -#else - return base::mac::GetUserDirectory(NSDesktopDirectory, result); -#endif - case base::DIR_ASSETS: - if (!base::mac::AmIBundled()) { - return PathService::Get(base::DIR_MODULE, result); - } - *result = base::mac::FrameworkBundlePath().Append( - FILE_PATH_LITERAL("Resources")); - return true; - case base::DIR_CACHE: - return base::mac::GetUserDirectory(NSCachesDirectory, result); - default: - return false; - } -} - -} // namespace base
diff --git a/base/base_paths_posix.cc b/base/base_paths_posix.cc deleted file mode 100644 index 2319755..0000000 --- a/base/base_paths_posix.cc +++ /dev/null
@@ -1,108 +0,0 @@ -// Copyright (c) 2012 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. - -// Defines base::PathProviderPosix, default path provider on POSIX OSes that -// don't have their own base_paths_OS.cc implementation (i.e. all but Mac and -// Android). - -#include "base/base_paths.h" - -#include <limits.h> -#include <stddef.h> - -#include <memory> -#include <ostream> -#include <string> - -#include "base/environment.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/path_service.h" -#include "base/process/process_metrics.h" -#include "build_config.h" - -#if defined(OS_FREEBSD) -#include <sys/param.h> -#include <sys/sysctl.h> -#elif defined(OS_SOLARIS) || defined(OS_AIX) -#include <stdlib.h> -#endif - -namespace base { - -bool PathProviderPosix(int key, FilePath* result) { - switch (key) { - case FILE_EXE: - case FILE_MODULE: { // TODO(evanm): is this correct? -#if defined(OS_LINUX) - FilePath bin_dir; - if (!ReadSymbolicLink(FilePath(kProcSelfExe), &bin_dir)) { - NOTREACHED() << "Unable to resolve " << kProcSelfExe << "."; - 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); - // Upon return, |length| is the number of bytes written to |bin_dir| - // including the string terminator. - int error = sysctl(name, 4, bin_dir, &length, NULL, 0); - if (error < 0 || length <= 1) { - NOTREACHED() << "Unable to resolve path."; - return false; - } - *result = FilePath(FilePath::StringType(bin_dir, length - 1)); - 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) || defined(OS_AIX) - // There is currently no way to get the executable path on OpenBSD - char* cpath; - if ((cpath = getenv("CHROME_EXE_PATH")) != NULL) - *result = FilePath(cpath); - else - *result = FilePath("/usr/local/chrome/chrome"); - return true; -#endif - } - case DIR_SOURCE_ROOT: { - // Allow passing this in the environment, for more flexibility in build - // tree configurations (sub-project builds, gyp --output_dir, etc.) - std::unique_ptr<Environment> env(Environment::Create()); - std::string cr_source_root; - FilePath path; - if (env->GetVar("CR_SOURCE_ROOT", &cr_source_root)) { - path = FilePath(cr_source_root); - if (PathExists(path)) { - *result = path; - return true; - } - DLOG(WARNING) << "CR_SOURCE_ROOT is set, but it appears to not " - << "point to a directory."; - } - // On POSIX, unit tests execute two levels deep from the source root. - // For example: out/{Debug|Release}/net_unittest - if (PathService::Get(DIR_EXE, &path)) { - *result = path.DirName().DirName(); - return true; - } - - DLOG(ERROR) << "Couldn't find your source root. " - << "Try running from your chromium/src directory."; - return false; - } - } - return false; -} - -} // namespace base
diff --git a/base/base_paths_posix.h b/base/base_paths_posix.h deleted file mode 100644 index ef002ae..0000000 --- a/base/base_paths_posix.h +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright (c) 2012 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. - -#ifndef BASE_BASE_PATHS_POSIX_H_ -#define BASE_BASE_PATHS_POSIX_H_ - -// This file declares windows-specific path keys for the base module. -// These can be used with the PathService to access various special -// directories and files. - -namespace base { - -enum { - PATH_POSIX_START = 400, - - DIR_CACHE, // Directory where to put cache data. Note this is - // *not* where the browser cache lives, but the - // browser cache can be a subdirectory. - // This is $XDG_CACHE_HOME on Linux and - // ~/Library/Caches on Mac. - PATH_POSIX_END -}; - -} // namespace base - -#endif // BASE_BASE_PATHS_POSIX_H_
diff --git a/base/base_paths_win.cc b/base/base_paths_win.cc deleted file mode 100644 index e7e5d1f..0000000 --- a/base/base_paths_win.cc +++ /dev/null
@@ -1,202 +0,0 @@ -// Copyright (c) 2012 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 <windows.h> -#include <KnownFolders.h> -#include <shlobj.h> - -#include "base/base_paths.h" -#include "base/environment.h" -#include "base/files/file_path.h" -#include "base/path_service.h" -#include "base/strings/utf_string_conversions.h" -#include "base/win/current_module.h" -#include "base/win/scoped_co_mem.h" -#include "base/win/windows_version.h" - -using base::FilePath; - -namespace base { - -bool PathProviderWin(int key, FilePath* result) { - // We need to go compute the value. It would be nice to support paths with - // names longer than MAX_PATH, but the system functions don't seem to be - // designed for it either, with the exception of GetTempPath (but other - // things will surely break if the temp path is too long, so we don't bother - // handling it. - wchar_t system_buffer[MAX_PATH]; - system_buffer[0] = 0; - - FilePath cur; - switch (key) { - case base::FILE_EXE: - if (GetModuleFileName(NULL, system_buffer, MAX_PATH) == 0) - return false; - cur = FilePath(system_buffer); - break; - case base::FILE_MODULE: { - // the resource containing module is assumed to be the one that - // this code lives in, whether that's a dll or exe - if (GetModuleFileName(CURRENT_MODULE(), system_buffer, MAX_PATH) == 0) - return false; - cur = FilePath(system_buffer); - break; - } - case base::DIR_WINDOWS: - GetWindowsDirectory(system_buffer, MAX_PATH); - cur = FilePath(system_buffer); - break; - case base::DIR_SYSTEM: - GetSystemDirectory(system_buffer, MAX_PATH); - cur = FilePath(system_buffer); - break; - case base::DIR_PROGRAM_FILESX86: - if (base::win::OSInfo::GetInstance()->architecture() != - base::win::OSInfo::X86_ARCHITECTURE) { - if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - } - // Fall through to base::DIR_PROGRAM_FILES if we're on an X86 machine. - FALLTHROUGH; - case base::DIR_PROGRAM_FILES: - if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_PROGRAM_FILES6432: -#if !defined(_WIN64) - if (base::win::OSInfo::GetInstance()->wow64_status() == - base::win::OSInfo::WOW64_ENABLED) { - std::unique_ptr<base::Environment> env(base::Environment::Create()); - std::string programfiles_w6432; - // 32-bit process running in WOW64 sets ProgramW6432 environment - // variable. See - // https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx. - if (!env->GetVar("ProgramW6432", &programfiles_w6432)) - return false; - // GetVar returns UTF8 - convert back to Wide. - cur = FilePath(UTF8ToWide(programfiles_w6432)); - break; - } -#endif - if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_IE_INTERNET_CACHE: - if (FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_COMMON_START_MENU: - if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_START_MENU: - if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_APP_DATA: - if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, - system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_COMMON_APP_DATA: - if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_LOCAL_APP_DATA: - if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) - return false; - cur = FilePath(system_buffer); - break; - case base::DIR_SOURCE_ROOT: { - FilePath executableDir; - // On Windows, unit tests execute two levels deep from the source root. - // For example: chrome/{Debug|Release}/ui_tests.exe - PathService::Get(base::DIR_EXE, &executableDir); - cur = executableDir.DirName().DirName(); - break; - } - case base::DIR_APP_SHORTCUTS: { - if (win::GetVersion() < win::VERSION_WIN8) - return false; - - base::win::ScopedCoMem<wchar_t> path_buf; - if (FAILED(SHGetKnownFolderPath(FOLDERID_ApplicationShortcuts, 0, NULL, - &path_buf))) - return false; - - cur = FilePath(string16(path_buf)); - break; - } - case base::DIR_USER_DESKTOP: - if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) { - return false; - } - cur = FilePath(system_buffer); - break; - case base::DIR_COMMON_DESKTOP: - if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, - SHGFP_TYPE_CURRENT, system_buffer))) { - return false; - } - cur = FilePath(system_buffer); - break; - case base::DIR_USER_QUICK_LAUNCH: - if (!PathService::Get(base::DIR_APP_DATA, &cur)) - return false; - // According to various sources, appending - // "Microsoft\Internet Explorer\Quick Launch" to %appdata% is the only - // reliable way to get the quick launch folder across all versions of - // Windows. - // http://stackoverflow.com/questions/76080/how-do-you-reliably-get-the-quick- - // http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx - cur = cur.Append(FILE_PATH_LITERAL("Microsoft")) - .Append(FILE_PATH_LITERAL("Internet Explorer")) - .Append(FILE_PATH_LITERAL("Quick Launch")); - break; - case base::DIR_TASKBAR_PINS: - if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur)) - return false; - cur = cur.Append(FILE_PATH_LITERAL("User Pinned")) - .Append(FILE_PATH_LITERAL("TaskBar")); - break; - case base::DIR_IMPLICIT_APP_SHORTCUTS: - if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur)) - return false; - cur = cur.Append(FILE_PATH_LITERAL("User Pinned")) - .Append(FILE_PATH_LITERAL("ImplicitAppShortcuts")); - break; - case base::DIR_WINDOWS_FONTS: - if (FAILED(SHGetFolderPath( - NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, system_buffer))) { - return false; - } - cur = FilePath(system_buffer); - break; - default: - return false; - } - - *result = cur; - return true; -} - -} // namespace base
diff --git a/base/base_paths_win.h b/base/base_paths_win.h deleted file mode 100644 index 2db16a6..0000000 --- a/base/base_paths_win.h +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright (c) 2012 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. - -#ifndef BASE_BASE_PATHS_WIN_H_ -#define BASE_BASE_PATHS_WIN_H_ - -// This file declares windows-specific path keys for the base module. -// These can be used with the PathService to access various special -// directories and files. - -namespace base { - -enum { - PATH_WIN_START = 100, - - DIR_WINDOWS, // Windows directory, usually "c:\windows" - DIR_SYSTEM, // Usually c:\windows\system32" - // 32-bit 32-bit on 64-bit 64-bit on 64-bit - // DIR_PROGRAM_FILES 1 2 1 - // DIR_PROGRAM_FILESX86 1 2 2 - // DIR_PROGRAM_FILES6432 1 1 1 - // 1 - C:\Program Files 2 - C:\Program Files (x86) - DIR_PROGRAM_FILES, // See table above. - DIR_PROGRAM_FILESX86, // See table above. - DIR_PROGRAM_FILES6432, // See table above. - - DIR_IE_INTERNET_CACHE, // Temporary Internet Files directory. - DIR_COMMON_START_MENU, // Usually "C:\ProgramData\Microsoft\Windows\ - // Start Menu\Programs" - DIR_START_MENU, // Usually "C:\Users\<user>\AppData\Roaming\ - // Microsoft\Windows\Start Menu\Programs" - DIR_APP_DATA, // Application Data directory under the user - // profile. - DIR_LOCAL_APP_DATA, // "Local Settings\Application Data" directory - // under the user profile. - DIR_COMMON_APP_DATA, // Usually "C:\ProgramData". - DIR_APP_SHORTCUTS, // Where tiles on the start screen are stored, - // only for Windows 8. Maps to "Local\AppData\ - // Microsoft\Windows\Application Shortcuts\". - DIR_COMMON_DESKTOP, // Directory for the common desktop (visible - // on all user's Desktop). - DIR_USER_QUICK_LAUNCH, // Directory for the quick launch shortcuts. - DIR_TASKBAR_PINS, // Directory for the shortcuts pinned to taskbar. - DIR_IMPLICIT_APP_SHORTCUTS, // The implicit user pinned shortcut directory. - DIR_WINDOWS_FONTS, // Usually C:\Windows\Fonts. - - PATH_WIN_END -}; - -} // namespace base - -#endif // BASE_BASE_PATHS_WIN_H_
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc index 0ecbc13..ac327c3 100644 --- a/base/files/file_util_posix.cc +++ b/base/files/file_util_posix.cc
@@ -31,7 +31,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/singleton.h" -#include "base/path_service.h" #include "base/posix/eintr_wrapper.h" #include "base/stl_util.h" #include "base/strings/string_split.h" @@ -616,12 +615,8 @@ return true; } -#if defined(OS_ANDROID) - return PathService::Get(DIR_CACHE, path); -#else *path = FilePath("/tmp"); return true; -#endif } #endif // !defined(OS_MACOSX)
diff --git a/base/path_service.cc b/base/path_service.cc deleted file mode 100644 index 2843dce..0000000 --- a/base/path_service.cc +++ /dev/null
@@ -1,339 +0,0 @@ -// Copyright (c) 2012 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/path_service.h" - -#include <unordered_map> - -#if defined(OS_WIN) -#include <windows.h> -#include <shellapi.h> -#include <shlobj.h> -#endif - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/synchronization/lock.h" -#include "build_config.h" - -namespace base { - -bool PathProvider(int key, FilePath* result); - -#if defined(OS_WIN) -bool PathProviderWin(int key, FilePath* result); -#elif defined(OS_MACOSX) -bool PathProviderMac(int key, FilePath* result); -#elif defined(OS_ANDROID) -bool PathProviderAndroid(int key, FilePath* result); -#elif defined(OS_FUCHSIA) -bool PathProviderFuchsia(int key, FilePath* result); -#elif defined(OS_POSIX) -// PathProviderPosix is the default path provider on POSIX OSes other than -// Mac and Android. -bool PathProviderPosix(int key, FilePath* result); -#endif - -namespace { - -typedef std::unordered_map<int, FilePath> PathMap; - -// We keep a linked list of providers. In a debug build we ensure that no two -// providers claim overlapping keys. -struct Provider { - PathService::ProviderFunc func; - struct Provider* next; -#ifndef NDEBUG - int key_start; - int key_end; -#endif - bool is_static; -}; - -Provider base_provider = {PathProvider, nullptr, -#ifndef NDEBUG - PATH_START, PATH_END, -#endif - true}; - -#if defined(OS_WIN) -Provider base_provider_win = { - PathProviderWin, - &base_provider, -#ifndef NDEBUG - PATH_WIN_START, - PATH_WIN_END, -#endif - true -}; -#endif - -#if defined(OS_MACOSX) -Provider base_provider_mac = { - PathProviderMac, - &base_provider, -#ifndef NDEBUG - PATH_MAC_START, - PATH_MAC_END, -#endif - true -}; -#endif - -#if defined(OS_ANDROID) -Provider base_provider_android = { - PathProviderAndroid, - &base_provider, -#ifndef NDEBUG - PATH_ANDROID_START, - PATH_ANDROID_END, -#endif - true -}; -#endif - -#if defined(OS_FUCHSIA) -Provider base_provider_fuchsia = {PathProviderFuchsia, &base_provider, -#ifndef NDEBUG - 0, 0, -#endif - true}; -#endif - -#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && \ - !defined(OS_FUCHSIA) -Provider base_provider_posix = { - PathProviderPosix, - &base_provider, -#ifndef NDEBUG - PATH_POSIX_START, - PATH_POSIX_END, -#endif - true -}; -#endif - - -struct PathData { - Lock lock; - PathMap cache; // Cache mappings from path key to path value. - PathMap overrides; // Track path overrides. - Provider* providers; // Linked list of path service providers. - bool cache_disabled; // Don't use cache if true; - - PathData() : cache_disabled(false) { -#if defined(OS_WIN) - providers = &base_provider_win; -#elif defined(OS_MACOSX) - providers = &base_provider_mac; -#elif defined(OS_ANDROID) - providers = &base_provider_android; -#elif defined(OS_FUCHSIA) - providers = &base_provider_fuchsia; -#elif defined(OS_POSIX) - providers = &base_provider_posix; -#endif - } -}; - -static PathData* GetPathData() { - static auto* path_data = new PathData(); - return path_data; -} - -// Tries to find |key| in the cache. |path_data| should be locked by the caller! -bool LockedGetFromCache(int key, const PathData* path_data, FilePath* result) { - if (path_data->cache_disabled) - return false; - // check for a cached version - PathMap::const_iterator it = path_data->cache.find(key); - if (it != path_data->cache.end()) { - *result = it->second; - return true; - } - return false; -} - -// Tries to find |key| in the overrides map. |path_data| should be locked by the -// caller! -bool LockedGetFromOverrides(int key, PathData* path_data, FilePath* result) { - // check for an overridden version. - PathMap::const_iterator it = path_data->overrides.find(key); - if (it != path_data->overrides.end()) { - if (!path_data->cache_disabled) - path_data->cache[key] = it->second; - *result = it->second; - return true; - } - return false; -} - -} // namespace - -// TODO(brettw): this function does not handle long paths (filename > MAX_PATH) -// characters). This isn't supported very well by Windows right now, so it is -// moot, but we should keep this in mind for the future. -// static -bool PathService::Get(int key, FilePath* result) { - PathData* path_data = GetPathData(); - DCHECK(path_data); - DCHECK(result); - DCHECK_GE(key, DIR_CURRENT); - - // special case the current directory because it can never be cached - if (key == DIR_CURRENT) - return GetCurrentDirectory(result); - - Provider* provider = nullptr; - { - AutoLock scoped_lock(path_data->lock); - if (LockedGetFromCache(key, path_data, result)) - return true; - - if (LockedGetFromOverrides(key, path_data, result)) - return true; - - // Get the beginning of the list while it is still locked. - provider = path_data->providers; - } - - FilePath path; - - // Iterating does not need the lock because only the list head might be - // modified on another thread. - while (provider) { - if (provider->func(key, &path)) - break; - DCHECK(path.empty()) << "provider should not have modified path"; - provider = provider->next; - } - - if (path.empty()) - return false; - - if (path.ReferencesParent()) { - // Make sure path service never returns a path with ".." in it. - path = MakeAbsoluteFilePath(path); - if (path.empty()) - return false; - } - *result = path; - - AutoLock scoped_lock(path_data->lock); - if (!path_data->cache_disabled) - path_data->cache[key] = path; - - return true; -} - -// static -bool PathService::Override(int key, const FilePath& path) { - // Just call the full function with true for the value of |create|, and - // assume that |path| may not be absolute yet. - return OverrideAndCreateIfNeeded(key, path, false, true); -} - -// static -bool PathService::OverrideAndCreateIfNeeded(int key, - const FilePath& path, - bool is_absolute, - bool create) { - PathData* path_data = GetPathData(); - DCHECK(path_data); - DCHECK_GT(key, DIR_CURRENT) << "invalid path key"; - - FilePath file_path = path; - - // For some locations this will fail if called from inside the sandbox there- - // fore we protect this call with a flag. - if (create) { - // Make sure the directory exists. We need to do this before we translate - // this to the absolute path because on POSIX, MakeAbsoluteFilePath fails - // if called on a non-existent path. - if (!PathExists(file_path) && !CreateDirectory(file_path)) - return false; - } - - // We need to have an absolute path. - if (!is_absolute) { - file_path = MakeAbsoluteFilePath(file_path); - if (file_path.empty()) - return false; - } - DCHECK(file_path.IsAbsolute()); - - AutoLock scoped_lock(path_data->lock); - - // Clear the cache now. Some of its entries could have depended - // on the value we are overriding, and are now out of sync with reality. - path_data->cache.clear(); - - path_data->overrides[key] = file_path; - - return true; -} - -// static -bool PathService::RemoveOverride(int key) { - PathData* path_data = GetPathData(); - DCHECK(path_data); - - AutoLock scoped_lock(path_data->lock); - - if (path_data->overrides.find(key) == path_data->overrides.end()) - return false; - - // Clear the cache now. Some of its entries could have depended on the value - // we are going to remove, and are now out of sync. - path_data->cache.clear(); - - path_data->overrides.erase(key); - - return true; -} - -// static -void PathService::RegisterProvider(ProviderFunc func, int key_start, - int key_end) { - PathData* path_data = GetPathData(); - DCHECK(path_data); - DCHECK_GT(key_end, key_start); - - Provider* p; - - p = new Provider; - p->is_static = false; - p->func = func; -#ifndef NDEBUG - p->key_start = key_start; - p->key_end = key_end; -#endif - - AutoLock scoped_lock(path_data->lock); - -#ifndef NDEBUG - Provider *iter = path_data->providers; - while (iter) { - DCHECK(key_start >= iter->key_end || key_end <= iter->key_start) << - "path provider collision"; - iter = iter->next; - } -#endif - - p->next = path_data->providers; - path_data->providers = p; -} - -// static -void PathService::DisableCache() { - PathData* path_data = GetPathData(); - DCHECK(path_data); - - AutoLock scoped_lock(path_data->lock); - path_data->cache.clear(); - path_data->cache_disabled = true; -} - -} // namespace base
diff --git a/base/path_service.h b/base/path_service.h deleted file mode 100644 index f92fead..0000000 --- a/base/path_service.h +++ /dev/null
@@ -1,94 +0,0 @@ -// Copyright (c) 2012 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. - -#ifndef BASE_PATH_SERVICE_H_ -#define BASE_PATH_SERVICE_H_ - -#include <string> - -#include "base/base_export.h" -#include "base/base_paths.h" -#include "base/gtest_prod_util.h" -#include "build_config.h" - -namespace base { - -class FilePath; -class ScopedPathOverride; - -// The path service is a global table mapping keys to file system paths. It is -// OK to use this service from multiple threads. -// -class BASE_EXPORT PathService { - public: - // Retrieves a path to a special directory or file and places it into the - // string pointed to by 'path'. If you ask for a directory it is guaranteed - // to NOT have a path separator at the end. For example, "c:\windows\temp" - // Directories are also guaranteed to exist when this function succeeds. - // - // Returns true if the directory or file was successfully retrieved. On - // failure, 'path' will not be changed. - static bool Get(int key, FilePath* path); - - // Overrides the path to a special directory or file. This cannot be used to - // change the value of DIR_CURRENT, but that should be obvious. Also, if the - // path specifies a directory that does not exist, the directory will be - // created by this method. This method returns true if successful. - // - // If the given path is relative, then it will be resolved against - // DIR_CURRENT. - // - // WARNING: Consumers of PathService::Get may expect paths to be constant - // over the lifetime of the app, so this method should be used with caution. - // - // Unit tests generally should use ScopedPathOverride instead. Overrides from - // one test should not carry over to another. - static bool Override(int key, const FilePath& path); - - // This function does the same as PathService::Override but it takes extra - // parameters: - // - |is_absolute| indicates that |path| has already been expanded into an - // absolute path, otherwise MakeAbsoluteFilePath() will be used. This is - // useful to override paths that may not exist yet, since MakeAbsoluteFilePath - // fails for those. Note that MakeAbsoluteFilePath also expands symbolic - // links, even if path.IsAbsolute() is already true. - // - |create| guides whether the directory to be overriden must - // be created in case it doesn't exist already. - static bool OverrideAndCreateIfNeeded(int key, - const FilePath& path, - bool is_absolute, - bool create); - - // To extend the set of supported keys, you can register a path provider, - // which is just a function mirroring PathService::Get. The ProviderFunc - // returns false if it cannot provide a non-empty path for the given key. - // Otherwise, true is returned. - // - // WARNING: This function could be called on any thread from which the - // PathService is used, so a the ProviderFunc MUST BE THREADSAFE. - // - typedef bool (*ProviderFunc)(int, FilePath*); - - // Call to register a path provider. You must specify the range "[key_start, - // key_end)" of supported path keys. - static void RegisterProvider(ProviderFunc provider, - int key_start, - int key_end); - - // Disable internal cache. - static void DisableCache(); - - private: - friend class ScopedPathOverride; - FRIEND_TEST_ALL_PREFIXES(PathServiceTest, RemoveOverride); - - // Removes an override for a special directory or file. Returns true if there - // was an override to remove or false if none was present. - // NOTE: This function is intended to be used by tests only! - static bool RemoveOverride(int key); -}; - -} // namespace base - -#endif // BASE_PATH_SERVICE_H_
diff --git a/build/gen.py b/build/gen.py index 90fe58a..02278d1 100755 --- a/build/gen.py +++ b/build/gen.py
@@ -226,7 +226,6 @@ static_libraries = { 'base': {'sources': [ 'base/at_exit.cc', - 'base/base_paths.cc', 'base/base_switches.cc', 'base/callback_helpers.cc', 'base/callback_internal.cc', @@ -261,7 +260,6 @@ 'base/message_loop/message_pump_default.cc', 'base/message_loop/watchable_io_message_pump_posix.cc', 'base/observer_list_threadsafe.cc', - 'base/path_service.cc', 'base/pending_task.cc', 'base/process/kill.cc', 'base/process/memory.cc', @@ -334,6 +332,7 @@ 'base/values.cc', ], 'tool': 'cxx', 'include_dirs': []}, 'gn_lib': {'sources': [ + 'src/exe_path.cc', 'tools/gn/action_target_generator.cc', 'tools/gn/action_values.cc', 'tools/gn/analyzer.cc', @@ -536,7 +535,6 @@ if is_posix: static_libraries['base']['sources'].extend([ - 'base/base_paths_posix.cc', 'base/files/file_enumerator_posix.cc', 'base/files/file_descriptor_watcher_posix.cc', 'base/files/file_posix.cc', @@ -615,7 +613,6 @@ if is_mac: static_libraries['base']['sources'].extend([ - 'base/base_paths_mac.mm', 'base/files/file_util_mac.mm', 'base/mac/bundle_locations.mm', 'base/mac/call_with_eh_frame.cc', @@ -654,7 +651,6 @@ if is_win: static_libraries['base']['sources'].extend([ - 'base/base_paths_win.cc', 'base/cpu.cc', 'base/files/file_enumerator_win.cc', 'base/files/file_path_watcher_win.cc',
diff --git a/src/exe_path.cc b/src/exe_path.cc new file mode 100644 index 0000000..84f9aba --- /dev/null +++ b/src/exe_path.cc
@@ -0,0 +1,50 @@ +// Copyright 2018 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 "exe_path.h" + +#include "base/files/file_util.h" +#include "base/logging.h" +#include "base/strings/string_util.h" +#include "build_config.h" + +#if defined(OS_MACOSX) +#include <mach-o/dyld.h> + +base::FilePath GetExePath() { + // Executable path can have relative references ("..") depending on + // how the app was launched. + uint32_t executable_length = 0; + _NSGetExecutablePath(NULL, &executable_length); + DCHECK_GT(executable_length, 1u); + std::string executable_path; + int rv = _NSGetExecutablePath( + base::WriteInto(&executable_path, executable_length), + &executable_length); + DCHECK_EQ(rv, 0); + + // _NSGetExecutablePath may return paths containing ./ or ../ which makes + // FilePath::DirName() work incorrectly, convert it to absolute path so that + // paths such as DIR_SOURCE_ROOT can work, since we expect absolute paths to + // be returned here. + return base::MakeAbsoluteFilePath(base::FilePath(executable_path)); +} + +#elif defined(OS_WIN) + +#error + +#else + +base::FilePath GetExePath() { + base::FilePath result; + const char kProcSelfExe[] = "/proc/self/exe"; + if (!ReadSymbolicLink(base::FilePath(kProcSelfExe), &result)) { + NOTREACHED() << "Unable to resolve " << kProcSelfExe << "."; + return base::FilePath(); + } + return result; +} + +#endif
diff --git a/src/exe_path.h b/src/exe_path.h new file mode 100644 index 0000000..0c9d395 --- /dev/null +++ b/src/exe_path.h
@@ -0,0 +1,12 @@ +// Copyright 2018 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. + +#ifndef EXE_PATH_H_ +#define EXE_PATH_H_ + +#include "base/files/file_path.h" + +base::FilePath GetExePath(); + +#endif // EXE_PATH_H_
diff --git a/tools/gn/command_format_unittest.cc b/tools/gn/command_format_unittest.cc index f0dd0ea..df24425 100644 --- a/tools/gn/command_format_unittest.cc +++ b/tools/gn/command_format_unittest.cc
@@ -5,8 +5,8 @@ #include "tools/gn/command_format.h" #include "base/files/file_util.h" -#include "base/path_service.h" #include "base/strings/string_util.h" +#include "exe_path.h" #include "test/test.h" #include "tools/gn/commands.h" #include "tools/gn/setup.h" @@ -19,6 +19,8 @@ ::Setup setup; \ std::string out; \ std::string expected; \ + base::FilePath src_dir = GetExePath().DirName().Append(".."); \ + base::SetCurrentDirectory(src_dir); \ EXPECT_TRUE(commands::FormatFileToString( \ &setup, SourceFile("//tools/gn/format_test_data/" #n ".gn"), false, \ &out)); \
diff --git a/tools/gn/ninja_build_writer.cc b/tools/gn/ninja_build_writer.cc index 3af49dd..0f40226 100644 --- a/tools/gn/ninja_build_writer.cc +++ b/tools/gn/ninja_build_writer.cc
@@ -12,11 +12,11 @@ #include "base/command_line.h" #include "base/files/file_util.h" -#include "base/path_service.h" #include "base/process/process_handle.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "build_config.h" +#include "exe_path.h" #include "tools/gn/build_settings.h" #include "tools/gn/builder.h" #include "tools/gn/err.h" @@ -51,8 +51,7 @@ const base::FilePath build_path = build_settings->build_dir().Resolve(build_settings->root_path()); - base::FilePath exe_path; - base::PathService::Get(base::FILE_EXE, &exe_path); + base::FilePath exe_path = GetExePath(); if (build_path.IsAbsolute()) exe_path = MakeAbsoluteFilePathRelativeIfPossible(build_path, exe_path);