annidy / notes

0 stars 0 forks source link

external project #44

Open annidy opened 12 months ago

annidy commented 12 months ago
add_library(brotli INTERFACE)
include(ExternalProject)

include(HPHPFunctions)
SET_HHVM_THIRD_PARTY_SOURCE_ARGS(
  BROTLI_SOURCE_ARGS
  SOURCE_URL
  "https://github.com/google/brotli/archive/refs/tags/v1.0.9.tar.gz"
  SOURCE_HASH
  "SHA256=f9e8d81d0405ba66d181529af42a3354f838c939095ff99930da6aa9cdf6fe46"
  FILENAME_PREFIX "brotli-"
)

ExternalProject_Add(
  bundled_brotli
  ${BROTLI_SOURCE_ARGS}
  CMAKE_ARGS
    -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
    -DCMAKE_INSTALL_INCLUDEDIR=include
    -DCMAKE_INSTALL_LIBDIR=lib
    -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
    -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
    -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}
)
add_dependencies(brotli bundled_brotli)

ExternalProject_Get_Property(bundled_brotli INSTALL_DIR)
target_include_directories(brotli INTERFACE "${INSTALL_DIR}/include")
target_link_libraries(
  brotli
  INTERFACE
  "${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}brotlidec-static${CMAKE_STATIC_LIBRARY_SUFFIX}"
  "${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}brotlienc-static${CMAKE_STATIC_LIBRARY_SUFFIX}"
  "${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}brotlicommon-static${CMAKE_STATIC_LIBRARY_SUFFIX}"
)

https://github.com/facebook/hhvm/blob/master/third-party/brotli/CMakeLists.txt

annidy commented 12 months ago

这是一个CMakeLists.txt文件,用于构建一个名为brotli的库。其中:

annidy commented 7 months ago

对于大部分库,其实只需要简单的ExternalProject_Add即可。

创建thirdparty/glfw目录,添加一个CMakeLists.txt文件

include(ExternalProject)
ExternalProject_Add(GLFW_external
    GIT_REPOSITORY https://github.com/glfw/glfw.git
    GIT_TAG 3.3.8
    GIT_SHALLOW ON
    UPDATE_COMMAND ""
    CMAKE_ARGS
    -DCMAKE_INSTALL_PREFIX=${STAGED_INSTALL_PREFIX}
    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
    -DGLFW_BUILD_EXAMPLES=OFF
    -DGLFW_BUILD_TESTS=OFF
    -DGLFW_BUILD_DOCS=OFF
    TEST_AFTER_INSTALL OFF
    DOWNLOAD_NO_PROGRESS ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
    LOG_INSTALL ON
)

它会check下来源代码,默认生成的target就是库作者定义的target。

剩下要做的是

add_subdirectory(thirdparty/glfw)

find_package(glfw3 REQUIRED CONFIG)

target_link_libraries(${PROJECT} PRIVATE glfw)

https://github.com/annidy/glfw_opengl_cmake_template/blob/main/src/CMakeLists.txt

annidy commented 3 weeks ago

使用 ExternalProject_Add 一般需要依赖库也支持CMake,并且遵循良好的定义。一种方法是我们自己来写这个cmakefile文件

  1. 创建3rdparty目录,将第三方代码放进去。可以是下载源码,如果是开源的,推荐用submodule方式引用
  2. 创建cmake目录,放入自定义的文件 如果源码目录有良好的定义
    
    option(GLFW_BUILD_DOCS OFF)
    option(GLFW_BUILD_EXAMPLES OFF)
    option(GLFW_BUILD_TESTS OFF)
    option(GLFW_INSTALL OFF)
    add_subdirectory(${CMAKE_SOURCE_DIR}/3rdparty/glfw)

set(GLFW_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/glfw/include) set(GLFW_DEFINITIONS -DGLFW_INCLUDE_NONE)


如果源代码不支持cmake,但我们只使用头文件
```cmake
set(STB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/stb)

add_library(stb INTERFACE)

target_include_directories(stb
INTERFACE
    ${STB_INCLUDE_DIR})
  1. 在主CMakeLists.txt中,使用include导入
    include(cmake/glfw.cmake)

参考设计imrad