昇腾社区首页
中文
注册
开发者
下载

CMake常见示例

  • 基本用法
    # 1. 定义原型动态库(前置条件)
    add_library(opgraph_math SHARED
    )
    # 2. 生成ES API包(库+wheel包)
    add_es_library_and_whl(
        ES_LINKABLE_AND_ALL_TARGET es_math
        OPP_PROTO_TARGET  opgraph_math
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output
    )
    
    # 3. 在应用中使用
    add_executable(my_app main.cpp)
    target_link_libraries(my_app PRIVATE es_math)

    如果工程中还有在编译阶段就需要ES头文件的OBJECT/STATIC中间目标,可额外添加add_dependencies(<中间目标> build_es_math)(build_es_*** 名称会随包名变化),以确保在编译该目标前已完成代码生成。最终的可执行或共享库只需target_link_libraries(... es_math) 即可自动触发相关依赖,示例如下:

    add_library(my_obj OBJECT foo.cc bar.cc)
    # 保证编译对象前先生成es_math头文件(推荐显式添加)
    add_dependencies(my_obj build_es_math)
    # 传递头文件搜索路径的作用
    target_link_libraries(my_obj PRIVATE es_math)
    
    add_executable(my_app $<TARGET_OBJECTS:my_obj>)
    target_link_libraries(my_app PRIVATE
            es_math
    )
  • 只生成C/C++ 库
    # 只生成 C/C++ 库(跳过Python wheel包)
    add_es_library(
        ES_LINKABLE_AND_ALL_TARGET es_math
        OPP_PROTO_TARGET  opgraph_math
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output
    )
  • 排除部分算子生成
    # 生成math TARGET
    # 生成产物不会包含es_Add_c.h; es_Add.h, es_Add.cpp, es_Add.py
    add_es_library(
        ES_LINKABLE_AND_ALL_TARGET es_math
        OPP_PROTO_TARGET  opgraph_math
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output
        EXCLUDE_OPS       Add
    )
  • 多个TARGET
    # 生成math TARGET
    add_es_library_and_whl(
        ES_LINKABLE_AND_ALL_TARGET es_math
        OPP_PROTO_TARGET  opgraph_math
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output
    )
    
    # 生成nn TARGET
    add_es_library_and_whl(
        ES_LINKABLE_AND_ALL_TARGET es_nn
        OPP_PROTO_TARGET  opgraph_nn
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output
    )
    
    # 使用多个TARGET
    add_executable(my_inference_app main.cpp)
    target_link_libraries(my_inference_app PRIVATE
        es_math
        es_nn
    )
  • 多个TARGET共享输出目录:所有TARGET可以使用同一个OUTPUT_PATH,头文件会按包名组织在子目录中,示例如下:
    add_es_library_and_whl(
        ES_LINKABLE_AND_ALL_TARGET es_math
        OPP_PROTO_TARGET  opgraph_math
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output  # 共享路径
    )
    
    add_es_library_and_whl(
        ES_LINKABLE_AND_ALL_TARGET es_nn
        OPP_PROTO_TARGET  opgraph_nn
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output  # 共享路径
    )
    
    # 输出结构:
    # output/
    # ├── include/
    # │   ├── es_math/
    # │   └── es_nn/
    # ├── lib64/
    # │   ├── libes_math.so
    # │   └── libes_nn.so
    # └── whl/
    #     ├── es_math-1.0.0-py3-none-any.whl
    #     └── es_nn-1.0.0-py3-none-any.whl