Skip to content

[question] Install dependency DLLs #716

@CrustyAuklet

Description

@CrustyAuklet

What is your question?

I have an application and a library, lets call them APP and LibA. LibA depends on OpenSLL built as a shared library and APP depends on LibA. Both APP and LibA are using Conan2 through the conan_provider.cmake file to keep the CMakeLists free from conan specific code.

APP uses CMake to create an installer. When I run cmake install the application and all DLLs should end up in the install directory. Using CMake I can gather the system DLLs needed and they install correctly. But I can't figure out how to install the needed OpenSSL DLLs (libssl-3.dll and libcrypto-3.dll).

Expectation

Install DLL dependencies using standard CMake. It would be great to not have to list the dependencies by name but I am ok doing that if needed.
Not sure but is this related to the new CMakeDeps2 generator? should I be using that?

Kind of Working

Combining some approaches I tried below I added to my CMakeLists.txt. This does require knowing the dependencies by name and use the LIB_BIN_DIRS_${CONFIG} variable that find_package seems to populate.

SET(MYLIB_RUNTIME_DEPS "${openssl_BIN_DIRS_RELEASE}")
configure_file(./install-runtime-deps.cmake.in "${PROJECT_BINARY_DIR}/install-runtime-deps.cmake" @ONLY)
install(SCRIPT "${PROJECT_BINARY_DIR}/install-runtime-deps.cmake")

in the configure file

file(GET_RUNTIME_DEPENDENCIES
     RESOLVED_DEPENDENCIES_VAR _FOUND_DEPS
     UNRESOLVED_DEPENDENCIES_VAR _MISSING_DEPS
     LIBRARIES @CMAKE_RUNTIME_OUTPUT_DIRECTORY@/@CMAKE_SHARED_LIBRARY_PREFIX@MyLib@CMAKE_SHARED_LIBRARY_SUFFIX@
     DIRECTORIES @openssl_BIN_DIRS_RELEASE@
     PRE_EXCLUDE_REGEXES
         [[api-ms-win-.*]]
         [[ext-ms-.*]]
         [[kernel32\.dll]]
         [[user32\.dll]]
         [[msvcrt.*\.dll]]
     POST_EXCLUDE_REGEXES
         [[.*[/\]system32[/\].*\.dll]]
)
message(STATUS "Resolved deps: ${_FOUND_DEPS}")
message(WARNING "Unresolved deps: ${_MISSING_DEPS}")
file(INSTALL ${_FOUND_DEPS} DESTINATION @CMAKE_INSTALL_BINDIR@)

This seems to work, but not the most concise. Is the variable openssl_BIN_DIRS_RELEASE that comes from CMakeDeps and find_package reliable and ok to use?

Other Attempts

CONAN_RUNTIME_LIB_DIRS

This variable seems to only be set in the toolchain generator, but the conan_provider.cmake uses CMakeDeps as far as I understand.

file(GET_RUNTIME_DEPENDENCIES ...)

install(CODE [=[
    file(GET_RUNTIME_DEPENDENCIES
        RESOLVED_DEPENDENCIES_VAR _FOUND_DEPS
        UNRESOLVED_DEPENDENCIES_VAR _MISSING_DEPS
        EXECUTABLES $<TARGET_FILE:APP>
        POST_EXCLUDE_REGEXES
            [[.*[/\]system32[/\].*\.dll]]
    )
    message(STATUS "Resolved deps: ${_FOUND_DEPS}")
    message(WARNING "Unresolved deps: ${_MISSING_DEPS}")
    file(INSTALL ${DAP_FOUND_DEPS} DESTINATION $<INSTALL_PREFIX>)
]=]
)

This correctly identifies the missing DLLs but does not find them, I see my message output as:

Unresolved deps: libcrypto-3.dll;libssl-3.dll

TARGET_RUNTIME_DLLS

Using the generator expression $<TARGET_RUNTIME_DLLS:APP> should list the DLLs needed by the target but the CMake code

add_custom_command(TARGET APP POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:APP> $<TARGET_RUNTIME_DLLS:APP>
                   COMMAND_EXPAND_LISTS
)

results in no arguments to the copy ($<TARGET_RUNTIME_DLLS:APP> is empty).

Copy files in generate

There is an example in the docs that copies DLLs during the generate step. This works to get the DLLs in the build folder. From there I guess the CMakeLists could assume that the DLLs are in the build folder?

Have you read the CONTRIBUTING guide?

  • I've read the CONTRIBUTING guide

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions