diff options
Diffstat (limited to 'indra/cmake')
| -rw-r--r-- | indra/cmake/Copy3rdPartyLibs.cmake | 108 | 
1 files changed, 46 insertions, 62 deletions
| diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index d662103ef4..1365f7b9cc 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -7,6 +7,21 @@  include(CMakeCopyIfDifferent)  include(Linking) +# When we copy our dependent libraries, we almost always want to copy them to +# both the Release and the RelWithDebInfo staging directories. This has +# resulted in duplicate (or worse, erroneous attempted duplicate) +# copy_if_different commands. Encapsulate that usage. +# Pass FROM_DIR, TARGETS and the files to copy. TO_DIR is implicit. +# to_staging_dirs diverges from copy_if_different in that it appends to TARGETS. +MACRO(to_staging_dirs from_dir targets) +  foreach(staging_dir +          "${SHARED_LIB_STAGING_DIR_RELEASE}" +          "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}") +    copy_if_different("${from_dir}" "${staging_dir}" out_targets ${ARGN}) +    list(APPEND "${targets}" "${out_targets}") +  endforeach() +ENDMACRO(to_staging_dirs from_dir to_dir targets) +  ###################################################################  # set up platform specific lists of files that need to be copied  ################################################################### @@ -85,7 +100,6 @@ if(WINDOWS)          MESSAGE(WARNING "New MSVC_VERSION ${MSVC_VERSION} of MSVC: adapt Copy3rdPartyLibs.cmake")      endif (MSVC80) -    MESSAGE(STATUS "Copying redist libs for VC ${MSVC_VER}")      if(ADDRESS_SIZE EQUAL 32)          # this folder contains the 32bit DLLs.. (yes really!)          set(registry_find_path "[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64") @@ -94,40 +108,34 @@ if(WINDOWS)          set(registry_find_path "[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32")      endif(ADDRESS_SIZE EQUAL 32) -    FIND_PATH(release_msvc_redist_path NAME msvcp${MSVC_VER}.dll -        PATHS             -        ${registry_find_path} -        NO_DEFAULT_PATH -        ) +    # Having a string containing the system registry path is a start, but to +    # get CMake to actually read the registry, we must engage some other +    # operation. +    get_filename_component(registry_path "${registry_find_path}" ABSOLUTE) -    if(EXISTS ${release_msvc_redist_path}) -        set(release_msvc_files +    # These are candidate DLL names. Empirically, VS versions before 2015 have +    # msvcp*.dll and msvcr*.dll. VS 2017 has msvcp*.dll and vcruntime*.dll. +    # Check each of them. +    foreach(release_msvc_file              msvcp${MSVC_VER}.dll              msvcr${MSVC_VER}.dll              vcruntime${MSVC_VER}.dll              ) - -        copy_if_different( -            ${release_msvc_redist_path} -            "${SHARED_LIB_STAGING_DIR_RELEASE}" -            out_targets -            ${release_msvc_files} -            ) -        set(third_party_targets ${third_party_targets} ${out_targets}) - -        copy_if_different( -            ${release_msvc_redist_path} -            "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" -            out_targets -            ${release_msvc_files} -            ) -        set(third_party_targets ${third_party_targets} ${out_targets}) -        MESSAGE(STATUS "Copied ${third_party_targets}") - -        unset(release_msvc_redist_path CACHE) -    else() -        MESSAGE(SEND_ERROR "Redist libs for VC ${MSVC_VER} not found!") -    endif() +        if(EXISTS "${registry_path}/${release_msvc_file}") +            to_staging_dirs( +                ${registry_path} +                third_party_targets +                ${release_msvc_file}) +        else() +            # This isn't a WARNING because, as noted above, every VS version +            # we've observed has only a subset of the specified DLL names. +            MESSAGE(STATUS "Redist lib ${release_msvc_file} not found") +        endif() +    endforeach() +    MESSAGE(STATUS "Will copy redist files for MSVC ${MSVC_VER}:") +    foreach(target ${third_party_targets}) +        MESSAGE(STATUS "${target}") +    endforeach()  elseif(DARWIN)      set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}/Debug/Resources") @@ -239,52 +247,28 @@ endif(WINDOWS)  # Done building the file lists, now set up the copy commands.  ################################################################ -copy_if_different( -    ${vivox_lib_dir} -    "${SHARED_LIB_STAGING_DIR_DEBUG}" -    out_targets  -    ${vivox_libs} -    ) -set(third_party_targets ${third_party_targets} ${out_targets}) - +# Curiously, slvoice_files are only copied to SHARED_LIB_STAGING_DIR_RELEASE. +# It's unclear whether this is oversight or intentional, but anyway leave the +# single copy_if_different command rather than using to_staging_dirs.  copy_if_different(      ${slvoice_src_dir}      "${SHARED_LIB_STAGING_DIR_RELEASE}"      out_targets      ${slvoice_files}      ) -copy_if_different( -    ${vivox_lib_dir} -    "${SHARED_LIB_STAGING_DIR_RELEASE}" -    out_targets -    ${vivox_libs} -    ) - -set(third_party_targets ${third_party_targets} ${out_targets}) +list(APPEND third_party_targets ${out_targets}) -copy_if_different( +to_staging_dirs(      ${vivox_lib_dir} -    "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" -    out_targets +    third_party_targets      ${vivox_libs}      ) -set(third_party_targets ${third_party_targets} ${out_targets}) -copy_if_different( +to_staging_dirs(      ${release_src_dir} -    "${SHARED_LIB_STAGING_DIR_RELEASE}" -    out_targets -    ${release_files} -    ) -set(third_party_targets ${third_party_targets} ${out_targets}) - -copy_if_different( -    ${release_src_dir} -    "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" -    out_targets +    third_party_targets      ${release_files}      ) -set(third_party_targets ${third_party_targets} ${out_targets})  if(NOT USESYSTEMLIBS)    add_custom_target( | 
