conanfile.py中定義的package_info()
方法用于向package的調用者(conumer)提供包庫名,編譯/連接選項,文件夾等等信息,有了這些信息構建工具的generator就可以根據它們生成對應的文件,用于調用者引用package.
比如基于cmake的CMakeDeps可以根據這些信息自動生成Find<Package>.cmake
和<Package>-config.cmake
.
調用者的CMakeLists.txt中通過FindPackage(<Package>)
就可以自動找到package.創建對應的import target.
比如我為mnn 項目寫的conanfile.py(https://gitee.com/l0km/mnn/blob/conan1.2.7/conanfile.py)
def package_info(self):self.cpp_info.libs = ["MNN"]if not self.options.shared :if self.settings.compiler == "msvc":self.cpp_info.sharedlinkflags.extend(["/WHOLEARCHIVE:MNN"])self.cpp_info.exelinkflags = self.cpp_info.sharedlinkflagselif self.settings.compiler == "gcc":# about LINKER: ,see also https://cmake.org/cmake/help/latest/command/target_link_options.html#handling-compiler-driver-differencesself.cpp_info.sharedlinkflags.extend(["LINKER:--whole-archive",self._mnn_lib,"LINKER:--no-whole-archive"])self.cpp_info.exelinkflags = self.cpp_info.sharedlinkflagselif self.settings.compiler == "clang":self.cpp_info.sharedlinkflags.extend(["LINKER:--whole-archive",self._mnn_lib,"LINKER:--no-whole-archive"])self.cpp_info.exelinkflags = self.cpp_info.sharedlinkflags
mnn這個項目本身沒有生成cmake配置文件,但conan會在調用方在引用mnn package時CMakeDeps generator會自動生成mnn-config.cmake及相關文件,如下圖,這樣就減少了package開發中編譯腳本的工作量。
但是有的時候,package本身的CMake編譯腳本中已經有了config-cmake生成的邏輯,可以自己生成config-cmake.我們可以通過在package_info()
進行配置,讓conan使用package自帶的config.cmake.而不需要CMakeDeps
生成cmake配置文件。
如下在package_info
中定義builddirs
和cmake_find_mode
參數就可以實現
def package_info(self):self.cpp_info.builddirs.append(self.package_folder)self.cpp_info.set_property("cmake_find_mode", "none")
參見 《Disable CMakeDeps For Installed CMake configuration files》
jpegwrapper是我幾年前寫的一個jpeg相關項目,最近給它增加了conan支持,這個項目原本就會自動生成config.cmake。所以寫conanfile.py時我希望調用者使用原本的config.cmake,
所以在package_info
方法就是通過上面的定義來實現的:
https://gitee.com/l0km/jpegwrapper/blob/master/conanfile.py
def package_info(self):self.cpp_info.libs = ["jpegwrapper"]# 指定將安裝路徑加入CMAKE_PREFIX_PATH,以便執行find_package時能掃描到安裝路徑self.cpp_info.builddirs.append(self.package_folder)# 抑制conan生成jpegwrapper-config.cmake使用jpegwrapper自己生成的cmake配置文件 self.cpp_info.set_property("cmake_find_mode", "none")# cmake_find_mode為none時不需要配置此參數#self.cpp_info.requires = ["common_source_cpp::common_source_cpp","libjpeg-turbo::libjpeg-turbo","openjpeg::openjpeg"]
參考資料
《package_info》
《Recipe tools》
《CMakeDeps》