2016-03-30 14 views
2

Ich habe eine Konsolenanwendung namens "foo", die eine Referenztextdatei als Eingabe (in.txt) und generiert Text bei Standardausgabe (ich möchte dieses Verhalten beibehalten).Wie Umleitung in cmake verwenden add_test

In make (nicht cmake) verwende ich ein Testziel, das foo aufruft und die Ausgabe wie folgt in eine Datei (out.txt) umleitet. Dann benutze ich diff die Datei out.txt mit der erwarteten refernece (ref.txt) zu vergleichen

test: 
    ./foo -a test/in.txt > test/out.txt 
    diff test/out.txt test/ref.txt 

Dies funktioniert gut machen werden. Jetzt ist meine Frage; Wie kann ich cmake verwenden, um ein ähnliches Makefile zu erstellen?

Aus einem subdrectory build genannt, habe ich versucht,

project(foo) 
... 
add_test(NAME test1 COMMAND ./foo ../test/in.txt > ../test/out.txt) 
enable_testing() 

Cmake Version Mit 3.5, ich ein Makefile erhalten, ohne Fehler, aber wenn ich make test nennen, schlägt der Test selbst. Es scheint, dass der Cmake-Befehl add_test Befehlszeilenargumente unterstützt, aber nicht die Umleitung. Ich versuchte Zitate und entkam ohne Erfolg. Da ich diesen Teil nicht bestehen konnte, habe ich nicht versucht, diff zu verwenden. Ich stelle mir nur vor, dass ich Foo und Diff in einer Zeile packen könnte, indem man & verwendet, wie Sie mit bash machen können. Das wäre der zweite Schritt.

Antwort

3

Drehen meines Kommentars in einer Antwort

Wie @Tsyvarev festgestellt hat, CTest Befehle ausgeführt werden, nicht in einem Kontext der Shell. Aber Sie könnten einfach die Shell selbst hinzufügen und z. sh als der Befehl mit add_test() aufgerufen werden.

add_test(NAME test1 COMMAND sh -c "$<TARGET_FILE:foo> ../test/in.txt > ../test/out.txt") 

Diese Lösung ist nicht plattformunabhängig (es in den Suchpfaden zur Verfügung steht, hängt von sh):

Ich habe einige Tests mit dem Beispielcode und die folgende funktionierte erfolgreich ausgeführt werden.


Also, wenn Sie wollen, flexibler sein Sie so etwas wie tun könnte:

include(FindUnixCommands) 

file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/test/in.txt" _in) 
file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/test/out.txt" _out) 
if (BASH) 
    add_test(
     NAME test1 
     COMMAND ${BASH} -c "$<TARGET_FILE:foo> ${_in} > ${_out}" 
    ) 
else() 
    if (WIN32) 
     add_test(
      NAME test1 
      COMMAND ${CMAKE_COMMAND} -E chdir $<TARGET_FILE_DIR:foo> $ENV{ComSpec} /c "$<TARGET_FILE_NAME:foo> ${_in} > ${_out}" 
     ) 
    else() 
     message(FATAL_ERROR "Unknown shell command for ${CMAKE_HOST_SYSTEM_NAME}") 
    endif() 
endif() 

Zusätzlich besteht die Möglichkeit, eine plattformunabhängige diff mit ${CMAKE_COMMAND} -E compare_files <file1> <file2> auszuführen.

add_custom_command(
    TARGET foo 
    POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E echo "Running $<TARGET_FILE_NAME:foo> ..." 
    COMMAND foo in.txt > out.txt 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test 
) 

add_test(
    NAME test1 
    COMMAND ${CMAKE_COMMAND} -E compare_files in.txt out.txt 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test 
) 

Referenzen

+0

Ausgezeichnet! Ich würde nur einen Leitartikel vorschlagen. Als kompletter cmake-Einsteiger war mir nicht klar, dass der letzte Codeblock nicht nur das plattformunabhängige diff einführt, sondern auch eine komplette ** Alternative ** zum Codeblock darstellt, der mit "include" beginnt. Also würde ich vorschlagen, "So könnte man auch etwas wie:" mit "So können Sie das oben mit vereinfachen:" –

+0

@ KağanKayal Gern geschehen. Und danke für den Hinweis. Ich habe den Text entsprechend aktualisiert. – Florian

2

They say Sie können nicht:

Es gibt keine Umleitung von Ausgangs add_test Argumenten.

Im Gegensatz zu Befehlen in add_custom_command, die als Teil der Make-Datei Quittungen ausgeführt werden (das heißt, im Zusammenhang mit einigen Schal), werden die Tests direkt von CTest ausgeführt, ohne Schale beteiligten. Shell-Mechanismen funktionieren also nicht für Tests.

Sie können Wrapper-Skript erstellen, das Programm aufgerufen, als Parameter angegeben, und führt Umleitung, weiter diff und so weiter. Verwenden Sie dann dieses Skript (mit den entsprechenden Argumenten) als COMMAND für add_test.

+1

Nachdem ich [diese] (https: So können Sie Ihre komplette Make-Datei basierend Beispiel in CMake mit vereinfachen : //cmake.org/pipermail/cm ake/2011-May/044502.html) Post, ich dachte, eine Lösung, um das Skript in CMake einbetten könnte - wenn der Punkt nicht Plattformunabhängigkeit ist - nur die Shell selbst benötigt hinzufügen und z. 'sh' als der Befehl, der mit' add_test() 'aufgerufen werden soll. Ich habe gerade @ KağanKayals Beispiel erfolgreich mit 'add_test (NAME test1 BEFEHL sh -c" $ ../test/in.txt> ../ test/out.txt ")' ausgeführt. – Florian

+0

Ja, explizite Aufruf an Shell ist auch eine Option. – Tsyvarev

Verwandte Themen