cmake/TestLibraryPath.cmake (72 lines of code) (raw):
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may not use
# this file except in compliance with the License. A copy of the License is
# located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing permissions and
# limitations under the License.
#
# On windows, we can't use rpath-like mechanisms to set library search paths.
# This cmake function will configure a target to use an appropriate PATH
# at ctest time, allowing it to find its dependencies.
# Further, cmake doesn't let us access target output directories, or do
# anything that depends on debug vs release, prior to execution of the cmake
# "generator" (which is too late to configure CTest). We end up needing some hacks here
# to specify the right output directories. Yes, this is fragile. Hopefully cmake
# eventually provides a better mechanism for this.
function(add_path_from_imported_lib path_var imported_target)
set(test_path ${${path_var}})
# This is an awful hack; we don't have a way of telling which configuration
# (release vs debug) is being built, so we'll just throw all versions of the imported
# SDK onto the path
get_property(awssdk_configs TARGET ${imported_target} PROPERTY IMPORTED_CONFIGURATIONS)
foreach(config IN ITEMS ${awssdk_configs})
get_property(sdk_lib_file TARGET ${imported_target} PROPERTY IMPORTED_LOCATION_${config})
message(STATUS "add_path_from_imported_lib target ${imported_target} config ${config} libfile ${sdk_lib_file}")
get_filename_component(sdk_basedir ${sdk_lib_file} DIRECTORY)
list(INSERT test_path 0 ${sdk_basedir})
endforeach()
set(${path_var} ${test_path} PARENT_SCOPE)
endfunction()
function(add_raw_lib_paths path_var)
set(test_path ${${path_var}})
foreach(lib IN ITEMS ${ARGN})
get_filename_component(basedir ${lib} DIRECTORY)
if(${basedir})
list(INSERT test_path 0 ${basedir})
endif()
endforeach()
set(${path_var} ${test_path} PARENT_SCOPE)
endfunction()
function(set_test_library_path testname)
if(WIN32) # includes win64
set(test_path "$ENV{PATH}")
if(TARGET aws-cpp-sdk-core)
add_path_from_imported_lib(test_path aws-cpp-sdk-core)
endif()
add_path_from_imported_lib(test_path AWS::aws-c-common)
add_raw_lib_paths(test_path ${CURL_LIBRARIES})
add_raw_lib_paths(test_path ${OPENSSL_CRYPTO_LIBRARY})
# As mentioned above, cmake simultaneously generates Debug and Release configurations for MSVC generators.
# However, generator expression expansion does not happen for the ctest configuration, so it's not possible
# to teach ctest which configuration was actually built (even when invoked via msbuild on RUN_TESTS.vcxproj).
# We'll just shove both paths onto the PATH and hope for the best...
foreach(possible_config IN ITEMS Release Debug .)
list(INSERT test_path 0 ${PROJECT_BINARY_DIR}/${possible_config})
list(INSERT test_path 0 ${PROJECT_BINARY_DIR}/tests/${possible_config})
list(INSERT test_path 0 ${CMAKE_CURRENT_BINARY_DIR}/${possible_config})
endforeach()
list(REMOVE_DUPLICATES test_path)
string(REPLACE ";" "\\;" test_path "${test_path}")
set_tests_properties(${testname} PROPERTIES ENVIRONMENT "PATH=${test_path}")
endif(WIN32)
endfunction()
macro(aws_add_test testname)
add_test(${testname} ${ARGN})
set_test_library_path(${testname})
endmacro()