[CMake] Where are tests located?

David Cole david.cole at kitware.com
Fri Nov 11 11:09:40 EST 2011


On Thu, Nov 10, 2011 at 4:33 PM, EXT-York, Gantry
<gantry.york at boeing.com> wrote:
> OK, so if I'm trying to add a test do I just
>
> add_executable( run_main.pl IMPORTED )
> set_property(
>    TARGET test_script1
>    PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/run_main.pl"
> )
> add_test( test1 run_main.pl)
>
>
> If run_main.pl is
>
> #!/usr/bin/perl
> system "main --val 24"
>
>
> Main could be in the build tree if it comes from main.cxx or it could be in the source tree if it is a script.  How does cmake know where main is at?
>
>
> -----Original Message-----
> From: David Cole [mailto:david.cole at kitware.com]
> Sent: Thursday, November 10, 2011 1:09 PM
> To: EXT-York, Gantry
> Cc: cmake at cmake.org
> Subject: Re: [CMake] Where are tests located?
>
> When you add an IMPORTED target, CMake does not know where the
> imported target is AT ALL until you tell it.
>
> After:
>  add_executable(run_main.pl IMPORTED)
>
> You need:
>  set_property(TARGET run_main.pl PROPERTY IMPORTED_LOCATION
> "${CMAKE_CURRENT_SOURCE_DIR}/run_main.pl")
>
> See docs here:
>  http://cmake.org/cmake/help/cmake-2-8-docs.html#command:set_property
>  http://cmake.org/cmake/help/cmake-2-8-docs.html#prop_tgt:IMPORTED_LOCATION
>
>
> HTH,
> David
>
>
> On Thu, Nov 10, 2011 at 3:00 PM, EXT-York, Gantry
> <gantry.york at boeing.com> wrote:
>> When I do an
>>
>>
>>
>> add_executable( run_main.pl IMPORTED)
>>
>> add_test( test1 run_main.pl)
>>
>>
>>
>> How does it know where run_main.pl is located when you do an out of source
>> build?
>>
>>
>>
>> It seems to look in
>>
>> .
>>
>> Releases
>>
>> Debug
>>
>> MinSizeRel
>>
>> RelWithDebInfo
>>
>> Deployment
>>
>> Development
>>
>>
>>
>> which are directories that I don't even see existing.
>>
>>
>>
>> And if run_main.pl is just
>>
>>
>>
>> #!/usr/bin/perl
>>
>> system " ../exec/main"
>>
>>
>>
>>
>>
>> How does it know if ../exec/main is in the src tree or the build tree?  If
>> main is a C binary, it would be in the build tree, if it is just a script it
>> would be in the source tree.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Gantry York
>>
>> Chandler, Arizona
>>
>>
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>>
>

If I were running a perl script as a test, here's how I would write
the CMakeLists.txt file:

  cmake_minimum_required(VERSION 2.8)
  project(perl_test)

  include(CTest)

  find_package(Perl)

  message("PERL_EXECUTABLE='${PERL_EXECUTABLE}'")

  add_test(NAME test1 COMMAND ${PERL_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/run_main.pl)

By default the working directory will be in CMAKE_CURRENT_BINARY_DIR
when the test runs. You can control it on a per-test basis by adding
the WORKING_DIRECTORY keyword to the add_test command if you know in
the CMakeLists file which test has main in the source tree and which
test has main.exe in the binary tree.

Something like this:
  add_test(NAME test_of_script COMMAND ${PERL_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/run_main.pl
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

  add_test(NAME test_of_exe COMMAND ${PERL_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/run_main.pl
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

However, CMake has no idea where "main" is, and for that matter,
neither does perl unless you tell it.

I would recommend structuring the perl script so that it takes in a
directory argument of where to look for the "main" script or
executable. Then you could use an expression like this to pass it
along to the perl script:

  add_test(NAME test_passing_dir COMMAND ${PERL_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/run_main.pl
    --dir $<TARGET_FILE_DIR:main>
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

Of course, use the actual target name for the target that produces
"main" in that last example, not the actual string "main".

CMake enforces name uniqueness among all targets in the whole tree.


Hopefully, this sheds a little more light on things for you.

HTH,
David


More information about the CMake mailing list