Pangolin-python 源码解析-cmake
pybind11 胶水的 CMake 部分
# find pybind11 支持
option(BUILD_PANGOLIN_PYTHON "Build support for Pangolin Interactive Console" ON)
if(BUILD_PANGOLIN_PYTHON AND BUILD_PANGOLIN_GUI AND BUILD_PANGOLIN_VARS AND NOT _WIN_)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../external/pybind11/CMakeLists.txt")
add_subdirectory("../external/pybind11" "${CMAKE_CURRENT_BINARY_DIR}/external/pybind11")
set( pybind11_FOUND true)
else()
find_package(pybind11 QUIET)
endif()
if(pybind11_FOUND)
set(HAVE_PYTHON 1)
file(GLOB pypangolin_SRC "python/pypangolin/*.cpp" )
file(GLOB pypangolin_HDR "python/pypangolin/*.hpp" )
list(APPEND HEADERS
${INCDIR}/console/ConsoleInterpreter.h
${INCDIR}/console/ConsoleView.h
${INCDIR}/python/pyinterpreter.h
${INCDIR}/python/pypangolin_init.h
${INCDIR}/python/pyuniqueobj.h
${INCDIR}/python/pyvar.h
${INCDIR}/python/pypangoio.h
${pypangolin_HDR}
)
list(APPEND SOURCES
console/ConsoleView.cpp
python/pyinterpreter.cpp
python/pypangolin_init.cpp
${pypangolin_SRC}
)
# pybind11 stuff
list(APPEND INTERNAL_INC ${PYBIND11_INCLUDE_DIR})
list(APPEND LINK_LIBS PRIVATE ${pybind11_LIBRARIES})
if(_GCC_)
set_source_files_properties(python/PyInterpreter.cpp PROPERTIES COMPILE_FLAGS "-Wno-missing-field-initializers")
set_source_files_properties(python/PyModulePangolin.cpp PROPERTIES COMPILE_FLAGS "-fno-strict-aliasing -Wno-missing-field-initializers")
endif()
list(APPEND INTERNAL_INC ${PYTHON_INCLUDE_DIRS})
list(APPEND LINK_LIBS ${PYTHON_LIBRARIES})
message(STATUS "Python Found and Enabled (with pybind11)")
endif()
endif()
# 这是胶水部分
option(BUILD_PYPANGOLIN_MODULE "Python wrapper for Pangolin" ON)
if(BUILD_PYPANGOLIN_MODULE AND HAVE_PYTHON )
file(GLOB pypangolin_SRC "python/pypangolin/*.hpp" "python/pypangolin/*.cpp" "python/pypangolin_module.cpp")
pybind11_add_module(pypangolin ${pypangolin_SRC})
target_link_libraries(pypangolin PRIVATE ${LIBRARY_NAME})
target_include_directories(pypangolin PRIVATE "${USER_INC}")
endif()
逐行解析
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../external/pybind11/CMakeLists.txt")
add_subdirectory("../external/pybind11" "${CMAKE_CURRENT_BINARY_DIR}/external/pybind11")
set( pybind11_FOUND true)
else()
find_package(pybind11 QUIET)
endif()
external/pybind11 源码里带了一套pybind11的源码,首选使用它。如果找不到再到系统找。
if(pybind11_FOUND)
set(HAVE_PYTHON 1)
能找到 pybind11 并且不报错,那么系统里肯定有python。
file(GLOB pypangolin_SRC "python/pypangolin/*.cpp" )
file(GLOB pypangolin_HDR "python/pypangolin/*.hpp" )
搜集符合条件的文件,将完整路径存放到变量中。
list(APPEND HEADERS
...
)
list(APPEND SOURCES
...
)
pangolin 的头文件和源文件。
list(APPEND INTERNAL_INC ${PYBIND11_INCLUDE_DIR})
list(APPEND LINK_LIBS PRIVATE ${pybind11_LIBRARIES})
pybind11 的头文件和库
if(_GCC_)
set_source_files_properties(python/PyInterpreter.cpp PROPERTIES COMPILE_FLAGS "-Wno-missing-field-initializers")
set_source_files_properties(python/PyModulePangolin.cpp PROPERTIES COMPILE_FLAGS "-fno-strict-aliasing -Wno-missing-field-initializers")
endif()
给两个源文件设置了独立的编译属性。
-Wno-missing-field-initializers 禁用结构的初始化程序缺少某些字段警告
-fno-strict-aliasing 在指针引用到不同类型,且使用大于等于O2优化时,解决strict-aliasing存在的问题
list(APPEND INTERNAL_INC ${PYTHON_INCLUDE_DIRS})
list(APPEND LINK_LIBS ${PYTHON_LIBRARIES})
Python的头文件和库文件。
file(GLOB pypangolin_SRC "python/pypangolin/*.hpp" "python/pypangolin/*.cpp" "python/pypangolin_module.cpp")
pybind11_add_module(pypangolin ${pypangolin_SRC})
target_link_libraries(pypangolin PRIVATE ${LIBRARY_NAME})
target_include_directories(pypangolin PRIVATE "${USER_INC}")
胶水库pypangolin,添加头文件和依赖库。
版权声明:本文为m0_48174347原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。