CMake: How to use ExternalProject_Add( ) to download, build and correctly link libraries?

71 Views Asked by At

I'm trying to download, build and link external libraries using ExternalProject_Add(). Currently I'm trying to import Volk library https://github.com/zeux/volk with it. I got to the point, where I can download and build the library without any problem, but I can't link to it, because the library isn't downloaded and built yet (throws an ninja error). Before ExternalProject_Add() I used find_package(). It worked great, but it was processed at configuration stage and I don't have access to the library files until build stage. The Volk library also has dependecy on Vulkan and I have no idea on how to provide Vulkan lib files to it. It was all done automatically using the VolkConfig.cmake script.

My current code for the ExternalProject_Add():

ExternalProject_Add(
    VolkDownload
    GIT_REPOSITORY https://github.com/zeux/volk.git
    GIT_TAG b3bc21e584f97400b6884cb2a541a56c6a5ddba3
    PREFIX ${PROJECT_SOURCE_DIR}/External/VolkDownload
    CONFIGURE_COMMAND cmake ../VolkDownload -DVOLK_INSTALL=ON
    BUILD_COMMAND cmake --build . --config Release
    INSTALL_COMMAND cmake --install . --prefix ../../install
)

Externalproject_Get_Property(VolkDownload binary_dir)

set(VOLK_INCLUDE_DIR ${binary_dir}/../install/include)
set(VOLK_LIB_DIR ${binary_dir}/../install/lib)

add_library(volk STATIC IMPORTED)
set_target_properties(volk PROPERTIES IMPORTED_LOCATION ${VOLK_LIB_DIR}/volk.lib)
add_dependencies(volk VolkDownload)

add_library(testLib SHARED ${SRC_FILES})

add_dependencies(testLib volk)

target_include_directories(testLib PRIVATE ${VOLK_INCLUDE_DIR})
target_link_libraries(testLib volk)

The error I get:

[build] ninja: error: 'VolkDownload/src/install/lib/volk.lib', needed by 'bin/testLib.dll', missing and no known rule to make it

My question is how can I properly download and build the external libraries (in this case Volk) using ExternalProject_Add() and how to properly create library targets, which I can easily link to?

0

There are 0 best solutions below