[LLVMdev] build failure on mingw gcc 4.9.1

Mueller-Roemer, Johannes Sebastian Johannes.Sebastian.Mueller-Roemer at igd.fraunhofer.de
Wed Jan 28 00:12:42 PST 2015


That really is horrible…

Here’s basically the same thing but on the CMake side of things. It works but it ain’t pretty:

if(MINGW OR CYGWIN)
                function(get_newest_msvcrt OUTVAR)
                               file(TO_CMAKE_PATH $ENV{WINDIR} WINDIR)
                               file(GLOB INSTALLED_MSVCRT_RUNTIMES "${WINDIR}/System32/msvcr*.dll")
                               set(INSTALLED_MSVCRT_NAMES)
                               foreach(MSVCRT ${INSTALLED_MSVCRT_RUNTIMES})
                                               get_filename_component(MSVCRT ${MSVCRT} NAME_WE)
                                               list(APPEND INSTALLED_MSVCRT_NAMES ${MSVCRT})
                               endforeach()
                               foreach(VERSION 110 100 90) # try newest first
                                               list(FIND INSTALLED_MSVCRT_NAMES "msvcr${VERSION}" INDEX)
                                               if(INDEX GREATER -1)
                                                               set(${OUTVAR} ${VERSION} PARENT_SCOPE)
                                                               return()
                                               endif()
                               endforeach()
                               message(FATAL_ERROR "No compatible MSVCRT runtime installed")
                endfunction()
                get_newest_msvcrt(NEWEST_MSVCRT)
                foreach(LANG C CXX)
                               set(CMAKE_${LANG}_FLAGS "${CMAKE_${LANG}_FLAGS} -D__MSVCRT_VERSION__=0x${NEWEST_MSVCRT}0")
                               set(CMAKE_${LANG}_STANDARD_LIBRARIES "${CMAKE_${LANG}_STANDARD_LIBRARIES} -lmsvcr${NEWEST_MSVCRT}")
                endforeach()
endif()

The MSVCRT version to use could also be an editable cache variable.
I could create a phabricator patch if you are ok with this solution.

--
Johannes S. Mueller-Roemer, MSc
Wiss. Mitarbeiter - Interactive Engineering Technologies (IET)

Fraunhofer-Institut für Graphische Datenverarbeitung IGD
Fraunhoferstr. 5  |  64283 Darmstadt  |  Germany
Tel +49 6151 155-606  |  Fax +49 6151 155-139
johannes.mueller-roemer at igd.fraunhofer.de  |  www.igd.fraunhofer.de

From: Reid Kleckner [mailto:rnk at google.com]
Sent: Tuesday, January 27, 2015 23:29
To: Michael Spencer
Cc: Mueller-Roemer, Johannes Sebastian; llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] build failure on mingw gcc 4.9.1

On Tue, Jan 27, 2015 at 2:45 AM, Michael Spencer <bigcheesegs at gmail.com<mailto:bigcheesegs at gmail.com>> wrote:
On Tue, Jan 27, 2015 at 10:02 AM, Mueller-Roemer, Johannes Sebastian
<Johannes.Sebastian.Mueller-Roemer at igd.fraunhofer.de<mailto:Johannes.Sebastian.Mueller-Roemer at igd.fraunhofer.de>> wrote:
> Adding -D__MSVCRT_VERSION__=0x900 (or higher) to CMAKE_CXX_FLAGS and
> -lmsvcr90 (or higher) to CMAKE_CXX_STANDARD_LIBRARIES appears to work.
> -lmsvcrt80 does not work, contrary to the comment on the MinGW bug tracker.
> However, if you do not have the runtimes installed, errors will occur later
> on in the build process, such as:
>
> [215/1199] Building Intrinsics.gen...
>
> FAILED: cmd.exe /c cd D:\Slave\llvm-mingw\buildMinGW\include\llvm\IR &&
> D:\Slave\llvm-mingw\buildMinGW\bin\llvm-tblgen.exe -gen-intrinsic -I
> D:/Slave/llvm-mingw/build/include/llvm/IR -I
> D:/Slave/llvm-mingw/build/lib/Target -I D:/Slave/llvm-mingw/build/include
> D:/Slave/llvm-mingw/build/include/llvm/IR/Intrinsics.td -o
> D:/Slave/llvm-mingw/buildMinGW/include/llvm/IR/Intrinsics.gen.tmp
>
>
>
> As I do not have administrative privileges on the machine, I switched to
> MSVCRT100, as those runtimes were already installed. Which leads me to the
> question: Should the exact MSVCRT version be selectable or should the lowest
> version necessary (9.0) be used?
>

Is there any way for CMake to detect which version of MSVCRT is
present? Otherwise there's really no default we can give. If not, then
we'll have to disable the error UI suppression on mingw.

On MinGW, we could use GetProcAddress and GetModuleHandle(dllname) for all dll names in { "msvcrt120", "msvcrt110", ... }, as horrible as that is.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150128/90544f47/attachment.html>


More information about the llvm-dev mailing list