[llvm] r260263 - llvm-config: Add preliminary Windows support

Ehsan Akhgari via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 9 11:41:15 PST 2016


Author: ehsan
Date: Tue Feb  9 13:41:14 2016
New Revision: 260263

URL: http://llvm.org/viewvc/llvm-project?rev=260263&view=rev
Log:
llvm-config: Add preliminary Windows support

Summary:
This patch adds Windows support for a few of the llvm-config commands,
including cflags, ldflags, libs, and system-libs.

Currently llvm-config is untested, so this patch adds tests for the
commands that it fixes as well.

Reviewers: rnk

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D16762

Added:
    llvm/trunk/test/tools/llvm-config/
    llvm/trunk/test/tools/llvm-config/cflags.test
    llvm/trunk/test/tools/llvm-config/ldflags.test
    llvm/trunk/test/tools/llvm-config/libs.test
    llvm/trunk/test/tools/llvm-config/system-libs.test
    llvm/trunk/test/tools/llvm-config/system-libs.windows.test
Modified:
    llvm/trunk/lib/Support/CMakeLists.txt
    llvm/trunk/tools/llvm-config/CMakeLists.txt
    llvm/trunk/tools/llvm-config/llvm-config.cpp
    llvm/trunk/utils/llvm-build/llvmbuild/main.py

Modified: llvm/trunk/lib/Support/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=260263&r1=260262&r2=260263&view=diff
==============================================================================
--- llvm/trunk/lib/Support/CMakeLists.txt (original)
+++ llvm/trunk/lib/Support/CMakeLists.txt Tue Feb  9 13:41:14 2016
@@ -1,32 +1,30 @@
 set(system_libs)
