Pangolin-python 源码解析-cmake

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版权协议,转载请附上原文出处链接和本声明。