<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 5.2 配置時運行自定義命令 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-05/recipe-02 中找到。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 運行CMake生成構建系統,從而指定原生構建工具必須執行哪些命令,以及按照什么順序執行。我們已經了解了CMake如何在配置時運行許多子任務,以便找到工作的編譯器和必要的依賴項。本示例中,我們將討論如何使用`execute_process`命令在配置時運行定制化命令。 ## 具體實施 第3章第3節中,我們已經展示了`execute_process`查找Python模塊NumPy時的用法。本例中,我們將使用`execute_process`命令來確定,是否存在特定的Python模塊(本例中為Python CFFI),如果存在,我們在進行版本確定: 1. 對于這個簡單的例子,不需要語言支持: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-02 LANGUAGES NONE) ``` 2. 我們要求Python解釋器執行一個簡短的代碼片段,因此,需要使用`find_package`來查找解釋器: ```cmake find_package(PythonInterp REQUIRED) ``` 3. 然后,調用`execute_process`來運行一個簡短的Python代碼段;下一節中,我們將更詳細地討論這個命令: ```cmake # this is set as variable to prepare # for abstraction using loops or functions set(_module_name "cffi") execute_process( COMMAND ${PYTHON_EXECUTABLE} "-c" "import ${_module_name}; print(${_module_name}.__version__)" OUTPUT_VARIABLE _stdout ERROR_VARIABLE _stderr OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) ``` 4. 然后,打印結果: ```cmake if(_stderr MATCHES "ModuleNotFoundError") message(STATUS "Module ${_module_name} not found") else() message(STATUS "Found module ${_module_name} v${_stdout}") endif() ``` 5. 下面是一個配置示例(假設Python CFFI包安裝在相應的Python環境中): ```shell $ mkdir -p build $ cd build $ cmake .. -- Found PythonInterp: /home/user/cmake-cookbook/chapter-05/recipe-02/example/venv/bin/python (found version "3.6.5") -- Found module cffi v1.11.5 ``` ## 工作原理 `execute_process`命令將從當前正在執行的CMake進程中派生一個或多個子進程,從而提供了在配置項目時運行任意命令的方法。可以在一次調用`execute_process`時執行多個命令。但請注意,每個命令的輸出將通過管道傳輸到下一個命令中。該命令接受多個參數: * WORKING_DIRECTORY,指定應該在哪個目錄中執行命令。 * RESULT_VARIABLE將包含進程運行的結果。這要么是一個整數,表示執行成功,要么是一個帶有錯誤條件的字符串。 * OUTPUT_VARIABLE和ERROR_VARIABLE將包含執行命令的標準輸出和標準錯誤。由于命令的輸出是通過管道傳輸的,因此只有最后一個命令的標準輸出才會保存到OUTPUT_VARIABLE中。 * INPUT_FILE指定標準輸入重定向的文件名 * OUTPUT_FILE指定標準輸出重定向的文件名 * ERROR_FILE指定標準錯誤輸出重定向的文件名 * 設置OUTPUT_QUIET和ERROR_QUIET后,CMake將靜默地忽略標準輸出和標準錯誤。 * 設置OUTPUT_STRIP_TRAILING_WHITESPACE,可以刪除運行命令的標準輸出中的任何尾隨空格 * 設置ERROR_STRIP_TRAILING_WHITESPACE,可以刪除運行命令的錯誤輸出中的任何尾隨空格。 有了這些了解這些參數,回到我們的例子當中: ```cmake set(_module_name "cffi") execute_process( COMMAND ${PYTHON_EXECUTABLE} "-c" "import ${_module_name}; print(${_module_name}.__version__)" OUTPUT_VARIABLE _stdout ERROR_VARIABLE _stderr OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) if(_stderr MATCHES "ModuleNotFoundError") message(STATUS "Module ${_module_name} not found") else() message(STATUS "Found module ${_module_name} v${_stdout}") endif() ``` 該命令檢查`python -c "import cffi; print(cffi.__version__)"`的輸出。如果沒有找到模塊,`_stderr`將包含`ModuleNotFoundError`,我們將在if語句中對其進行檢查。本例中,我們將打印`Module cffi not found`。如果導入成功,Python代碼將打印模塊的版本,該模塊通過管道輸入`_stdout`,這樣就可以打印如下內容: ```cmake message(STATUS "Found module ${_module_name} v${_stdout}") ``` ## 更多信息 本例中,只打印了結果,但實際項目中,可以警告、中止配置,或者設置可以查詢的變量,來切換某些配置選項。 代碼示例會擴展到多個Python模塊(如Cython),以避免代碼重復。一種選擇是使用`foreach`循環模塊名,另一種方法是將代碼封裝為函數或宏。我們將在第7章中討論這些封裝。 第9章中,我們將使用Python CFFI和Cython。現在的示例,可以作為有用的、可重用的代碼片段,來檢測這些包是否存在。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看