2017-08-25 3 views
0

Wir haben Probleme mit einem fehlerhaften CMake, der auf MinGW und MinGW-64 aufbaut. Unser Projekt ist eine C++ Bibliothek. Unser CMakeLists.txt hat einen Block wie unten. Der Block identifiziert die Zielplattform durch den Compiler (andere Verfahren zu unzuverlässig sind, vor allem auf ARM, MIPS und PPC):Die Variable ist nach dem Ausführen des Befehls auf MinGW und MinGW-64 leer?

set(SHELL_CMD sh -c) 
set(GREP_CMD egrep -i -c) 

execute_process(COMMAND ${SHELL_CMD} "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
    COMMAND ${GREP_CMD} "amd64" 
    OUTPUT_VARIABLE CRYPTOPP_AMD64 
    OUTPUT_STRIP_TRAILING_WHITESPACE) 

... 

# http://github.com/weidai11/cryptopp/issues/466 
execute_process(COMMAND ${SHELL_CMD} "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
    COMMAND ${GREP_CMD} "mingw32" 
    OUTPUT_VARIABLE CRYPTOPP_MINGW32 
    OUTPUT_STRIP_TRAILING_WHITESPACE) 

# http://github.com/weidai11/cryptopp/issues/466 
execute_process(COMMAND ${SHELL_CMD} "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
    COMMAND ${GREP_CMD} "w64-mingw32" 
    OUTPUT_VARIABLE CRYPTOPP_MINGW64 
OUTPUT_STRIP_TRAILING_WHITESPACE) 

es auf 9 von 11 Plattformen erfolgreich ist, aber nicht für MinGW und MinGW-64. Folgendes auf MinGW-64 aus unserer bug report das Problem Tracking:

execute_process(COMMAND ${SHELL_CMD} "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
    COMMAND ${GREP_CMD} "w64-mingw32" 
    OUTPUT_VARIABLE CRYPTOPP_MINGW64 
OUTPUT_STRIP_TRAILING_WHITESPACE) 

message(STATUS ${CRYPTOPP_MINGW64}) 

execute_process(COMMAND ${SHELL_CMD} "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
    COMMAND ${GREP_CMD} "mingw32" 
    OUTPUT_VARIABLE CRYPTOPP_MINGW32 
OUTPUT_STRIP_TRAILING_WHITESPACE) 

message(STATUS ${CRYPTOPP_MINGW32}) 

Die Aussagen eine leere Nachricht zu erzeugen. Das Entfernen von OUTPUT_STRIP_TRAILING_WHITESPACE hat keine Auswirkungen auf das Problem. Und das Ausführen von c++ -dumpmachine | egrep -i -c w64-mingw32 vom MinGW-Terminal führt zu erwarteten Ergebnissen.

Wir haben gefunden CMAKE_COMPILER_IS_GNUCXX and CMAKE_CXX_COMPILER_ID are empty, aber es scheint nicht zutreffen, da der Compiler in unserem Fall festgelegt ist. (Es ist das einzige andere "cmake leere Variable mingw", die wir gefunden haben).

Leider weiß ich nicht, welche Version von Cmake verwendet wird. Unser bug report enthält den CMake-Ausgang, aber CMake kann seine Versionsnummern nicht drucken.

Warum kann CMake die Variablen CRYPTOPP_MINGW64 und CRYPTOPP_MINGW32 nicht auf MinGW und MinGW-64 setzen?


Hier ist eine typische Ausgabe von CMake während der Konfiguration.

Antwort

2

Sie müssen Ihre Argumente von den Befehlen trennen.

set(SHELL_CMD sh) 
set(SHELL_CMD_ARGS "-c") 
set(GREP_CMD egrep) 
set(GREP_CMD_ARGS "-i -c") 

execute_process(COMMAND ${SHELL_CMD} "${SHELL_CMD_ARGS} ${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
+0

Dank @vre. Lass mich es versuchen. Leider habe ich keine MinGW-Maschine zum Testen, also muss ich jemand anderen bitten, den Test durchzuführen. Aber ich kann die Veränderung auf den anderen Plattformen testen. – jww

+0

Eine andere Frage (wenn es Ihnen nichts ausmacht): Sollten die Argumente getrennt zitiert werden? "Execute_process (COMMAND" $ {SHELL_CMD} "" $ {SHELL_CMD_ARGS} "" $ {CMAKE_CXX_COMPILER} "" -dumpmachine "" 2> & 1 "'? Die CMake-Dokumente für [execute_process] (https://cmake.org /cmake/help/v3.0/command/execute_process.html) erkläre die Dinge nicht sehr gut und biete keine Beispiele an (* qv *). – jww

+0

Es scheint, dass das Dokumentationsproblem seit Jahren existiert.Hier ist ein Beispiel für das Problem datiert aus dem Jahr 2011: [Cmake execute_process() immer irgendwie „Keine solche Datei oder das Verzeichnis“, wenn ich git nennen] (https://stackoverflow.com/q/6797395/608639). Es verwirrt mich, wenn ein Projekt seine Dokumentation nicht repariert. Was ist der Sinn dafür, dass Benutzer Jahr für Jahr immer wieder die gleichen Fehler machen? – jww

1

Das Problem erwies sich die Verwendung von SHELL_CMD, sh -c und Positionsargumente zu sein. Zuerst muss SHELL_CMD nur sh sein. Zweitens musste das Argument -c dem Befehl separat folgen. Drittens mussten wir die gesamte Zeichenfolge zitieren. Siehe auch Why doesn't echo called as /bin/sh -c echo foo output anything? unter Unix & Linux Stack Exchange.

Wir wissen nicht, woher die Verwendung von sh stammt. Wir vermuten, dass es zusammen zurückgestapelt wurde, als und der Crust blieb, bis es ein Problem verursachte. Es sollte wahrscheinlich auf allen Plattformen gescheitert sein. Wir wissen immer noch nicht, ob 2>&1 korrekt ist. Seine unglücklichen CMake-Dokumente für execute_process sind nicht gut erklärt und bieten keine Beispiele.

Wir haben unseren Zielerkennungscode wie folgt geändert. Der Code zitiert jetzt das Argument sh, um Probleme mit der Übergabe von Argumenten zu vermeiden.

function(DumpMachine output pattern) 
    execute_process(
     COMMAND sh -c "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 
     COMMAND egrep -i -c "${pattern}" 
     OUTPUT_VARIABLE ${output} 
     OUTPUT_STRIP_TRAILING_WHITESPACE) 
    set(${output} "${${output}}" PARENT_SCOPE) 
endfunction(DumpMachine) 

DumpMachine(CRYPTOPP_AMD64 "amd64|x86_64") 
DumpMachine(CRYPTOPP_I386 "i.86") 
DumpMachine(CRYPTOPP_MINGW32 "\\<mingw32\\>") 
DumpMachine(CRYPTOPP_MINGW64 "w64-mingw32|mingw64") 
DumpMachine(CRYPTOPP_X32 "x32") 
DumpMachine(CRYPTOPP_AARCH32 "Aarch32") 
DumpMachine(CRYPTOPP_AARCH64 "Aarch64") 
DumpMachine(CRYPTOPP_ARM "\\<arm\\>|armhf|arm7l") 
Verwandte Themen