[CMake] add_test and locating dependent DLL's on Windows
Scott Gray
sgray at inventa.com
Thu May 14 09:56:54 EDT 2009
Werner Smekal wrote:
> Hi Scott,
>
>>> There is actually a possibility to tell Visual C++ directly where the
>>> DLL is located (by changing the PATH variable for one configuration
>>> inside VS), but I don't remember right now how and I'm just on the
>>> wrong OS right now to have a look.
>>>
>>>
>> Obviously I want to avoid having the developer manually editing the
>> project that cmake has produced, so if such a feature exists, I'd
>> like to track down how to make cmake spit it out for me.
>>
>
> Just for the records: Start Visual C++ and right click on the Project,
> then choose Properties. Go to Configuration Properties->Debugging. In
> the Textbox "Environment" enter something like:
>
> PATH=%PATH%;$(SolutionDir)\dll
>
Thanks again Werner. While that solution would most certainly work,
what I've been working really hard on is to ensure that a developer
needs little more than the compiler and subversion installed on his/her
machine to do our build.
Thanks to David Cole's help, here is what I have working now and it
*should* be pretty portable. I'm going to try to work it into a
re-usable function or macro, which I'll post on the list when I'm done
if anyone is interested:
#
# In order to run tests we will need to set the approriate environment
# variable so that the test program can locate its dependent DLL's. First
# we want to know what directory our dependent DLL was installed into:
#
get_target_property(utildir util LOCATION_Debug)
get_filename_component(utildir "${utildir}" PATH)
file(TO_NATIVE_PATH "${utildir}" native_utildir)
#
# Next, for our directory full of platform-dependent 3rd party DLL's
#
file(TO_NATIVE_PATH "${THIRDPARTY_DIR}/lib" native_3rdparty_lib)
file(TO_NATIVE_PATH "${THIRDRDPARTY_DIR}/bin" native_3rdparty_bin)
#
# Determine which environment variable controls the locating of
# DLL's and set that variable.
#
if (WIN32)
set (LD_VARNAME "PATH")
set (LD_PATH
"${native_utildir};${native_3rdparty_lib};${native_3rdparty_bin};$ENV{PATH}
#
# IMPORTANT NOTE: The set_tests_properties(), below, internally
# stores its name/value pairs with a semicolon delimiter.
# because of this we must protect the semicolons in the path
#
string(REPLACE ";" "\\;" LD_PATH "${LD_PATH}")
else ()
set (LD_VARNAME "LD_LIBRARY_PATH")
set (LD_PATH
"${native_utildir}:${native_3rdparty_lib}:$ENV{LD_LIBRARY_PATH}")
endif ()
add_test (SomeTest SomeTest)
set_tests_properties(SomeTest PROPERTIES ENVIRONMENT
"${LD_VARNAME}=${LD_PATH}")
Thanks again,
-scott
More information about the CMake
mailing list