diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | Makefile.rules | 6 | ||||
-rw-r--r-- | autoconf/configure.ac | 3 | ||||
-rwxr-xr-x | configure | 2 | ||||
-rw-r--r-- | tools/CMakeLists.txt | 11 | ||||
-rw-r--r-- | tools/Makefile | 2 | ||||
-rw-r--r-- | tools/llvm-config-2/BuildVariables.inc.in | 26 | ||||
-rw-r--r-- | tools/llvm-config-2/CMakeLists.txt | 41 | ||||
-rw-r--r-- | tools/llvm-config-2/Makefile | 57 | ||||
-rw-r--r-- | tools/llvm-config-2/llvm-config.cpp | 334 | ||||
-rw-r--r-- | tools/llvm-config/BuildVariables.inc.in | 26 | ||||
-rw-r--r-- | tools/llvm-config/CMakeLists.txt | 151 | ||||
-rw-r--r-- | tools/llvm-config/Makefile | 92 | ||||
-rw-r--r-- | tools/llvm-config/find-cycles.pl | 170 | ||||
-rw-r--r-- | tools/llvm-config/llvm-config.cpp | 334 | ||||
-rw-r--r-- | tools/llvm-config/llvm-config.in.in | 466 |
17 files changed, 425 insertions, 1302 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d36f5fc10..6dd8169ebc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -230,7 +230,7 @@ endif() set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build") set(LLVMCONFIGLIBRARYDEPENDENCIESINC - "${LLVM_BINARY_DIR}/tools/llvm-config-2/LibraryDependencies.inc") + "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc") set(LLVMBUILDCMAKEFRAG "${LLVM_BINARY_DIR}/LLVMBuild.cmake") message(STATUS "Constructing LLVMBuild project information") @@ -27,11 +27,11 @@ LEVEL := . ifneq ($(findstring llvmCore, $(RC_ProjectName)),llvmCore) # Normal build (not "Apple-style"). ifeq ($(BUILD_DIRS_ONLY),1) - DIRS := lib/Support lib/TableGen utils tools/llvm-config-2 + DIRS := lib/Support lib/TableGen utils tools/llvm-config OPTIONAL_DIRS := tools/clang/utils/TableGen else DIRS := lib/Support lib/TableGen utils lib/VMCore lib tools/llvm-shlib \ - tools/llvm-config tools/llvm-config-2 tools runtime docs unittests + tools/llvm-config tools runtime docs unittests OPTIONAL_DIRS := projects bindings endif diff --git a/Makefile.rules b/Makefile.rules index 1c5effe65b..670a8bb370 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -79,7 +79,7 @@ LLVMBuildTool := $(PROJ_SRC_ROOT)/utils/llvm-build/llvm-build # The files we are going to generate using llvm-build. LLVMBuildMakeFrag := $(PROJ_OBJ_ROOT)/Makefile.llvmbuild LLVMConfigLibraryDependenciesInc := \ - $(PROJ_OBJ_ROOT)/tools/llvm-config-2/LibraryDependencies.inc + $(PROJ_OBJ_ROOT)/tools/llvm-config/LibraryDependencies.inc # This is for temporary backwards compatibility. ifndef TARGET_NATIVE_ARCH @@ -528,9 +528,9 @@ ifndef LLVM_TBLGEN endif endif ifeq ($(LLVM_CROSS_COMPILING),1) - LLVM_CONFIG := $(BuildLLVMToolDir)/llvm-config-2$(BUILD_EXEEXT) + LLVM_CONFIG := $(BuildLLVMToolDir)/llvm-config$(BUILD_EXEEXT) else - LLVM_CONFIG := $(LLVMToolDir)/llvm-config-2$(EXEEXT) + LLVM_CONFIG := $(LLVMToolDir)/llvm-config$(EXEEXT) endif ifndef LLVMLD LLVMLD := $(LLVMToolDir)/llvm-ld$(EXEEXT) diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 060ebac8d3..3c3f412283 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -1578,9 +1578,6 @@ if test -f ${srcdir}/tools/clang/README.txt; then AC_CONFIG_FILES([tools/clang/docs/doxygen.cfg]) fi -dnl Do the first stage of configuration for llvm-config.in. -AC_CONFIG_FILES([tools/llvm-config/llvm-config.in]) - dnl OCaml findlib META file AC_CONFIG_FILES([bindings/ocaml/llvm/META.llvm]) @@ -21100,7 +21100,7 @@ if test -f ${srcdir}/tools/clang/README.txt; then fi -ac_config_files="$ac_config_files tools/llvm-config/llvm-config.in" + ac_config_files="$ac_config_files bindings/ocaml/llvm/META.llvm" diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index edfd3b2b71..ec0647124b 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -11,16 +11,9 @@ if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/polly/CMakeLists.txt ) endif( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/polly/CMakeLists.txt ) if( NOT WIN32 OR MSYS OR CYGWIN ) - # It is useful to build llvm-config before the other tools, so we - # have a fresh LibDeps.txt for regenerating the hard-coded library - # dependencies. llvm-config/CMakeLists.txt takes care of this but we - # must keep llvm-config as the first entry on the list of tools to - # be built. - add_subdirectory(llvm-config) - - # We currently require 'sed' to build llvm-config-2, so don't try to build it + # We currently require 'sed' to build llvm-config, so don't try to build it # on pure Win32. - add_subdirectory(llvm-config-2) + add_subdirectory(llvm-config) endif() add_subdirectory(opt) diff --git a/tools/Makefile b/tools/Makefile index 8bbd7c2387..1953cb6711 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -34,7 +34,7 @@ PARALLEL_DIRS := opt llvm-as llvm-dis \ bugpoint llvm-bcanalyzer llvm-stub \ llvm-diff macho-dump llvm-objdump \ llvm-rtdyld llvm-dwarfdump llvm-cov \ - llvm-size llvm-config-2 + llvm-size # Let users override the set of tools to build from the command line. ifdef ONLY_TOOLS diff --git a/tools/llvm-config-2/BuildVariables.inc.in b/tools/llvm-config-2/BuildVariables.inc.in deleted file mode 100644 index 5969772c9d..0000000000 --- a/tools/llvm-config-2/BuildVariables.inc.in +++ /dev/null @@ -1,26 +0,0 @@ -//===-- BuildVariables.inc.in - llvm-config build variables -*- C++ -*-----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file is configured by the build system to define the variables -// llvm-config wants to report to the user, but which can only be determined at -// build time. -// -// The non .in variant of this file has been autogenerated by the LLVM build. Do -// not edit! -// -//===----------------------------------------------------------------------===// - -#define LLVM_SRC_ROOT "@LLVM_SRC_ROOT@" -#define LLVM_OBJ_ROOT "@LLVM_OBJ_ROOT@" -#define LLVM_CPPFLAGS "@LLVM_CPPFLAGS@" -#define LLVM_CFLAGS "@LLVM_CFLAGS@" -#define LLVM_LDFLAGS "@LLVM_LDFLAGS@" -#define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" -#define LLVM_BUILDMODE "@LLVM_BUILDMODE@" -#define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@" diff --git a/tools/llvm-config-2/CMakeLists.txt b/tools/llvm-config-2/CMakeLists.txt deleted file mode 100644 index 3c7169d382..0000000000 --- a/tools/llvm-config-2/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -set(LLVM_LINK_COMPONENTS support) - -# We need to generate the BuildVariables.inc file containing values which are -# only defined when under certain build modes. Unfortunately, that precludes -# doing this inside CMake so we have to shell out to sed. For now, that means we -# can't expect to build llvm-config on Window.s -set(BUILDVARIABLES_SRCPATH ${CMAKE_CURRENT_SOURCE_DIR}/BuildVariables.inc.in) -set(BUILDVARIABLES_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.inc) -set(SEDSCRIPT_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.configure.sed) - -# Compute the substitution values for various items. -get_system_libs(LLVM_SYSTEM_LIBS_LIST) -foreach(l ${LLVM_SYSTEM_LIBS_LIST}) - set(SYSTEM_LIBS ${SYSTEM_LIBS} "-l${l}") -endforeach() -set(C_FLGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}") -set(CXX_FLGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}") -set(CPP_FLGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}") - -add_custom_command(OUTPUT ${BUILDVARIABLES_OBJPATH} - COMMAND echo s!@LLVM_SRC_ROOT@!${LLVM_MAIN_SRC_DIR}! > ${SEDSCRIPT_OBJPATH} - COMMAND echo s!@LLVM_OBJ_ROOT@!${LLVM_BINARY_DIR}! >> ${SEDSCRIPT_OBJPATH} - COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! >> ${SEDSCRIPT_OBJPATH} - COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> ${SEDSCRIPT_OBJPATH} - COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> ${SEDSCRIPT_OBJPATH} - # TODO: Use general flags for linking! not just for shared libs: - COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> ${SEDSCRIPT_OBJPATH} - COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> ${SEDSCRIPT_OBJPATH} - COMMAND echo s!@LLVM_SYSTEM_LIBS@!${SYSTEM_LIBS}! >> ${SEDSCRIPT_OBJPATH} - COMMAND sed -f ${SEDSCRIPT_OBJPATH} < ${BUILDVARIABLES_SRCPATH} > ${BUILDVARIABLES_OBJPATH} - VERBATIM - COMMENT "Building BuildVariables.inc include." - ) - -# Add the llvm-config tool. -add_llvm_tool(llvm-config-2 - llvm-config.cpp - ) - -# Add the dependency on the generation step. -add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH}) diff --git a/tools/llvm-config-2/Makefile b/tools/llvm-config-2/Makefile deleted file mode 100644 index 08e084429d..0000000000 --- a/tools/llvm-config-2/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -##===- tools/llvm-config/Makefile---------------------------*- Makefile -*-===## -# -# The LLVM Compiler Infrastructure -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -##===----------------------------------------------------------------------===## - -LEVEL := ../.. -TOOLNAME := llvm-config-2 -USEDLIBS := LLVMSupport.a - -# We generate sources in the build directory, make sure it is in the include -# paths. -INCLUDE_BUILD_DIR := 1 - -# This tool has no plugins, optimize startup time. -TOOL_NO_EXPORTS := 1 - -# Note that we have to use lazy expansion here. -BUILDVARIABLES_SRCPATH = $(PROJ_SRC_ROOT)/tools/$(TOOLNAME)/BuildVariables.inc.in -BUILDVARIABLES_OBJPATH = $(ObjDir)/BuildVariables.inc -BUILT_SOURCES = $(BUILDVARIABLES_OBJPATH) - -include $(LEVEL)/Makefile.common - -# Combine preprocessor flags (except for -I) and CXX flags. -SUB_CPPFLAGS := ${CPP.BaseFlags} -SUB_CFLAGS := ${CPP.BaseFlags} ${C.Flags} -SUB_CXXFLAGS := ${CPP.BaseFlags} ${CXX.Flags} - -# This is blank for now. We need to be careful about adding stuff here: -# LDFLAGS tend not to be portable, and we don't currently require the -# user to use libtool when linking against LLVM. -SUB_LDFLAGS := - -$(ObjDir)/BuildVariables.inc: $(BUILDVARIABLES_SRCPATH) Makefile $(ObjDir)/.dir - $(Echo) "Building llvm-config BuildVariables.inc file." - $(Verb) $(ECHO) 's/@LLVM_SRC_ROOT@/$(subst /,\/,$(LLVM_SRC_ROOT))/' \ - > temp.sed - $(Verb) $(ECHO) 's/@LLVM_OBJ_ROOT@/$(subst /,\/,$(LLVM_OBJ_ROOT))/' \ - >> temp.sed - $(Verb) $(ECHO) 's/@LLVM_CPPFLAGS@/$(subst /,\/,$(SUB_CPPFLAGS))/' \ - >> temp.sed - $(Verb) $(ECHO) 's/@LLVM_CFLAGS@/$(subst /,\/,$(SUB_CFLAGS))/' \ - >> temp.sed - $(Verb) $(ECHO) 's/@LLVM_CXXFLAGS@/$(subst /,\/,$(SUB_CXXFLAGS))/' \ - >> temp.sed - $(Verb) $(ECHO) 's/@LLVM_LDFLAGS@/$(subst /,\/,$(SUB_LDFLAGS))/' \ - >> temp.sed - $(Verb) $(ECHO) 's/@LLVM_BUILDMODE@/$(subst /,\/,$(BuildMode))/' \ - >> temp.sed - $(Verb) $(ECHO) 's/@LLVM_SYSTEM_LIBS@/$(subst /,\/,$(LIBS))/' \ - >> temp.sed - $(Verb) $(SED) -f temp.sed < $< > $@ - $(Verb) $(RM) temp.sed diff --git a/tools/llvm-config-2/llvm-config.cpp b/tools/llvm-config-2/llvm-config.cpp deleted file mode 100644 index bf3357e9f2..0000000000 --- a/tools/llvm-config-2/llvm-config.cpp +++ /dev/null @@ -1,334 +0,0 @@ -//===-- llvm-config.cpp - LLVM project configuration utility --------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This tool encapsulates information about an LLVM project configuration for -// use by other project's build environments (to determine installed path, -// available features, required libraries, etc.). -// -// Note that although this tool *may* be used by some parts of LLVM's build -// itself (i.e., the Makefiles use it to compute required libraries when linking -// tools), this tool is primarily designed to support external projects. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/StringMap.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/Twine.h" -#include "llvm/Config/config.h" -#include "llvm/Config/llvm-config.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/Path.h" -#include "llvm/Support/TargetRegistry.h" -#include "llvm/Support/raw_ostream.h" -#include <cstdlib> -#include <set> -#include <vector> - -using namespace llvm; - -// Include the build time variables we can report to the user. This is generated -// at build time from the BuildVariables.inc.in file by the build system. -#include "BuildVariables.inc" - -// Include the component table. This creates an array of struct -// AvailableComponent entries, which record the component name, library name, -// and required components for all of the available libraries. -// -// Not all components define a library, we also use "library groups" as a way to -// create entries for pseudo groups like x86 or all-targets. -#include "LibraryDependencies.inc" - -/// \brief Traverse a single component adding to the topological ordering in -/// \arg RequiredLibs. -/// -/// \param Name - The component to traverse. -/// \param ComponentMap - A prebuilt map of component names to descriptors. -/// \param VisitedComponents [in] [out] - The set of already visited components. -/// \param RequiredLibs [out] - The ordered list of required libraries. -static void VisitComponent(StringRef Name, - const StringMap<AvailableComponent*> &ComponentMap, - std::set<AvailableComponent*> &VisitedComponents, - std::vector<StringRef> &RequiredLibs) { - // Lookup the component. - AvailableComponent *AC = ComponentMap.lookup(Name); - assert(AC && "Invalid component name!"); - - // Add to the visited table. - if (!VisitedComponents.insert(AC).second) { - // We are done if the component has already been visited. - return; - } - - // Otherwise, visit all the dependencies. - for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) { - VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents, - RequiredLibs); - } - - // Add to the required library list. - if (AC->Library) - RequiredLibs.push_back(AC->Library); -} - -/// \brief Compute the list of required libraries for a given list of -/// components, in an order suitable for passing to a linker (that is, libraries -/// appear prior to their dependencies). -/// -/// \param Components - The names of the components to find libraries for. -/// \param RequiredLibs [out] - On return, the ordered list of libraries that -/// are required to link the given components. -void ComputeLibsForComponents(const std::vector<StringRef> &Components, - std::vector<StringRef> &RequiredLibs) { - std::set<AvailableComponent*> VisitedComponents; - - // Build a map of component names to information. - StringMap<AvailableComponent*> ComponentMap; - for (unsigned i = 0; i != array_lengthof(AvailableComponents); ++i) { - AvailableComponent *AC = &AvailableComponents[i]; - ComponentMap[AC->Name] = AC; - } - - // Visit the components. - for (unsigned i = 0, e = Components.size(); i != e; ++i) { - // Users are allowed to provide mixed case component names. - std::string ComponentLower = Components[i].lower(); - - // Validate that the user supplied a valid component name. - if (!ComponentMap.count(ComponentLower)) { - llvm::errs() << "llvm-config: unknown component name: " << Components[i] - << "\n"; - exit(1); - } - - VisitComponent(ComponentLower, ComponentMap, VisitedComponents, - RequiredLibs); - } - - // The list is now ordered with leafs first, we want the libraries to printed - // in the reverse order of dependency. - std::reverse(RequiredLibs.begin(), RequiredLibs.end()); -} - -/* *** */ - -void usage() { - errs() << "\ -usage: llvm-config <OPTION>... [<COMPONENT>...]\n\ -\n\ -Get various configuration information needed to compile programs which use\n\ -LLVM. Typically called from 'configure' scripts. Examples:\n\ - llvm-config --cxxflags\n\ - llvm-config --ldflags\n\ - llvm-config --libs engine bcreader scalaropts\n\ -\n\ -Options:\n\ - --version Print LLVM version.\n\ - --prefix Print the installation prefix.\n\ - --src-root Print the source root LLVM was built from.\n\ - --obj-root Print the object root used to build LLVM.\n\ - --bindir Directory containing LLVM executables.\n\ - --includedir Directory containing LLVM headers.\n\ - --libdir Directory containing LLVM libraries.\n\ - --cppflags C preprocessor flags for files that include LLVM headers.\n\ - --cflags C compiler flags for files that include LLVM headers.\n\ - --cxxflags C++ compiler flags for files that include LLVM headers.\n\ - --ldflags Print Linker flags.\n\ - --libs Libraries needed to link against LLVM components.\n\ - --libnames Bare library names for in-tree builds.\n\ - --libfiles Fully qualified library filenames for makefile depends.\n\ - --components List of all possible components.\n\ - --targets-built List of all targets currently built.\n\ - --host-target Target triple used to configure LLVM.\n\ - --build-mode Print build mode of LLVM tree (e.g. Debug or Release).\n\ -Typical components:\n\ - all All LLVM libraries (default).\n\ - backend Either a native backend or the C backend.\n\ - engine Either a native JIT or a bitcode interpreter.\n"; - exit(1); -} - -/// \brief Compute the path to the main executable. -llvm::sys::Path GetExecutablePath(const char *Argv0) { - // This just needs to be some symbol in the binary; C++ doesn't - // allow taking the address of ::main however. - void *P = (void*) (intptr_t) GetExecutablePath; - return llvm::sys::Path::GetMainExecutable(Argv0, P); -} - -int main(int argc, char **argv) { - std::vector<StringRef> Components; - bool PrintLibs = false, PrintLibNames = false, PrintLibFiles = false; - bool HasAnyOption = false; - - // llvm-config is designed to support being run both from a development tree - // and from an installed path. We try and auto-detect which case we are in so - // that we can report the correct information when run from a development - // tree. - bool IsInDevelopmentTree, DevelopmentTreeLayoutIsCMakeStyle; - llvm::SmallString<256> CurrentPath(GetExecutablePath(argv[0]).str()); - std::string CurrentExecPrefix; - std::string ActiveObjRoot; - - // Create an absolute path, and pop up one directory (we expect to be inside a - // bin dir). - sys::fs::make_absolute(CurrentPath); - CurrentExecPrefix = sys::path::parent_path( - sys::path::parent_path(CurrentPath)).str(); - - // Check to see if we are inside a development tree by comparing to possible - // locations (prefix style or CMake style). This could be wrong in the face of - // symbolic links, but is good enough. - if (CurrentExecPrefix == std::string(LLVM_OBJ_ROOT) + "/" + LLVM_BUILDMODE) { - IsInDevelopmentTree = true; - DevelopmentTreeLayoutIsCMakeStyle = false; - - // If we are in a development tree, then check if we are in a BuildTools - // directory. This indicates we are built for the build triple, but we - // always want to provide information for the host triple. - if (sys::path::filename(LLVM_OBJ_ROOT) == "BuildTools") { - ActiveObjRoot = sys::path::parent_path(LLVM_OBJ_ROOT); - } else { - ActiveObjRoot = LLVM_OBJ_ROOT; - } - } else if (CurrentExecPrefix == std::string(LLVM_OBJ_ROOT) + "/bin") { - IsInDevelopmentTree = true; - DevelopmentTreeLayoutIsCMakeStyle = true; - ActiveObjRoot = LLVM_OBJ_ROOT; - } else { - IsInDevelopmentTree = false; - } - - // Compute various directory locations based on the derived location - // information. - std::string ActivePrefix, ActiveBinDir, ActiveIncludeDir, ActiveLibDir; - std::string ActiveIncludeOption; - if (IsInDevelopmentTree) { - ActiveIncludeDir = std::string(LLVM_SRC_ROOT) + "/include"; - ActivePrefix = CurrentExecPrefix; - - // CMake organizes the products differently than a normal prefix style - // layout. - if (DevelopmentTreeLayoutIsCMakeStyle) { - ActiveBinDir = ActiveObjRoot + "/bin/" + LLVM_BUILDMODE; - ActiveLibDir = ActiveObjRoot + "/lib/" + LLVM_BUILDMODE; - } else { - ActiveBinDir = ActiveObjRoot + "/" + LLVM_BUILDMODE + "/bin"; - ActiveLibDir = ActiveObjRoot + "/" + LLVM_BUILDMODE + "/lib"; - } - - // We need to include files from both the source and object trees. - ActiveIncludeOption = ("-I" + ActiveIncludeDir + " " + - "-I" + ActiveObjRoot + "/include"); - } else { - ActivePrefix = CurrentExecPrefix; - ActiveIncludeDir = ActivePrefix + "/include"; - ActiveBinDir = ActivePrefix + "/bin"; - ActiveLibDir = ActivePrefix + "/lib"; - ActiveIncludeOption = "-I" + ActiveIncludeDir; - } - - raw_ostream &OS = outs(); - for (int i = 1; i != argc; ++i) { - StringRef Arg = argv[i]; - - if (Arg.startswith("-")) { - HasAnyOption = true; - if (Arg == "--version") { - OS << PACKAGE_VERSION << '\n'; - } else if (Arg == "--prefix") { - OS << ActivePrefix << '\n'; - } else if (Arg == "--bindir") { - OS << ActiveBinDir << '\n'; - } else if (Arg == "--includedir") { - OS << ActiveIncludeDir << '\n'; - } else if (Arg == "--libdir") { - OS << ActiveLibDir << '\n'; - } else if (Arg == "--cppflags") { - OS << ActiveIncludeOption << ' ' << LLVM_CPPFLAGS << '\n'; - } else if (Arg == "--cflags") { - OS << ActiveIncludeOption << ' ' << LLVM_CFLAGS << '\n'; - } else if (Arg == "--cxxflags") { - OS << ActiveIncludeOption << ' ' << LLVM_CXXFLAGS << '\n'; - } else if (Arg == "--ldflags") { - OS << "-L" << ActiveLibDir << ' ' << LLVM_LDFLAGS - << ' ' << LLVM_SYSTEM_LIBS << '\n'; - } else if (Arg == "--libs") { - PrintLibs = true; - } else if (Arg == "--libnames") { - PrintLibNames = true; - } else if (Arg == "--libfiles") { - PrintLibFiles = true; - } else if (Arg == "--components") { - for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) { - OS << ' '; - OS << AvailableComponents[j].Name; - } - OS << '\n'; - } else if (Arg == "--targets-built") { - bool First = true; - for (TargetRegistry::iterator I = TargetRegistry::begin(), - E = TargetRegistry::end(); I != E; First = false, ++I) { - if (!First) - OS << ' '; - OS << I->getName(); - } - OS << '\n'; - } else if (Arg == "--host-target") { - OS << LLVM_DEFAULT_TARGET_TRIPLE << '\n'; - } else if (Arg == "--build-mode") { - OS << LLVM_BUILDMODE << '\n'; - } else if (Arg == "--obj-root") { - OS << LLVM_OBJ_ROOT << '\n'; - } else if (Arg == "--src-root") { - OS << LLVM_SRC_ROOT << '\n'; - } else { - usage(); - } - } else { - Components.push_back(Arg); - } - } - - if (!HasAnyOption) - usage(); - - if (PrintLibs || PrintLibNames || PrintLibFiles) { - // Construct the list of all the required libraries. - std::vector<StringRef> RequiredLibs; - ComputeLibsForComponents(Components, RequiredLibs); - - for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) { - StringRef Lib = RequiredLibs[i]; - if (i) - OS << ' '; - - if (PrintLibNames) { - OS << Lib; - } else if (PrintLibFiles) { - OS << ActiveLibDir << '/' << Lib; - } else if (PrintLibs) { - // If this is a typical library name, include it using -l. - if (Lib.startswith("lib") && Lib.endswith(".a")) { - OS << "-l" << Lib.slice(3, Lib.size()-2); - continue; - } - - // Otherwise, print the full path. - OS << ActiveLibDir << '/' << Lib; - } - } - OS << '\n'; - } else if (!Components.empty()) { - errs() << "llvm-config: error: components given, but unused\n\n"; - usage(); - } - - return 0; -} diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in index e69de29bb2..5969772c9d 100644 --- a/tools/llvm-config/BuildVariables.inc.in +++ b/tools/llvm-config/BuildVariables.inc.in @@ -0,0 +1,26 @@ +//===-- BuildVariables.inc.in - llvm-config build variables -*- C++ -*-----===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is configured by the build system to define the variables +// llvm-config wants to report to the user, but which can only be determined at +// build time. +// +// The non .in variant of this file has been autogenerated by the LLVM build. Do +// not edit! +// +//===----------------------------------------------------------------------===// + +#define LLVM_SRC_ROOT "@LLVM_SRC_ROOT@" +#define LLVM_OBJ_ROOT "@LLVM_OBJ_ROOT@" +#define LLVM_CPPFLAGS "@LLVM_CPPFLAGS@" +#define LLVM_CFLAGS "@LLVM_CFLAGS@" +#define LLVM_LDFLAGS "@LLVM_LDFLAGS@" +#define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" +#define LLVM_BUILDMODE "@LLVM_BUILDMODE@" +#define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@" diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt index 53f00846b7..ed26ba9555 100644 --- a/tools/llvm-config/CMakeLists.txt +++ b/tools/llvm-config/CMakeLists.txt @@ -1,138 +1,41 @@ -include(TestBigEndian) +set(LLVM_LINK_COMPONENTS support) -include(FindPerl) -if( NOT PERL_FOUND ) - message(FATAL_ERROR "Perl required but not found!") -endif( NOT PERL_FOUND ) - -set(PERL ${PERL_EXECUTABLE}) -set(VERSION PACKAGE_VERSION) -set(PREFIX ${CMAKE_INSTALL_PREFIX}) -set(abs_top_srcdir ${LLVM_MAIN_SRC_DIR}) -set(abs_top_builddir ${LLVM_BINARY_DIR}) -execute_process(COMMAND date - OUTPUT_VARIABLE LLVM_CONFIGTIME - OUTPUT_STRIP_TRAILING_WHITESPACE) -# LLVM_ON_UNIX and LLVM_ON_WIN32 already set. -# those are set to blank by `autoconf' on MinGW, so it seems they are not required: -#set(LLVMGCCDIR "") -#set(LLVMGCC "") -#set(LLVMGXX "") -test_big_endian(IS_BIG_ENDIAN) -if( IS_BIG_ENDIAN ) - set(ENDIAN "big") -else( IS_BIG_ENDIAN ) - set(ENDIAN "little") -endif( IS_BIG_ENDIAN ) -set(SHLIBEXT ${LTDL_SHLIB_EXT}) -#EXEEXT already set. -set(OS "${CMAKE_SYSTEM}") -set(target "${TARGET_TRIPLE}") -set(ARCH "${LLVM_NATIVE_ARCH}") +# We need to generate the BuildVariables.inc file containing values which are +# only defined when under certain build modes. Unfortunately, that precludes +# doing this inside CMake so we have to shell out to sed. For now, that means we +# can't expect to build llvm-config on Window.s +set(BUILDVARIABLES_SRCPATH ${CMAKE_CURRENT_SOURCE_DIR}/BuildVariables.inc.in) +set(BUILDVARIABLES_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.inc) +set(SEDSCRIPT_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.configure.sed) +# Compute the substitution values for various items. get_system_libs(LLVM_SYSTEM_LIBS_LIST) foreach(l ${LLVM_SYSTEM_LIBS_LIST}) - set(LLVM_SYSTEM_LIBS ${LLVM_SYSTEM_LIBS} "-l${l}") + set(SYSTEM_LIBS ${SYSTEM_LIBS} "-l${l}") endforeach() - -foreach(c ${LLVM_TARGETS_TO_BUILD}) - set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") -endforeach(c) -set(TARGETS_TO_BUILD ${TARGETS_BUILT}) -set(TARGET_HAS_JIT "1") # TODO - -# Avoids replacement at config-time: -set(LLVM_CPPFLAGS "@LLVM_CPPFLAGS@") -set(LLVM_CFLAGS "@LLVM_CFLAGS@") -set(LLVM_CXXFLAGS "@LLVM_CXXFLAGS@") -set(LLVM_LDFLAGS "@LLVM_LDFLAGS@") -set(LIBS "@LIBS@") -set(LLVM_BUILDMODE "@LLVM_BUILDMODE@") -set(LLVM_OBJ_SUFFIX "@LLVM_OBJ_SUFFIX@") - -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.in.in - ${CMAKE_CURRENT_BINARY_DIR}/llvm-config.in - @ONLY -) - -set(LIBDEPS LibDeps.txt) -set(LIBDEPS_TMP LibDeps.txt.tmp) -set(FINAL_LIBDEPS FinalLibDeps.txt) -set(LLVM_CONFIG ${LLVM_TOOLS_BINARY_DIR}/llvm-config) -set(LLVM_CONFIG_IN ${CMAKE_CURRENT_BINARY_DIR}/llvm-config.in) - -if( CMAKE_CROSSCOMPILING ) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) -endif() - -find_program(NM_PATH nm PATH_SUFFIXES /bin) - -if( NOT NM_PATH ) - message(FATAL_ERROR "`nm' not found") -endif() - -get_property(llvm_libs GLOBAL PROPERTY LLVM_LIBS) - -add_custom_command(OUTPUT ${LIBDEPS_TMP} - COMMAND ${PERL_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/GenLibDeps.pl -flat ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR} ${NM_PATH} > ${LIBDEPS_TMP} - DEPENDS ${llvm_libs} - COMMENT "Regenerating ${LIBDEPS_TMP}") - -add_custom_command(OUTPUT ${LIBDEPS} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LIBDEPS_TMP} ${LIBDEPS} - DEPENDS ${LIBDEPS_TMP} - COMMENT "Updating ${LIBDEPS} if necessary...") - -# This must stop the build if find-cycles.pl returns error: -add_custom_command(OUTPUT ${FINAL_LIBDEPS} - COMMAND ${CMAKE_COMMAND} -E remove -f ${FINAL_LIBDEPS} ${FINAL_LIBDEPS}.tmp - COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/find-cycles.pl < ${LIBDEPS} > ${FINAL_LIBDEPS}.tmp - COMMAND ${CMAKE_COMMAND} -E copy ${FINAL_LIBDEPS}.tmp ${FINAL_LIBDEPS} - DEPENDS ${LIBDEPS} - COMMENT "Checking for cyclic dependencies between LLVM libraries.") - set(C_FLGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}") set(CXX_FLGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}") set(CPP_FLGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}") -# We don't want certain flags on the output of -# llvm-config --cflags --cxxflags -macro(remove_option_from_llvm_config option) - llvm_replace_compiler_option(C_FLGS "${option}" "") - llvm_replace_compiler_option(CXX_FLGS "${option}" "") - llvm_replace_compiler_option(CPP_FLGS "${option}" "") -endmacro(remove_option_from_llvm_config) -remove_option_from_llvm_config("-pedantic") -remove_option_from_llvm_config("-Wall") -remove_option_from_llvm_config("-W") - -add_custom_command(OUTPUT ${LLVM_CONFIG} - COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! > temp.sed - COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> temp.sed - COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> temp.sed +add_custom_command(OUTPUT ${BUILDVARIABLES_OBJPATH} + COMMAND echo s!@LLVM_SRC_ROOT@!${LLVM_MAIN_SRC_DIR}! > ${SEDSCRIPT_OBJPATH} + COMMAND echo s!@LLVM_OBJ_ROOT@!${LLVM_BINARY_DIR}! >> ${SEDSCRIPT_OBJPATH} + COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! >> ${SEDSCRIPT_OBJPATH} + COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> ${SEDSCRIPT_OBJPATH} + COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> ${SEDSCRIPT_OBJPATH} # TODO: Use general flags for linking! not just for shared libs: - COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> temp.sed - COMMAND echo s!@LIBS@!${LLVM_SYSTEM_LIBS}! >> temp.sed - COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> temp.sed - COMMAND echo s!@LLVM_OBJ_SUFFIX@!! >> temp.sed - COMMAND sed -f temp.sed < ${LLVM_CONFIG_IN} > ${LLVM_CONFIG} - COMMAND ${CMAKE_COMMAND} -E remove -f temp.sed - COMMAND cat ${FINAL_LIBDEPS} >> ${LLVM_CONFIG} - COMMAND chmod +x ${LLVM_CONFIG} + COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> ${SEDSCRIPT_OBJPATH} + COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> ${SEDSCRIPT_OBJPATH} + COMMAND echo s!@LLVM_SYSTEM_LIBS@!${SYSTEM_LIBS}! >> ${SEDSCRIPT_OBJPATH} + COMMAND sed -f ${SEDSCRIPT_OBJPATH} < ${BUILDVARIABLES_SRCPATH} > ${BUILDVARIABLES_OBJPATH} VERBATIM - DEPENDS ${FINAL_LIBDEPS} ${LLVM_CONFIG_IN} - COMMENT "Building llvm-config script." + COMMENT "Building BuildVariables.inc include." ) -add_custom_target(llvm-config.target ALL - DEPENDS ${LLVM_CONFIG}) - -# Ensure we build llvm-config after we build all of the libraries so that we -# have their full dependencies. -add_dependencies(llvm-config.target ${llvm_libs}) +# Add the llvm-config tool. +add_llvm_tool(llvm-config + llvm-config.cpp + ) -install(FILES ${LLVM_CONFIG} - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE - WORLD_READ WORLD_EXECUTE - DESTINATION bin) +# Add the dependency on the generation step. +add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH}) diff --git a/tools/llvm-config/Makefile b/tools/llvm-config/Makefile index 184919ea97..a7a2a63f99 100644 --- a/tools/llvm-config/Makefile +++ b/tools/llvm-config/Makefile @@ -1,5 +1,5 @@ -##===- tools/llvm-config/Makefile --------------------------*- Makefile -*-===## -# +##===- tools/llvm-config/Makefile---------------------------*- Makefile -*-===## +# # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source @@ -7,57 +7,42 @@ # ##===----------------------------------------------------------------------===## -LEVEL = ../.. +LEVEL := ../.. +TOOLNAME := llvm-config +USEDLIBS := LLVMSupport.a |