The `add_test` function can run whatever command you want it to, including 
compiling a target:

add_library(foo_compile_test STATIC EXCLUDE_FROM_ALL foo_compile_test.cpp)
add_test(NAME foo_compile_test
    COMMAND ${CMAKE_COMMAND} --build . --target foo_compile_test --config 
$<CONFIGURATION>
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

Then you set cmake to expect failure:

set_tests_properties(foo_compile_test PROPERTIES WILL_FAIL TRUE)

You can also check for output instead of just expecting failure:

set_tests_properties(mytest PROPERTIES
  PASS_REGULAR_EXPRESSION "foo failed"
)

This is especially useful to make sure that the error is from the static_assert 
message and not from another compile error.

Of course, cmake could provide a module which provides a function to do this, 
which additionally could help workaround the caveats of this approach. This is 
essentially what `bcm_test` in the boost cmake modules do. Hopefully, in the 
future this module could be merged upstream into cmake.


> On Sep 5, 2017, at 11:44 AM, Edward Diener <eldlistmaili...@tropicsoft.com> 
> wrote:
> 
> On 9/5/2017 2:47 AM, Dvir Yitzchaki wrote:
>> There's already CheckCXXSourceCompiles and friends.
>> The only problem is that try_compile is not scriptable otherwise you could 
>> let the test invoke
>> ${CMAKE_COMMAND} -P check_source_compiles.cmake.
> 
> To put it succinctly CMake should adding compile-time testing so that when 
> some compilation succeeds the test is successful and if the compilation fails 
> the test is not successful, with the proviso that you can reverse the result 
> as a compile should fail type of test. Similarly a build type testing, 
> without having to run anything should be added along the same lines.
> 
> In modern C++ it is perfectly feasible, especially with template programming, 
> to do compile time testing, invoking a compile-time static assert as a 
> compile-time failure. Boost has had this for years and modern C++ has it as 
> part of the latest version of the C++ standard. CMake needs to update itself 
> to the reality that pure compile-time testing is a reality for modern C++ and 
> should update itself accordingly. Only having run-time testing is an artifact 
> of the past. Hopefully CMake developers will get the message and make the 
> necessary update to CMake/CTest.
> 
>> -----Original Message-----
>> From: CMake [mailto:cmake-boun...@cmake.org] On Behalf Of Roger Leigh
>> Sent: Monday, September 4, 2017 16:51
>> To: cmake@cmake.org
>> Subject: Re: [CMake] Adding compile and build type tests to CMake/CTest
>> On 04/09/17 14:40, Edward Diener wrote:
>>> Boost Build has tests for running an application successfully or not,
>>> for compiling one or more source files successfully or not, and for
>>> building one or more source files into an exe or not. These tests in
>>> Boost Build are the run/run-fail, compile/compile-fail, and
>>> link/link-fail rules.
>>> 
>>> CMake/CTest has the exact equivalent to the run/run-fail rule in its
>>> add_test framework, but there is not add_test equivalent to the other
>>> two sets of rules. It sure would be nice, when Boost transitions to
>>> using CMake/CTest instead of Boost Build, if CMake/CTest had the
>>> equivalent of the other two sets of types of test in its add_test
>>> framework.
>>> 
>>> Is there any consensus that these other two types of tests might be
>>> valuable for CMake/CTest, or any way to make this happen ?
>> I've certainly wished for them.  Particularly when testing templated code 
>> where you want to test that certain things fail correctly, e.g. via 
>> static_assert or simply being invalid.
>> I understand it's possible to make this work partially, by creating targets 
>> which aren't built by default, and then add tests which invoke the targets.  
>> But this appears to have some caveats, such as potential misbehaviour with 
>> parallel testing.  Or you can have a separate CMake build for each 
>> individual target, but it's extra complexity.  Having a proper means of 
>> registering such tests would be very, very nice.
>> Regards,
>> Roger
> 
> 
> -- 
> 
> Powered by www.kitware.com
> 
> Please keep messages on-topic and check the CMake FAQ at: 
> http://www.cmake.org/Wiki/CMake_FAQ
> 
> Kitware offers various services to support the CMake community. For more 
> information on each offering, please visit:
> 
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
> 
> Visit other Kitware open-source projects at 
> http://www.kitware.com/opensource/opensource.html
> 
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake

Reply via email to