-if( NOT MSVC )
-  if( MINGW )
-    # libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
-    set(system_libs ${system_libs} psapi shell32 ole32 uuid)
-  elseif( CMAKE_HOST_UNIX )
-    if( HAVE_LIBRT )
-      set(system_libs ${system_libs} rt)
-    endif()
-    if( HAVE_LIBDL )
-      set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
-    endif()
-    if(LLVM_ENABLE_TERMINFO)
-      if(HAVE_TERMINFO)
-        set(system_libs ${system_libs} ${TERMINFO_LIBS})
-      endif()
-    endif()
-    if( LLVM_ENABLE_THREADS AND HAVE_LIBATOMIC )
-      set(system_libs ${system_libs} atomic)
-    endif()
-    if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD )
-      set(system_libs ${system_libs} pthread)
-    endif()
-    if ( LLVM_ENABLE_ZLIB AND HAVE_LIBZ )
-      set(system_libs ${system_libs} z)
-    endif()
-    set(system_libs ${system_libs} m)
-  endif( MINGW )
-endif( NOT MSVC )
+if( MSVC OR MINGW )
+  # libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
+  set(system_libs ${system_libs} psapi shell32 ole32 uuid)
+elseif( CMAKE_HOST_UNIX )
+  if( HAVE_LIBRT )
+    set(system_libs ${system_libs} rt)
+  endif()
+  if( HAVE_LIBDL )
+    set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
+  endif()
+  if(LLVM_ENABLE_TERMINFO)
+    if(HAVE_TERMINFO)
+      set(system_libs ${system_libs} ${TERMINFO_LIBS})
+    endif()
+  endif()
+  if( LLVM_ENABLE_THREADS AND HAVE_LIBATOMIC )
+    set(system_libs ${system_libs} atomic)
+  endif()
+  if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD )
+    set(system_libs ${system_libs} pthread)
+  endif()
+  if ( LLVM_ENABLE_ZLIB AND HAVE_LIBZ )
+    set(system_libs ${system_libs} z)
+  endif()
+  set(system_libs ${system_libs} m)
+endif( MSVC OR MINGW )
 
 add_llvm_library(LLVMSupport
   APFloat.cpp

Added: llvm/trunk/test/tools/llvm-config/cflags.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-config/cflags.test?rev=260263&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-config/cflags.test (added)
+++ llvm/trunk/test/tools/llvm-config/cflags.test Tue Feb  9 13:41:14 2016
@@ -0,0 +1,7 @@
+RUN: llvm-config --cflags 2>&1 | FileCheck %s
+RUN: llvm-config --cppflags 2>&1 | FileCheck %s
+RUN: llvm-config --cxxflags 2>&1 | FileCheck %s
+CHECK: -I
+CHECK: {{[/\\]}}include
+CHECK-NOT: error
+CHECK-NOT: warning

Added: llvm/trunk/test/tools/llvm-config/ldflags.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-config/ldflags.test?rev=260263&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-config/ldflags.test (added)
+++ llvm/trunk/test/tools/llvm-config/ldflags.test Tue Feb  9 13:41:14 2016
@@ -0,0 +1,5 @@
+RUN: llvm-config --ldflags 2>&1 | FileCheck %s
+CHECK: -L
+CHECK: {{[/\\]}}lib
+CHECK-NOT: error
+CHECK-NOT: warning

Added: llvm/trunk/test/tools/llvm-config/libs.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-config/libs.test?rev=260263&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-config/libs.test (added)
+++ llvm/trunk/test/tools/llvm-config/libs.test Tue Feb  9 13:41:14 2016
@@ -0,0 +1,5 @@
+RUN: llvm-config --libs core 2>&1 | FileCheck %s
+CHECK: LLVMCore
+CHECK: LLVMSupport
+CHECK-NOT: error
+CHECK-NOT: warning

Added: llvm/trunk/test/tools/llvm-config/system-libs.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-config/system-libs.test?rev=260263&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-config/system-libs.test (added)
+++ llvm/trunk/test/tools/llvm-config/system-libs.test Tue Feb  9 13:41:14 2016
@@ -0,0 +1,5 @@
+RUN: llvm-config --system-libs 2>&1 | FileCheck %s
+UNSUPPORTED: system-windows
+CHECK: -l
+CHECK-NOT: error
+CHECK-NOT: warning

Added: llvm/trunk/test/tools/llvm-config/system-libs.windows.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-config/system-libs.windows.test?rev=260263&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-config/system-libs.windows.test (added)
+++ llvm/trunk/test/tools/llvm-config/system-libs.windows.test Tue Feb  9 13:41:14 2016
@@ -0,0 +1,6 @@
+RUN: llvm-config --system-libs 2>&1 | FileCheck %s
+REQUIRED: system-windows
+CHECK-NOT: -l
+CHECK: psapi.lib shell32.lib ole32.lib uuid.lib
+CHECK-NOT: error
+CHECK-NOT: warning

Modified: llvm/trunk/tools/llvm-config/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-config/CMakeLists.txt?rev=260263&r1=260262&r2=260263&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-config/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-config/CMakeLists.txt Tue Feb  9 13:41:14 2016
@@ -11,7 +11,11 @@ add_llvm_tool(llvm-config
 # Compute the substitution values for various items.
 get_property(LLVM_SYSTEM_LIBS_LIST TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS)
 foreach(l ${LLVM_SYSTEM_LIBS_LIST})
-  set(SYSTEM_LIBS ${SYSTEM_LIBS} "-l${l}")
+  if(MSVC)
+    set(SYSTEM_LIBS ${SYSTEM_LIBS} "${l}.lib")
+  else()
+    set(SYSTEM_LIBS ${SYSTEM_LIBS} "-l${l}")
+  endif()
 endforeach()
 string(REPLACE ";" " " SYSTEM_LIBS "${SYSTEM_LIBS}")
 

Modified: llvm/trunk/tools/llvm-config/llvm-config.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-config/llvm-config.cpp?rev=260263&r1=260262&r2=260263&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-config/llvm-config.cpp (original)
+++ llvm/trunk/tools/llvm-config/llvm-config.cpp Tue Feb  9 13:41:14 2016
@@ -79,7 +79,8 @@ static void VisitComponent(const std::st
                            bool IncludeNonInstalled, bool GetComponentNames,
                            const std::function<std::string(const StringRef &)>
                                *GetComponentLibraryPath,
-                           std::vector<std::string> *Missing) {
+                           std::vector<std::string> *Missing,
+                           const std::string &DirSep) {
   // Lookup the component.
   AvailableComponent *AC = ComponentMap.lookup(Name);
   assert(AC && "Invalid component name!");
@@ -98,7 +99,7 @@ static void VisitComponent(const std::st
   for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) {
     VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents,
                    RequiredLibs, IncludeNonInstalled, GetComponentNames,
-                   GetComponentLibraryPath, Missing);
+                   GetComponentLibraryPath, Missing, DirSep);
   }
 
   if (GetComponentNames) {
@@ -110,6 +111,9 @@ static void VisitComponent(const std::st
   if (AC->Library) {
     if (Missing && GetComponentLibraryPath) {
       std::string path = (*GetComponentLibraryPath)(AC->Library);
+      if (DirSep == "\\") {
+        std::replace(path.begin(), path.end(), '/', '\\');
+      }
       if (!sys::fs::exists(path))
         Missing->push_back(path);
     }
@@ -125,12 +129,11 @@ static void VisitComponent(const std::st
 /// \param IncludeNonInstalled - Whether non-installed components should be
 /// reported.
 /// \param GetComponentNames - True if one would prefer the component names.
-static std::vector<std::string>
-ComputeLibsForComponents(const std::vector<StringRef> &Components,
-                         bool IncludeNonInstalled, bool GetComponentNames,
-                         const std::function<std::string(const StringRef &)>
-                             *GetComponentLibraryPath,
-                         std::vector<std::string> *Missing) {
+static std::vector<std::string> ComputeLibsForComponents(
+    const std::vector<StringRef> &Components, bool IncludeNonInstalled,
+    bool GetComponentNames, const std::function<std::string(const StringRef &)>
+                                *GetComponentLibraryPath,
+    std::vector<std::string> *Missing, const std::string &DirSep) {
   std::vector<std::string> RequiredLibs;
   std::set<AvailableComponent *> VisitedComponents;
 
@@ -155,7 +158,7 @@ ComputeLibsForComponents(const std::vect
 
     VisitComponent(ComponentLower, ComponentMap, VisitedComponents,
                    RequiredLibs, IncludeNonInstalled, GetComponentNames,
-                   GetComponentLibraryPath, Missing);
+                   GetComponentLibraryPath, Missing, DirSep);
   }
 
   // The list is now ordered with leafs first, we want the libraries to printed
@@ -220,7 +223,8 @@ std::string GetExecutablePath(const char
 /// \brief Expand the semi-colon delimited LLVM_DYLIB_COMPONENTS into
 /// the full list of components.
 std::vector<std::string> GetAllDyLibComponents(const bool IsInDevelopmentTree,
-                                               const bool GetComponentNames) {
+                                               const bool GetComponentNames,
+                                               const std::string &DirSep) {
   std::vector<StringRef> DyLibComponents;
 
   StringRef DyLibComponentsStr(LLVM_DYLIB_COMPONENTS);
@@ -238,7 +242,7 @@ std::vector<std::string> GetAllDyLibComp
 
   return ComputeLibsForComponents(DyLibComponents,
                                   /*IncludeNonInstalled=*/IsInDevelopmentTree,
-                                  GetComponentNames, nullptr, nullptr);
+                                  GetComponentNames, nullptr, nullptr, DirSep);
 }
 
 int main(int argc, char **argv) {
@@ -347,15 +351,26 @@ int main(int argc, char **argv) {
   /// in the first place. This can't be done at configure/build time.
 
   StringRef SharedExt, SharedVersionedExt, SharedDir, SharedPrefix, StaticExt,
-      StaticPrefix, StaticDir = "lib";
+      StaticPrefix, StaticDir = "lib", DirSep = "/";
   const Triple HostTriple(Triple::normalize(LLVM_DEFAULT_TARGET_TRIPLE));
   if (HostTriple.isOSWindows()) {
     SharedExt = "dll";
     SharedVersionedExt = LLVM_DYLIB_VERSION ".dll";
-    StaticExt = "a";
+    if (HostTriple.isOSCygMing()) {
+      StaticExt = "a";
+      StaticPrefix = SharedPrefix = "lib";
+    } else {
+      StaticExt = "lib";
+      DirSep = "\\";
+      std::replace(ActiveObjRoot.begin(), ActiveObjRoot.end(), '/', '\\');
+      std::replace(ActivePrefix.begin(), ActivePrefix.end(), '/', '\\');
+      std::replace(ActiveBinDir.begin(), ActiveBinDir.end(), '/', '\\');
+      std::replace(ActiveLibDir.begin(), ActiveLibDir.end(), '/', '\\');
+      std::replace(ActiveIncludeOption.begin(), ActiveIncludeOption.end(), '/',
+                   '\\');
+    }
     SharedDir = ActiveBinDir;
     StaticDir = ActiveLibDir;
-    StaticPrefix = SharedPrefix = "lib";
   } else if (HostTriple.isOSDarwin()) {
     SharedExt = "dylib";
     SharedVersionedExt = LLVM_DYLIB_VERSION ".dylib";
@@ -394,7 +409,11 @@ int main(int argc, char **argv) {
   bool LinkDyLib = (std::strcmp(LLVM_LINK_DYLIB, "ON") == 0);
 
   if (BuiltDyLib) {
-    DyLibExists = sys::fs::exists(SharedDir + "/" + DyLibName);
+    std::string path((SharedDir + DirSep + DyLibName).str());
+    if (DirSep == "\\") {
+      std::replace(path.begin(), path.end(), '/', '\\');
+    }
+    DyLibExists = sys::fs::exists(path);
     if (!DyLibExists) {
       // The shared library does not exist: don't error unless the user
       // explicitly passes --link-shared.
@@ -429,15 +448,12 @@ int main(int argc, char **argv) {
   /// Maps Unixizms to the host platform.
   auto GetComponentLibraryFileName = [&](const StringRef &Lib,
                                          const bool Shared) {
-    std::string LibFileName = Lib;
-    StringRef LibName;
-    if (GetComponentLibraryNameSlice(Lib, LibName)) {
-      if (Shared) {
-        LibFileName = (SharedPrefix + LibName + "." + SharedExt).str();
-      } else {
-        // default to static
-        LibFileName = (StaticPrefix + LibName + "." + StaticExt).str();
-      }
+    std::string LibFileName;
+    if (Shared) {
+      LibFileName = (SharedPrefix + Lib + "." + SharedExt).str();
+    } else {
+      // default to static
+      LibFileName = (StaticPrefix + Lib + "." + StaticExt).str();
     }
 
     return LibFileName;
@@ -446,9 +462,9 @@ int main(int argc, char **argv) {
   auto GetComponentLibraryPath = [&](const StringRef &Name, const bool Shared) {
     auto LibFileName = GetComponentLibraryFileName(Name, Shared);
     if (Shared) {
-      return (SharedDir + "/" + LibFileName).str();
+      return (SharedDir + DirSep + LibFileName).str();
     } else {
-      return (StaticDir + "/" + LibFileName).str();
+      return (StaticDir + DirSep + LibFileName).str();
     }
   };
 
@@ -475,7 +491,8 @@ int main(int argc, char **argv) {
       } else if (Arg == "--cxxflags") {
         OS << ActiveIncludeOption << ' ' << LLVM_CXXFLAGS << '\n';
       } else if (Arg == "--ldflags") {
-        OS << "-L" << ActiveLibDir << ' ' << LLVM_LDFLAGS << '\n';
+        OS << ((HostTriple.isWindowsMSVCEnvironment()) ? "-LIBPATH:" : "-L")
+           << ActiveLibDir << ' ' << LLVM_LDFLAGS << '\n';
       } else if (Arg == "--system-libs") {
         PrintSystemLibs = true;
       } else if (Arg == "--libs") {
@@ -496,10 +513,14 @@ int main(int argc, char **argv) {
 
           Components.push_back(AvailableComponents[j].Name);
           if (AvailableComponents[j].Library && !IsInDevelopmentTree) {
-            if (DyLibExists &&
-                !sys::fs::exists(GetComponentLibraryPath(
-                    AvailableComponents[j].Library, false))) {
-              Components = GetAllDyLibComponents(IsInDevelopmentTree, true);
+            std::string path(
+                GetComponentLibraryPath(AvailableComponents[j].Library, false));
+            if (DirSep == "\\") {
+              std::replace(path.begin(), path.end(), '/', '\\');
+            }
+            if (DyLibExists && !sys::fs::exists(path)) {
+              Components =
+                  GetAllDyLibComponents(IsInDevelopmentTree, true, DirSep);
               std::sort(Components.begin(), Components.end());
               break;
             }
@@ -577,7 +598,7 @@ int main(int argc, char **argv) {
     std::vector<std::string> RequiredLibs = ComputeLibsForComponents(
         Components,
         /*IncludeNonInstalled=*/IsInDevelopmentTree, false,
-        &GetComponentLibraryPathFunction, &MissingLibs);
+        &GetComponentLibraryPathFunction, &MissingLibs, DirSep);
     if (!MissingLibs.empty()) {
       switch (LinkMode) {
       case LinkModeShared:
@@ -607,7 +628,7 @@ int main(int argc, char **argv) {
     if (PrintSharedMode) {
       std::unordered_set<std::string> FullDyLibComponents;
       std::vector<std::string> DyLibComponents =
-          GetAllDyLibComponents(IsInDevelopmentTree, false);
+          GetAllDyLibComponents(IsInDevelopmentTree, false, DirSep);
 
       for (auto &Component : DyLibComponents) {
         FullDyLibComponents.insert(Component);

Modified: llvm/trunk/utils/llvm-build/llvmbuild/main.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/llvm-build/llvmbuild/main.py?rev=260263&r1=260262&r2=260263&view=diff
==============================================================================
--- llvm/trunk/utils/llvm-build/llvmbuild/main.py (original)
+++ llvm/trunk/utils/llvm-build/llvmbuild/main.py Tue Feb  9 13:41:14 2016
@@ -413,7 +413,7 @@ subdirectories = %s
             if library_name is None:
                 library_name_as_cstr = 'nullptr'
             else:
-                library_name_as_cstr = '"lib%s.a"' % library_name
+                library_name_as_cstr = '"%s"' % library_name
             if is_installed:
                 is_installed_as_cstr = 'true'
             else:




More information about the llvm-commits mailing list