hellozapi專案CMake編譯指令碼詳解-CPP開發PHP之旅第二節

zendapi發表於2019-02-16

原文連結:http://www.zendapi.org/manual…

因為 zendAPI 採用的是 CMake 進行編譯,所以我們的 hellozapi 專案也採用 CMake 進行編譯,但是如果您有更擅長的 build system 您也可以按照自己的情況進行選擇。只要您能保證能正常的找到 zendAPI 的標頭檔案,PHP 的標頭檔案和 zendAPI 的動態連結庫即可。

hellozapi 專案 CMake 編譯指令碼整體程式碼

cmake_minimum_required(VERSION 3.4.3 FATAL_ERROR)
project(hellozapi CXX)
set(CMAKE_CXX_STANDARD 11)
# register zapi cmake modules, you must modify 
# this according to your self zapi install prefix 
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/zapi")
# here find zendAPI lib
find_package(zendAPI 0.0.1 EXACT REQUIRED CONFIG)
add_library(hellozapi MODULE 
    hellozapi/defs.h
    hellozapi/defs.cpp
    hellozapi/entry.cpp)
set_target_properties(hellozapi PROPERTIES 
    OUTPUT_NAME hellozapi
    PREFIX "")
target_link_libraries(hellozapi ${ZAPI_LIBRARY})
install(TARGETS hellozapi DESTINATION ${ZAPI_PHP_EXTENSION_DIR})

CMake 編譯指令碼逐行解說

cmake_minimum_required(VERSION 3.4.3 FATAL_ERROR)

我們推薦的 CMake 版本是 3.4.3, 這裡如果您的版本低於 3.4.3 的話,CMake 會報錯。

project(hellozapi CXX)

這裡我們定義我們的專案名稱為 hellozapi, 使用的程式語言為 CXX

set(CMAKE_CXX_STANDARD 11)

基於 zendAPI 的擴充套件開發必須開啟 c++11 標準的選項,否則在編譯的時候我們的 build system 會報錯。這行程式碼的意思就是指示編譯器使用 c++11 的標準對程式碼進行編譯。

list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/zapi")

在我們進行編譯 zendAPI 庫的時候我們匯出了 zapiCMake Targets,設定了這個 Target 的一些很重要的屬性,這些檔案我們都安裝在 zendAPI 的安裝路徑下,比如在我的 MacOS 環境下,zendAPI 安裝在 /usr/local
那麼我們的匯出 Target 檔案的路徑為 /usr/local/lib/cmake/zapi
一般情況下,這個路徑不在 CMake Module 的搜尋路徑下,這行程式碼的作用就是將其新增到 CMake Module 的搜尋路徑列表中。

list 命令詳解:https://cmake.org/cmake/help/…

find_package(zendAPI 0.0.1 EXACT REQUIRED CONFIG)

這行程式碼探測我們系統中安裝的 zendAPI 庫相關資訊,zendAPI 只支援以 CMake CONFIG 模式尋找,這裡我們尋找我們系統中是否安裝有 zendAPI 0.0.1 版的庫,如果沒有的話,build system 在這裡會報錯。
如果成功尋找到 zendAPI 0.0.1 版的庫,build system 會設定一個 CMake Import Target
同時 find_package 會設定如下變數,方便您的使用:

  1. ZAPI_INCLUDE_DIRS zapi 庫的標頭檔案路徑
  2. ZAPI_PHP_INCLUDE_PATHS 系統探測出的 PHP 的標頭檔案路徑
  3. ZAPI_LIBRARY zendAPI 動態連結庫名字
  4. ZAPI_PHP_EXTENSION_DIR 系統探測出的 PHP 預設擴充套件安裝路徑

find_package 命令詳解:https://cmake.org/cmake/help/…
import target 命令詳解:https://cmake.org/cmake/help/…

add_library(hellozapi MODULE hellozapi/defs.h
                             hellozapi/defs.cpp
                             hellozapi/entry.cpp)

這行程式碼的主要作用是向 build system 新增一個 MODULE 型別的 CMake Target,如果對 MODULE 型別不瞭解,您可以點選下面的連線進行學習。因為 PHP 擴充套件是被 Zend Engine 使用 dlopen 進行載入的,所以我們的型別
MODULE 而不是 SHARED。在 hellozapi 專案中我們主要有三個檔案,在這裡進行新增。

add_library 命令詳解:https://cmake.org/cmake/help/…

set_target_properties(hellozapi PROPERTIES 
    OUTPUT_NAME hellozapi
    PREFIX "")

一般我們的 PHP 擴充套件的名為 extname.so 的格式,但是預設的情況下 CMake build systemMODULE Target 的名字格式為 libextname.so,這行程式碼的作用就是將我們的擴充套件 MODULE Target 的輸出名字設定為 hellozapi.so

set_target_properties 命令詳解:https://cmake.org/cmake/help/…

target_link_libraries(hellozapi ${ZAPI_LIBRARIES})

這行程式碼的作用是將 hellozapi 擴充套件與 zendAPI 庫進行連線,如果沒有這一行,而您的程式碼的時候又使用了 zendAPI 裡面的相關介面,會導致在執行時平臺的動態庫載入器 ld 報出符號不存在的錯誤。

target_link_libraries 命令詳解:https://cmake.org/cmake/help/…

install(TARGETS hellozapi DESTINATION ${ZAPI_PHP_EXTENSION_DIR})

這行程式碼指示 build system 把編譯好的 hellozapi Target 安裝到 PHP 預設的擴充套件路徑下。

install 命令詳解:https://cmake.org/cmake/help/…

恭喜您,堅持看完了編譯指令碼的教程,接下來稍作休息,我們繼續正式進入擴充套件程式碼編寫環節,相信您已經快等不及了,好了不廢話了, Let`s go!

相關文章