xref: /freebsd-src/contrib/llvm-project/clang/lib/InstallAPI/Library.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric //===- Library.cpp --------------------------------------------------------===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric 
9*0fca6ea1SDimitry Andric #include "clang/InstallAPI/Library.h"
10*0fca6ea1SDimitry Andric 
11*0fca6ea1SDimitry Andric using namespace llvm;
12*0fca6ea1SDimitry Andric namespace clang::installapi {
13*0fca6ea1SDimitry Andric 
14*0fca6ea1SDimitry Andric const Regex Rule("(.+)/(.+)\\.framework/");
15*0fca6ea1SDimitry Andric StringRef Library::getFrameworkNameFromInstallName(StringRef InstallName) {
16*0fca6ea1SDimitry Andric   assert(InstallName.contains(".framework") && "expected a framework");
17*0fca6ea1SDimitry Andric   SmallVector<StringRef, 3> Match;
18*0fca6ea1SDimitry Andric   Rule.match(InstallName, &Match);
19*0fca6ea1SDimitry Andric   if (Match.empty())
20*0fca6ea1SDimitry Andric     return "";
21*0fca6ea1SDimitry Andric   return Match.back();
22*0fca6ea1SDimitry Andric }
23*0fca6ea1SDimitry Andric 
24*0fca6ea1SDimitry Andric StringRef Library::getName() const {
25*0fca6ea1SDimitry Andric   assert(!IsUnwrappedDylib && "expected a framework");
26*0fca6ea1SDimitry Andric   StringRef Path = BaseDirectory;
27*0fca6ea1SDimitry Andric 
28*0fca6ea1SDimitry Andric   // Return the framework name extracted from path.
29*0fca6ea1SDimitry Andric   while (!Path.empty()) {
30*0fca6ea1SDimitry Andric     if (Path.ends_with(".framework"))
31*0fca6ea1SDimitry Andric       return sys::path::filename(Path);
32*0fca6ea1SDimitry Andric     Path = sys::path::parent_path(Path);
33*0fca6ea1SDimitry Andric   }
34*0fca6ea1SDimitry Andric 
35*0fca6ea1SDimitry Andric   // Otherwise, return the name of the BaseDirectory.
36*0fca6ea1SDimitry Andric   Path = BaseDirectory;
37*0fca6ea1SDimitry Andric   return sys::path::filename(Path.rtrim("/"));
38*0fca6ea1SDimitry Andric }
39*0fca6ea1SDimitry Andric 
40*0fca6ea1SDimitry Andric } // namespace clang::installapi
41