1 //===-- llvm-config.cpp - LLVM project configuration utility --------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This tool encapsulates information about an LLVM project configuration for
10 // use by other project's build environments (to determine installed path,
11 // available features, required libraries, etc.).
13 // Note that although this tool *may* be used by some parts of LLVM's build
14 // itself (i.e., the Makefiles use it to compute required libraries when linking
15 // tools), this tool is primarily designed to support external projects.
17 //===----------------------------------------------------------------------===//
19 #include "llvm/Config/llvm-config.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include "llvm/ADT/StringMap.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/ADT/Twine.h"
24 #include "llvm/Config/config.h"
25 #include "llvm/Support/FileSystem.h"
26 #include "llvm/Support/Path.h"
27 #include "llvm/Support/WithColor.h"
28 #include "llvm/Support/raw_ostream.h"
29 #include "llvm/TargetParser/Triple.h"
32 #include <unordered_set>
37 // Include the build time variables we can report to the user. This is generated
38 // at build time from the BuildVariables.inc.in file by the build system.
39 #include "BuildVariables.inc"
41 // Include the component table. This creates an array of struct
42 // AvailableComponent entries, which record the component name, library name,
43 // and required components for all of the available libraries.
45 // Not all components define a library, we also use "library groups" as a way to
46 // create entries for pseudo groups like x86 or all-targets.
47 #include "LibraryDependencies.inc"
49 // Built-in extensions also register their dependencies, but in a separate file,
50 // later in the process.
51 #include "ExtensionDependencies.inc"
53 // LinkMode determines what libraries and flags are returned by llvm-config.
55 // LinkModeAuto will link with the default link mode for the installation,
56 // which is dependent on the value of LLVM_LINK_LLVM_DYLIB, and fall back
57 // to the alternative if the required libraries are not available.
60 // LinkModeShared will link with the dynamic component libraries if they
61 // exist, and return an error otherwise.
64 // LinkModeStatic will link with the static component libraries if they
65 // exist, and return an error otherwise.
69 /// Traverse a single component adding to the topological ordering in
70 /// \arg RequiredLibs.
72 /// \param Name - The component to traverse.
73 /// \param ComponentMap - A prebuilt map of component names to descriptors.
74 /// \param VisitedComponents [in] [out] - The set of already visited components.
75 /// \param RequiredLibs [out] - The ordered list of required
77 /// \param GetComponentNames - Get the component names instead of the
79 static void VisitComponent(const std::string
&Name
,
80 const StringMap
<AvailableComponent
*> &ComponentMap
,
81 std::set
<AvailableComponent
*> &VisitedComponents
,
82 std::vector
<std::string
> &RequiredLibs
,
83 bool IncludeNonInstalled
, bool GetComponentNames
,
84 const std::function
<std::string(const StringRef
&)>
85 *GetComponentLibraryPath
,
86 std::vector
<std::string
> *Missing
,
87 const std::string
&DirSep
) {
88 // Lookup the component.
89 AvailableComponent
*AC
= ComponentMap
.lookup(Name
);
91 errs() << "Can't find component: '" << Name
<< "' in the map. Available components are: ";
92 for (const auto &Component
: ComponentMap
) {
93 errs() << "'" << Component
.first() << "' ";
96 report_fatal_error("abort");
98 assert(AC
&& "Invalid component name!");
100 // Add to the visited table.
101 if (!VisitedComponents
.insert(AC
).second
) {
102 // We are done if the component has already been visited.
106 // Only include non-installed components if requested.
107 if (!AC
->IsInstalled
&& !IncludeNonInstalled
)
110 // Otherwise, visit all the dependencies.
111 for (unsigned i
= 0; AC
->RequiredLibraries
[i
]; ++i
) {
112 VisitComponent(AC
->RequiredLibraries
[i
], ComponentMap
, VisitedComponents
,
113 RequiredLibs
, IncludeNonInstalled
, GetComponentNames
,
114 GetComponentLibraryPath
, Missing
, DirSep
);
117 // Special handling for the special 'extensions' component. Its content is
118 // not populated by llvm-build, but later in the process and loaded from
119 // ExtensionDependencies.inc.
120 if (Name
== "extensions") {
121 for (auto const &AvailableExtension
: AvailableExtensions
) {
122 for (const char *const *Iter
= &AvailableExtension
.RequiredLibraries
[0];
124 AvailableComponent
*AC
= ComponentMap
.lookup(*Iter
);
126 RequiredLibs
.push_back(*Iter
);
128 VisitComponent(*Iter
, ComponentMap
, VisitedComponents
, RequiredLibs
,
129 IncludeNonInstalled
, GetComponentNames
,
130 GetComponentLibraryPath
, Missing
, DirSep
);
136 if (GetComponentNames
) {
137 RequiredLibs
.push_back(Name
);
141 // Add to the required library list.
143 if (Missing
&& GetComponentLibraryPath
) {
144 std::string path
= (*GetComponentLibraryPath
)(AC
->Library
);
145 if (DirSep
== "\\") {
146 std::replace(path
.begin(), path
.end(), '/', '\\');
148 if (!sys::fs::exists(path
))
149 Missing
->push_back(path
);
151 RequiredLibs
.push_back(AC
->Library
);
155 /// Compute the list of required libraries for a given list of
156 /// components, in an order suitable for passing to a linker (that is, libraries
157 /// appear prior to their dependencies).
159 /// \param Components - The names of the components to find libraries for.
160 /// \param IncludeNonInstalled - Whether non-installed components should be
162 /// \param GetComponentNames - True if one would prefer the component names.
163 static std::vector
<std::string
> ComputeLibsForComponents(
164 const std::vector
<StringRef
> &Components
, bool IncludeNonInstalled
,
165 bool GetComponentNames
, const std::function
<std::string(const StringRef
&)>
166 *GetComponentLibraryPath
,
167 std::vector
<std::string
> *Missing
, const std::string
&DirSep
) {
168 std::vector
<std::string
> RequiredLibs
;
169 std::set
<AvailableComponent
*> VisitedComponents
;
171 // Build a map of component names to information.
172 StringMap
<AvailableComponent
*> ComponentMap
;
173 for (auto &AC
: AvailableComponents
)
174 ComponentMap
[AC
.Name
] = &AC
;
176 // Visit the components.
177 for (unsigned i
= 0, e
= Components
.size(); i
!= e
; ++i
) {
178 // Users are allowed to provide mixed case component names.
179 std::string ComponentLower
= Components
[i
].lower();
181 // Validate that the user supplied a valid component name.
182 if (!ComponentMap
.count(ComponentLower
)) {
183 llvm::errs() << "llvm-config: unknown component name: " << Components
[i
]
188 VisitComponent(ComponentLower
, ComponentMap
, VisitedComponents
,
189 RequiredLibs
, IncludeNonInstalled
, GetComponentNames
,
190 GetComponentLibraryPath
, Missing
, DirSep
);
193 // The list is now ordered with leafs first, we want the libraries to printed
194 // in the reverse order of dependency.
195 std::reverse(RequiredLibs
.begin(), RequiredLibs
.end());
202 static void usage(bool ExitWithFailure
= true) {
204 usage: llvm-config <OPTION>... [<COMPONENT>...]\n\
206 Get various configuration information needed to compile programs which use\n\
207 LLVM. Typically called from 'configure' scripts. Examples:\n\
208 llvm-config --cxxflags\n\
209 llvm-config --ldflags\n\
210 llvm-config --libs engine bcreader scalaropts\n\
213 --assertion-mode Print assertion mode of LLVM tree (ON or OFF).\n\
214 --bindir Directory containing LLVM executables.\n\
215 --build-mode Print build mode of LLVM tree (e.g. Debug or Release).\n\
216 --build-system Print the build system used to build LLVM (e.g. `cmake` or `gn`).\n\
217 --cflags C compiler flags for files that include LLVM headers.\n\
218 --cmakedir Directory containing LLVM CMake modules.\n\
219 --components List of all possible components.\n\
220 --cppflags C preprocessor flags for files that include LLVM headers.\n\
221 --cxxflags C++ compiler flags for files that include LLVM headers.\n\
222 --has-rtti Print whether or not LLVM was built with rtti (YES or NO).\n\
223 --help Print a summary of llvm-config arguments.\n\
224 --host-target Target triple used to configure LLVM.\n\
225 --ignore-libllvm Ignore libLLVM and link component libraries instead.\n\
226 --includedir Directory containing LLVM headers.\n\
227 --ldflags Print Linker flags.\n\
228 --libdir Directory containing LLVM libraries.\n\
229 --libfiles Fully qualified library filenames for makefile depends.\n\
230 --libnames Bare library names for in-tree builds.\n\
231 --libs Libraries needed to link against LLVM components.\n\
232 --link-shared Link the components as shared libraries.\n\
233 --link-static Link the component libraries statically.\n\
234 --obj-root Print the object root used to build LLVM.\n\
235 --prefix Print the installation prefix.\n\
236 --shared-mode Print how the provided components can be collectively linked (`shared` or `static`).\n\
237 --system-libs System Libraries needed to link against LLVM components.\n\
238 --targets-built List of all targets currently built.\n\
239 --version Print LLVM version.\n\
240 Typical components:\n\
241 all All LLVM libraries (default).\n\
242 engine Either a native JIT or a bitcode interpreter.\n";
247 /// Compute the path to the main executable.
248 std::string
GetExecutablePath(const char *Argv0
) {
249 // This just needs to be some symbol in the binary; C++ doesn't
250 // allow taking the address of ::main however.
251 void *P
= (void *)(intptr_t)GetExecutablePath
;
252 return llvm::sys::fs::getMainExecutable(Argv0
, P
);
255 /// Expand the semi-colon delimited LLVM_DYLIB_COMPONENTS into
256 /// the full list of components.
257 std::vector
<std::string
> GetAllDyLibComponents(const bool IsInDevelopmentTree
,
258 const bool GetComponentNames
,
259 const std::string
&DirSep
) {
260 std::vector
<StringRef
> DyLibComponents
;
262 StringRef
DyLibComponentsStr(LLVM_DYLIB_COMPONENTS
);
265 const size_t NextOffset
= DyLibComponentsStr
.find(';', Offset
);
266 DyLibComponents
.push_back(DyLibComponentsStr
.substr(Offset
, NextOffset
-Offset
));
267 if (NextOffset
== std::string::npos
) {
270 Offset
= NextOffset
+ 1;
273 assert(!DyLibComponents
.empty());
275 return ComputeLibsForComponents(DyLibComponents
,
276 /*IncludeNonInstalled=*/IsInDevelopmentTree
,
277 GetComponentNames
, nullptr, nullptr, DirSep
);
280 int main(int argc
, char **argv
) {
281 std::vector
<StringRef
> Components
;
282 bool PrintLibs
= false, PrintLibNames
= false, PrintLibFiles
= false;
283 bool PrintSystemLibs
= false, PrintSharedMode
= false;
284 bool HasAnyOption
= false;
286 // llvm-config is designed to support being run both from a development tree
287 // and from an installed path. We try and auto-detect which case we are in so
288 // that we can report the correct information when run from a development
290 bool IsInDevelopmentTree
;
291 enum { CMakeStyle
, CMakeBuildModeStyle
} DevelopmentTreeLayout
;
292 llvm::SmallString
<256> CurrentPath(GetExecutablePath(argv
[0]));
293 std::string CurrentExecPrefix
;
294 std::string ActiveObjRoot
;
296 // If CMAKE_CFG_INTDIR is given, honor it as build mode.
297 char const *build_mode
= LLVM_BUILDMODE
;
298 #if defined(CMAKE_CFG_INTDIR)
299 if (!(CMAKE_CFG_INTDIR
[0] == '.' && CMAKE_CFG_INTDIR
[1] == '\0'))
300 build_mode
= CMAKE_CFG_INTDIR
;
303 // Create an absolute path, and pop up one directory (we expect to be inside a
305 sys::fs::make_absolute(CurrentPath
);
307 sys::path::parent_path(sys::path::parent_path(CurrentPath
)).str();
309 // Check to see if we are inside a development tree by comparing to possible
310 // locations (prefix style or CMake style).
311 if (sys::fs::equivalent(CurrentExecPrefix
, LLVM_OBJ_ROOT
)) {
312 IsInDevelopmentTree
= true;
313 DevelopmentTreeLayout
= CMakeStyle
;
314 ActiveObjRoot
= LLVM_OBJ_ROOT
;
315 } else if (sys::fs::equivalent(sys::path::parent_path(CurrentExecPrefix
),
317 IsInDevelopmentTree
= true;
318 DevelopmentTreeLayout
= CMakeBuildModeStyle
;
319 ActiveObjRoot
= LLVM_OBJ_ROOT
;
321 IsInDevelopmentTree
= false;
322 DevelopmentTreeLayout
= CMakeStyle
; // Initialized to avoid warnings.
325 // Compute various directory locations based on the derived location
327 std::string ActivePrefix
, ActiveBinDir
, ActiveIncludeDir
, ActiveLibDir
,
329 std::string ActiveIncludeOption
;
330 if (IsInDevelopmentTree
) {
331 ActiveIncludeDir
= std::string(LLVM_SRC_ROOT
) + "/include";
332 ActivePrefix
= CurrentExecPrefix
;
334 // CMake organizes the products differently than a normal prefix style
336 switch (DevelopmentTreeLayout
) {
338 ActiveBinDir
= ActiveObjRoot
+ "/bin";
339 ActiveLibDir
= ActiveObjRoot
+ "/lib" + LLVM_LIBDIR_SUFFIX
;
340 ActiveCMakeDir
= ActiveLibDir
+ "/cmake/llvm";
342 case CMakeBuildModeStyle
:
343 // FIXME: Should we consider the build-mode-specific path as the prefix?
344 ActivePrefix
= ActiveObjRoot
;
345 ActiveBinDir
= ActiveObjRoot
+ "/" + build_mode
+ "/bin";
347 ActiveObjRoot
+ "/" + build_mode
+ "/lib" + LLVM_LIBDIR_SUFFIX
;
348 // The CMake directory isn't separated by build mode.
350 ActivePrefix
+ "/lib" + LLVM_LIBDIR_SUFFIX
+ "/cmake/llvm";
354 // We need to include files from both the source and object trees.
355 ActiveIncludeOption
=
356 ("-I" + ActiveIncludeDir
+ " " + "-I" + ActiveObjRoot
+ "/include");
358 ActivePrefix
= CurrentExecPrefix
;
360 SmallString
<256> Path(LLVM_INSTALL_INCLUDEDIR
);
361 sys::fs::make_absolute(ActivePrefix
, Path
);
362 ActiveIncludeDir
= std::string(Path
.str());
365 SmallString
<256> Path(LLVM_TOOLS_INSTALL_DIR
);
366 sys::fs::make_absolute(ActivePrefix
, Path
);
367 ActiveBinDir
= std::string(Path
.str());
369 ActiveLibDir
= ActivePrefix
+ "/lib" + LLVM_LIBDIR_SUFFIX
;
371 SmallString
<256> Path(LLVM_INSTALL_PACKAGE_DIR
);
372 sys::fs::make_absolute(ActivePrefix
, Path
);
373 ActiveCMakeDir
= std::string(Path
.str());
375 ActiveIncludeOption
= "-I" + ActiveIncludeDir
;
378 /// We only use `shared library` mode in cases where the static library form
379 /// of the components provided are not available; note however that this is
380 /// skipped if we're run from within the build dir. However, once installed,
381 /// we still need to provide correct output when the static archives are
382 /// removed or, as in the case of CMake's `BUILD_SHARED_LIBS`, never present
383 /// in the first place. This can't be done at configure/build time.
385 StringRef SharedExt
, SharedVersionedExt
, SharedDir
, SharedPrefix
, StaticExt
,
386 StaticPrefix
, StaticDir
= "lib";
387 std::string DirSep
= "/";
388 const Triple
HostTriple(Triple::normalize(LLVM_HOST_TRIPLE
));
389 if (HostTriple
.isOSWindows()) {
391 SharedVersionedExt
= LLVM_DYLIB_VERSION
".dll";
392 if (HostTriple
.isOSCygMing()) {
393 SharedPrefix
= "lib";
395 StaticPrefix
= "lib";
399 std::replace(ActiveObjRoot
.begin(), ActiveObjRoot
.end(), '/', '\\');
400 std::replace(ActivePrefix
.begin(), ActivePrefix
.end(), '/', '\\');
401 std::replace(ActiveBinDir
.begin(), ActiveBinDir
.end(), '/', '\\');
402 std::replace(ActiveLibDir
.begin(), ActiveLibDir
.end(), '/', '\\');
403 std::replace(ActiveCMakeDir
.begin(), ActiveCMakeDir
.end(), '/', '\\');
404 std::replace(ActiveIncludeOption
.begin(), ActiveIncludeOption
.end(), '/',
407 SharedDir
= ActiveBinDir
;
408 StaticDir
= ActiveLibDir
;
409 } else if (HostTriple
.isOSDarwin()) {
411 SharedVersionedExt
= LLVM_DYLIB_VERSION
".dylib";
413 StaticDir
= SharedDir
= ActiveLibDir
;
414 StaticPrefix
= SharedPrefix
= "lib";
416 // default to the unix values:
418 SharedVersionedExt
= LLVM_DYLIB_VERSION
".so";
420 StaticDir
= SharedDir
= ActiveLibDir
;
421 StaticPrefix
= SharedPrefix
= "lib";
424 const bool BuiltDyLib
= !!LLVM_ENABLE_DYLIB
;
426 /// CMake style shared libs, ie each component is in a shared library.
427 const bool BuiltSharedLibs
= !!LLVM_ENABLE_SHARED
;
429 bool DyLibExists
= false;
430 const std::string DyLibName
=
431 (SharedPrefix
+ "LLVM-" + SharedVersionedExt
).str();
433 // If LLVM_LINK_DYLIB is ON, the single shared library will be returned
434 // for "--libs", etc, if they exist. This behaviour can be overridden with
435 // --link-static or --link-shared.
436 bool LinkDyLib
= !!LLVM_LINK_DYLIB
;
439 std::string
path((SharedDir
+ DirSep
+ DyLibName
).str());
440 if (DirSep
== "\\") {
441 std::replace(path
.begin(), path
.end(), '/', '\\');
443 DyLibExists
= sys::fs::exists(path
);
445 // The shared library does not exist: don't error unless the user
446 // explicitly passes --link-shared.
451 (LinkDyLib
|| BuiltSharedLibs
) ? LinkModeShared
: LinkModeAuto
;
453 /// Get the component's library name without the lib prefix and the
454 /// extension. Returns true if Lib is in a recognized format.
455 auto GetComponentLibraryNameSlice
= [&](const StringRef
&Lib
,
457 if (Lib
.startswith("lib")) {
459 if (Lib
.endswith(StaticExt
)) {
460 FromEnd
= StaticExt
.size() + 1;
461 } else if (Lib
.endswith(SharedExt
)) {
462 FromEnd
= SharedExt
.size() + 1;
468 Out
= Lib
.slice(3, Lib
.size() - FromEnd
);
475 /// Maps Unixizms to the host platform.
476 auto GetComponentLibraryFileName
= [&](const StringRef
&Lib
,
478 std::string LibFileName
;
480 if (Lib
== DyLibName
) {
481 // Treat the DyLibName specially. It is not a component library and
482 // already has the necessary prefix and suffix (e.g. `.so`) added so
483 // just return it unmodified.
484 assert(Lib
.endswith(SharedExt
) && "DyLib is missing suffix");
485 LibFileName
= std::string(Lib
);
487 LibFileName
= (SharedPrefix
+ Lib
+ "." + SharedExt
).str();
491 LibFileName
= (StaticPrefix
+ Lib
+ "." + StaticExt
).str();
496 /// Get the full path for a possibly shared component library.
497 auto GetComponentLibraryPath
= [&](const StringRef
&Name
, const bool Shared
) {
498 auto LibFileName
= GetComponentLibraryFileName(Name
, Shared
);
500 return (SharedDir
+ DirSep
+ LibFileName
).str();
502 return (StaticDir
+ DirSep
+ LibFileName
).str();
506 raw_ostream
&OS
= outs();
507 for (int i
= 1; i
!= argc
; ++i
) {
508 StringRef Arg
= argv
[i
];
510 if (Arg
.startswith("-")) {
512 if (Arg
== "--version") {
513 OS
<< PACKAGE_VERSION
<< '\n';
514 } else if (Arg
== "--prefix") {
515 OS
<< ActivePrefix
<< '\n';
516 } else if (Arg
== "--bindir") {
517 OS
<< ActiveBinDir
<< '\n';
518 } else if (Arg
== "--includedir") {
519 OS
<< ActiveIncludeDir
<< '\n';
520 } else if (Arg
== "--libdir") {
521 OS
<< ActiveLibDir
<< '\n';
522 } else if (Arg
== "--cmakedir") {
523 OS
<< ActiveCMakeDir
<< '\n';
524 } else if (Arg
== "--cppflags") {
525 OS
<< ActiveIncludeOption
<< ' ' << LLVM_CPPFLAGS
<< '\n';
526 } else if (Arg
== "--cflags") {
527 OS
<< ActiveIncludeOption
<< ' ' << LLVM_CFLAGS
<< '\n';
528 } else if (Arg
== "--cxxflags") {
529 OS
<< ActiveIncludeOption
<< ' ' << LLVM_CXXFLAGS
<< '\n';
530 } else if (Arg
== "--ldflags") {
531 OS
<< ((HostTriple
.isWindowsMSVCEnvironment()) ? "-LIBPATH:" : "-L")
532 << ActiveLibDir
<< ' ' << LLVM_LDFLAGS
<< '\n';
533 } else if (Arg
== "--system-libs") {
534 PrintSystemLibs
= true;
535 } else if (Arg
== "--libs") {
537 } else if (Arg
== "--libnames") {
538 PrintLibNames
= true;
539 } else if (Arg
== "--libfiles") {
540 PrintLibFiles
= true;
541 } else if (Arg
== "--components") {
542 /// If there are missing static archives and a dylib was
543 /// built, print LLVM_DYLIB_COMPONENTS instead of everything
545 std::vector
<std::string
> Components
;
546 for (const auto &AC
: AvailableComponents
) {
547 // Only include non-installed components when in a development tree.
548 if (!AC
.IsInstalled
&& !IsInDevelopmentTree
)
551 Components
.push_back(AC
.Name
);
552 if (AC
.Library
&& !IsInDevelopmentTree
) {
553 std::string
path(GetComponentLibraryPath(AC
.Library
, false));
554 if (DirSep
== "\\") {
555 std::replace(path
.begin(), path
.end(), '/', '\\');
557 if (DyLibExists
&& !sys::fs::exists(path
)) {
559 GetAllDyLibComponents(IsInDevelopmentTree
, true, DirSep
);
560 llvm::sort(Components
);
566 for (unsigned I
= 0; I
< Components
.size(); ++I
) {
574 } else if (Arg
== "--targets-built") {
575 OS
<< LLVM_TARGETS_BUILT
<< '\n';
576 } else if (Arg
== "--host-target") {
577 OS
<< Triple::normalize(LLVM_DEFAULT_TARGET_TRIPLE
) << '\n';
578 } else if (Arg
== "--build-mode") {
579 OS
<< build_mode
<< '\n';
580 } else if (Arg
== "--assertion-mode") {
586 } else if (Arg
== "--build-system") {
587 OS
<< LLVM_BUILD_SYSTEM
<< '\n';
588 } else if (Arg
== "--has-rtti") {
589 OS
<< (LLVM_HAS_RTTI
? "YES" : "NO") << '\n';
590 } else if (Arg
== "--shared-mode") {
591 PrintSharedMode
= true;
592 } else if (Arg
== "--obj-root") {
593 OS
<< ActivePrefix
<< '\n';
594 } else if (Arg
== "--ignore-libllvm") {
596 LinkMode
= BuiltSharedLibs
? LinkModeShared
: LinkModeAuto
;
597 } else if (Arg
== "--link-shared") {
598 LinkMode
= LinkModeShared
;
599 } else if (Arg
== "--link-static") {
600 LinkMode
= LinkModeStatic
;
601 } else if (Arg
== "--help") {
607 Components
.push_back(Arg
);
614 if (LinkMode
== LinkModeShared
&& !DyLibExists
&& !BuiltSharedLibs
) {
615 WithColor::error(errs(), "llvm-config") << DyLibName
<< " is missing\n";
619 if (PrintLibs
|| PrintLibNames
|| PrintLibFiles
|| PrintSystemLibs
||
622 if (PrintSharedMode
&& BuiltSharedLibs
) {
627 // If no components were specified, default to "all".
628 if (Components
.empty())
629 Components
.push_back("all");
631 // Construct the list of all the required libraries.
632 std::function
<std::string(const StringRef
&)>
633 GetComponentLibraryPathFunction
= [&](const StringRef
&Name
) {
634 return GetComponentLibraryPath(Name
, LinkMode
== LinkModeShared
);
636 std::vector
<std::string
> MissingLibs
;
637 std::vector
<std::string
> RequiredLibs
= ComputeLibsForComponents(
639 /*IncludeNonInstalled=*/IsInDevelopmentTree
, false,
640 &GetComponentLibraryPathFunction
, &MissingLibs
, DirSep
);
641 if (!MissingLibs
.empty()) {
644 if (LinkDyLib
&& !BuiltSharedLibs
)
646 // Using component shared libraries.
647 for (auto &Lib
: MissingLibs
)
648 WithColor::error(errs(), "llvm-config") << "missing: " << Lib
<< "\n";
652 LinkMode
= LinkModeShared
;
655 WithColor::error(errs(), "llvm-config")
656 << "component libraries and shared library\n\n";
659 for (auto &Lib
: MissingLibs
)
660 WithColor::error(errs(), "llvm-config") << "missing: " << Lib
<< "\n";
663 } else if (LinkMode
== LinkModeAuto
) {
664 LinkMode
= LinkModeStatic
;
667 if (PrintSharedMode
) {
668 std::unordered_set
<std::string
> FullDyLibComponents
;
669 std::vector
<std::string
> DyLibComponents
=
670 GetAllDyLibComponents(IsInDevelopmentTree
, false, DirSep
);
672 for (auto &Component
: DyLibComponents
) {
673 FullDyLibComponents
.insert(Component
);
675 DyLibComponents
.clear();
677 for (auto &Lib
: RequiredLibs
) {
678 if (!FullDyLibComponents
.count(Lib
)) {
683 FullDyLibComponents
.clear();
685 if (LinkMode
== LinkModeShared
) {
694 if (PrintLibs
|| PrintLibNames
|| PrintLibFiles
) {
696 auto PrintForLib
= [&](const StringRef
&Lib
) {
697 const bool Shared
= LinkMode
== LinkModeShared
;
699 OS
<< GetComponentLibraryFileName(Lib
, Shared
);
700 } else if (PrintLibFiles
) {
701 OS
<< GetComponentLibraryPath(Lib
, Shared
);
702 } else if (PrintLibs
) {
703 // On Windows, output full path to library without parameters.
704 // Elsewhere, if this is a typical library name, include it using -l.
705 if (HostTriple
.isWindowsMSVCEnvironment()) {
706 OS
<< GetComponentLibraryPath(Lib
, Shared
);
709 if (GetComponentLibraryNameSlice(Lib
, LibName
)) {
710 // Extract library name (remove prefix and suffix).
711 OS
<< "-l" << LibName
;
713 // Lib is already a library name without prefix and suffix.
720 if (LinkMode
== LinkModeShared
&& LinkDyLib
) {
721 PrintForLib(DyLibName
);
723 for (unsigned i
= 0, e
= RequiredLibs
.size(); i
!= e
; ++i
) {
724 auto Lib
= RequiredLibs
[i
];
734 // Print SYSTEM_LIBS after --libs.
735 // FIXME: Each LLVM component may have its dependent system libs.
736 if (PrintSystemLibs
) {
737 // Output system libraries only if linking against a static
738 // library (since the shared library links to all system libs
740 OS
<< (LinkMode
== LinkModeStatic
? LLVM_SYSTEM_LIBS
: "") << '\n';
742 } else if (!Components
.empty()) {
743 WithColor::error(errs(), "llvm-config")
744 << "components given, but unused\n\n";