[solved] Preprocessor Symbol via Kommandozeile an MsBuild (oder cmake) übergeben



  • Hallo zusammen,

    ich möchte libssh2 mit zlib auf einem Windowssystem mit VS2017 über ein Bash Skript kompilieren.

    libssh2 hat vorgefertigte CMakeList.txt Dateien, an die ich die Pfade zu den benötigten Bibliotheken übergeben kann.
    Anschließend kann ich mit cmake --build oder msbuild die von CMake erstelle Solution kompilieren.

    Das funktioniert auch soweit. Aber für zlib muss ZLIB_WINAPI definiert sein.
    Eigentlich möchte ich das über mein Skript einfach als Paramter übergeben, entweder an cmake oder an msBuild.
    Versucht habe ich zum Beispiel für cmake

    cmake -DCMAKE_CXX_FLAGS='/DZLIB_WINAPI ${CMAKE_CXX_FLAGS}'
    

    oder vor dem cmake Aufruf

    export CXXFLAGS="-DZLIB_WINAPI=1"
    

    oder für msBuild

    msBuild solution.sln /property:DefineConstants=ZLIB_WINAPI
    

    Aber leider funktioniert davon nichts.

    Meine aktuelle Lösung ist, dass ich eine Property Datei anlege mit:

    <?xml version="1.0" encoding="utf-8"?> 
    <?xml version="1.0" encoding="utf-8"?> 
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    	<ItemDefinitionGroup>
    		<ClCompile>
    			<AdditionalOptions>/DZLIB_WINAPI=1 %(AdditionalOptions)</AdditionalOptions>
    		</ClCompile>
    	</ItemDefinitionGroup>
    </Project>
    

    und das via

    msbuild solution.sln /property:ForceImportBeforeCppTargets=%path_to_file%
    

    kompiliert. Aber, wie gesagt, lieber hätte ich, wenn das über einen Parameter ging.
    Habt ihr da noch eine Idee?



  • @Schlangenmensch
    Hast du es probiert wie hier beschrieben?
    https://stackoverflow.com/questions/44284275/passing-compiler-options-cmake
    Also cmake -E env CFLAGS="-DFOO=123" cmake ...

    Wichtig dabei: CMake erzeugt beim ersten Durchlauf seine Cache-Files, wo die Default-Switches mit abgespeichert werden. D.h. wenn du es erst ohne die passenden Switches probierst, dann wird es nicht funktionieren bis du händisch die CMake Cache-Files löscht. Wenn du "out of source" Builds verwendest: einfach das gesamte Build Verzeichnis löschen und "frisch" anfangen.


    Davon abgesehen: zlib supportet ZLIB_WINAPI einfach nicht brauchbar. Damit es ohne Kopfschmerzen funktioniert müsste es mMn. in conf.h "hinein-configured" werden (egal ob jetzt über die Autotools oder über CMake). Sonst muss jedes Programm das die ZLib verwendet auch wieder selbst dafür sorgen dass überall ZLIB_WINAPI definiert ist bevor ein ZLib Header File inkludiert wird. Was nicht so toll ist.



  • Ne, die Variante hab ich heute noch nicht versucht / gefunden. Werde ich morgen früh als erstes probieren.

    Aktuell hängt mein Projekt nicht direkt von zlib ab, dass wird "nur" von anderen Bibliotheken, die ich benötige, verwendet. Daher reicht mir vorerst, dass über das Flag zu lösen.



  • @hustbaer Top, funktioniert. Vielen Dank!


Log in to reply