<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 5.5 構建時為特定目標運行自定義命令 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-5/recipe-05 中找到,其中包含一個Fortran例子。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 本節示例將展示,如何使用`add_custom_command`的第二個參數,來執行沒有輸出的自定義操作,這對于構建或鏈接特定目標之前或之后執行某些操作非常有用。由于自定義命令僅在必須構建目標本身時才執行,因此我們實現了對其執行的目標級控制。我們將通過一個示例來演示,在構建目標之前打印目標的鏈接,然后在編譯后,立即測量編譯后,可執行文件的靜態分配大小。 ## 準備工作 本示例中,我們將使用Fortran代碼(`example.f90`): ```fortran program example implicit none real(8) :: array(20000000) real(8) :: r integer :: i do i = 1, size(array) call random_number(r) array(i) = r end do print *, sum(array) end program ``` 雖然我們選擇了Fortran,但Fortran代碼的對于后面的討論并不重要,因為有很多遺留的Fortran代碼,存在靜態分配大小的問題。 這段代碼中,我們定義了一個包含20,000,000雙精度浮點數的數組,這個數組占用160MB的內存。在這里,我們并不是推薦這樣的編程實踐。一般來說,這些內存的分配和代碼中是否使用這段內存無關。一個更好的方法是只在需要時動態分配數組,隨后立即釋放。 示例代碼用隨機數填充數組,并計算它們的和——這樣是為了確保數組確實被使用,并且編譯器不會優化分配。我們將使用Python腳本(`static-size.py`)來統計二進制文件靜態分配的大小,該腳本用size命令來封裝: ```python import subprocess import sys # for simplicity we do not check number of # arguments and whether the file really exists file_path = sys.argv[-1] try: output = subprocess.check_output(['size', file_path]).decode('utf-8') except FileNotFoundError: print('command "size" is not available on this platform') sys.exit(0) size = 0.0 for line in output.split('\n'): if file_path in line: # we are interested in the 4th number on this line size = int(line.split()[3]) print('{0:.3f} MB'.format(size/1.0e6)) ``` 要打印鏈接行,我們將使用第二個Python helper腳本(`echo-file.py`)打印文件的內容: ```python import sys # for simplicity we do not verify the number and # type of arguments file_path = sys.argv[-1] try: with open(file_path, 'r') as f: print(f.read()) except FileNotFoundError: print('ERROR: file {0} not found'.format(file_path)) ``` ## 具體實施 來看看`CMakeLists.txt`: 1. 首先聲明一個Fortran項目: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-05 LANGUAGES Fortran) ``` 2. 例子依賴于Python解釋器,所以以一種可移植的方式執行helper腳本: ```cmake find_package(PythonInterp REQUIRED) ``` 3. 本例中,默認為“Release”構建類型,以便CMake添加優化標志: ```cmake if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) endif() ``` 4. 現在,定義可執行目標: ```cmake add_executable(example "") target_sources(example PRIVATE example.f90 ) ``` 5. 然后,定義一個自定義命令,在`example`目標在已鏈接之前,打印鏈接行: ```cmake add_custom_command( TARGET example PRE_LINK COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/echo-file.py ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/example.dir/link.txt COMMENT "link line:" VERBATIM ) ``` 6. 測試一下。觀察打印的鏈接行和可執行文件的靜態大小: ```shell $ mkdir -p build $ cd build $ cmake .. $ cmake --build . Scanning dependencies of target example [ 50%] Building Fortran object CMakeFiles/example.dir/example.f90.o [100%] Linking Fortran executable example link line: /usr/bin/f95 -O3 -DNDEBUG -O3 CMakeFiles/example.dir/example.f90.o -o example static size of executable: 160.003 MB [100%] Built target example ``` ## 工作原理 當聲明了庫或可執行目標,就可以使用`add_custom_command`將其他命令鎖定到目標上。這些命令將在特定的時間執行,與它們所附加的目標的執行相關聯。CMake通過以下選項,定制命令執行順序: * **PRE_BUILD**:在執行與目標相關的任何其他規則之前執行的命令。 * **PRE_LINK**:使用此選項,命令在編譯目標之后,調用鏈接器或歸檔器之前執行。Visual Studio 7或更高版本之外的生成器中使用`PRE_BUILD`將被解釋為`PRE_LINK`。 * **POST_BUILD**:如前所述,這些命令將在執行給定目標的所有規則之后運行。 本例中,將兩個自定義命令綁定到可執行目標。`PRE_LINK`命令將`${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/example.dir/link.txt`的內容打印到屏幕上。在我們的例子中,鏈接行是這樣的: ```shell link line: /usr/bin/f95 -O3 -DNDEBUG -O3 CMakeFiles/example.dir/example.f90.o -o example ``` 使用Python包裝器來實現這一點,它依賴于shell命令。 第二步中,`POST_BUILD`自定義命令調用Python helper腳本`static-size.py`,生成器表達式`$<target_file:example>`作為參數。CMake將在生成時(即生成生成系統時)將生成器表達式擴展到目標文件路徑。然后,Python腳本`static-size.py`使用size命令獲取可執行文件的靜態分配大小,將其轉換為MB,并打印結果。我們的例子中,獲得了預期的160 MB: ```shell static size of executable: 160.003 MB ```
                  <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>

                              哎呀哎呀视频在线观看