[CMake] [cmake-developers] C++11/C++14 doesn't work in check_cxx_source_compiles

Craig Scott craig.scott at crascit.com
Fri Nov 25 17:26:57 EST 2016


Sorry, bad link in that last email. The try_compile() docs I meant to link
to are here:

https://cmake.org/cmake/help/latest/command/try_compile.html#other-behavior-settings


On Sat, Nov 26, 2016 at 9:23 AM, Craig Scott <craig.scott at crascit.com>
wrote:

> Sorry, I misunderstood. I had a look through the
> check_cxx_source_compiles() implementation and it basically forwards
> through to a try_compile() call. Looking at the docs for try_compile(),
> it says only the following are passed through to the temporary CMake
> project created for the test compilation:
>
>
>    - CMAKE_ENABLE_EXPORTS
>    - CMAKE_LINK_SEARCH_START_STATIC
>    - CMAKE_LINK_SEARCH_END_STATIC
>    - CMAKE_POSITION_INDEPENDENT_CODE
>
> A few more can be passed through depending on policy settings, but it
> looks like CMAKE_CXX_STANDARD, CMAKE_CXX_STANDARD_REQUIRED and
> CMAKE_CXX_EXTENSIONS don't get passed through. So it looks like, at the
> moment, you would have to manually pass through the relevant compiler and
> linker flags to get sources built via try_compile() and therefore via
> check_cxx_source_compiles(). I've recorded a new issue
> <https://gitlab.kitware.com/cmake/cmake/issues/16456> in the issue
> tracker for this.
>
>
>
>
>
> On Fri, Nov 25, 2016 at 9:25 PM, Roman Wüger <roman.wueger at gmx.at> wrote:
>
>> but it does not set/add the required library
>>
>> Am 24.11.2016 um 22:01 schrieb Craig Scott <craig.scott at crascit.com>:
>>
>> You might also need to set CMAKE_CXX_EXTENSIONS
>> <https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_EXTENSIONS.html>
>> to OFF (it's ON by default). This controls which c++ library is linked for
>> some compilers, with clang and gcc being two cases where it does this. You
>> may also find this article
>> <https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/> about the
>> related CMake variables and commands to be of interest.
>>
>> On Fri, Nov 25, 2016 at 5:43 AM, Roman Wüger <roman.wueger at gmx.at> wrote:
>>
>>> It is working now, after I added -lc++ to CMAKE_REQUIRED_LIBRARIES
>>> before the check_cxx_source_compiles() call.
>>>
>>> Shouldn't this be done by CMAKE_CXX_STANDARD?
>>>
>>> Best Regards
>>> Roman
>>>
>>> Am 24.11.2016 um 19:08 schrieb Roman Wüger <roman.wueger at gmx.at>:
>>>
>>> Hello,
>>>
>>>
>>>
>>> If I use a small piece of code which uses <regex>, then it fails with
>>> check_cxx_source_compiles. If I copy the piece of code into a file and run
>>> the following on the command line, then it works:
>>>
>>>
>>>
>>> clang++ main.cpp -std=c++14 -stdlib=libc++
>>>
>>>
>>>
>>> Here is the piece of code:
>>>
>>>
>>>
>>> #include <regex>
>>>
>>> #include <string>
>>>
>>>
>>>
>>> int main() {
>>>
>>>     const std::string text = "Roses are #ff0000, other flowers have
>>> other colors.";
>>>
>>>     const std::regex pattern("#([a-f0-9]{2})");
>>>
>>>
>>>
>>>     std::smatch match;
>>>
>>>     std::regex_search(text, match, pattern);
>>>
>>>
>>>
>>>     return 0;
>>>
>>> }
>>>
>>>
>>>
>>> I use this code in CMake as a platform check as followed:
>>>
>>>
>>>
>>> # C++11 Regular Expression
>>>
>>> set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
>>>
>>> check_cxx_source_compiles(
>>>
>>>   "#include <regex>
>>>
>>>    #include <string>
>>>
>>>
>>>
>>>    int main() {
>>>
>>>        const std::string text = \"Roses are #ff0000, other flowers have
>>> other colors.\";
>>>
>>>        const std::regex pattern(\"#([a-f0-9]{2})\");
>>>
>>>
>>>
>>>        std::smatch match;
>>>
>>>        std::regex_search(text, match, pattern);
>>>
>>>
>>>
>>>        return 0;
>>>
>>>    }"
>>>
>>>   HAVE_CXX11_REGULAR_EXPRESSIONS
>>>
>>> )
>>>
>>> set(CMAKE_REQUIRED_FLAGS "")
>>>
>>>
>>>
>>> CMakeFiles/CMakeError.log shows:
>>>
>>>
>>>
>>> Undefined symbols for architecture x86_64:
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::compare(char const*) const", referenced from:
>>>
>>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__start_matching_list(bool) in src.o
>>>
>>>   "std::__1::__vector_base_common<true>::__throw_length_error() const",
>>> referenced from:
>>>
>>>       std::__1::vector<std::__1::sub_match<char const*>,
>>> std::__1::allocator<std::__1::sub_match<char const*> >
>>> >::assign(unsigned long, std::__1::sub_match<char const*> const&) in src.o
>>>
>>>       std::__1::vector<std::__1::sub_match<char const*>,
>>> std::__1::allocator<std::__1::sub_match<char const*> >
>>> >::allocate(unsigned long) in src.o
>>>
>>>       void std::__1::vector<std::__1::__state<char>,
>>> std::__1::allocator<std::__1::__state<char> >
>>> >::__push_back_slow_path<std::__1::__state<char>
>>> >(std::__1::__state<char>&&) in src.o
>>>
>>>       std::__1::vector<std::__1::sub_match<char const*>,
>>> std::__1::allocator<std::__1::sub_match<char const*> >
>>> >::__append(unsigned long, std::__1::sub_match<char const*> const&) in src.o
>>>
>>>       std::__1::vector<std::__1::pair<unsigned long, char const*>,
>>> std::__1::allocator<std::__1::pair<unsigned long, char const*> >
>>> >::__append(unsigned long) in src.o
>>>
>>>       std::__1::vector<std::__1::pair<unsigned long, char const*>,
>>> std::__1::allocator<std::__1::pair<unsigned long, char const*> >
>>> >::allocate(unsigned long) in src.o
>>>
>>>       void std::__1::vector<char, std::__1::allocator<char>
>>> >::__push_back_slow_path<char>(char&&) in src.o
>>>
>>>       ...
>>>
>>>   "std::__1::__basic_string_common<true>::__throw_length_error()
>>> const", referenced from:
>>>
>>>       std::__1::enable_if<__is_forward_iterator<char*>::value,
>>> void>::type std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::__init<char*>(char*, char*) in src.o
>>>
>>>       std::__1::enable_if<__is_forward_iterator<char const*>::value,
>>> void>::type std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::__init<char const*>(char const*, char const*)
>>> in src.o
>>>
>>>       std::__1::enable_if<__is_forward_iterator<std::__1::__wrap_iter<char*>
>>> >::value, void>::type std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char>
>>> >::__init<std::__1::__wrap_iter<char*> >(std::__1::__wrap_iter<char*>,
>>> std::__1::__wrap_iter<char*>) in src.o
>>>
>>>   "std::__1::__match_any_but_newline<char>::__exec(std::__1::__state<char>&)
>>> const", referenced from:
>>>
>>>       vtable for std::__1::__match_any_but_newline<char> in src.o
>>>
>>>   "std::__1::locale::name() const", referenced from:
>>>
>>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__start_matching_list(bool) in src.o
>>>
>>>   "std::__1::locale::use_facet(std::__1::locale::id&) const",
>>> referenced from:
>>>
>>>       std::__1::regex_traits<char>::__init() in src.o
>>>
>>>   "std::__1::regex_error::regex_error(std::__1::regex_constants::error_type)",
>>> referenced from:
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse<char const*>(char const*, char
>>> const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_basic_reg_exp<char const*>(char
>>> const*, char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_extended_reg_exp<char
>>> const*>(char const*, char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_assertion<char const*>(char const*,
>>> char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_atom<char const*>(char const*, char
>>> const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_ERE_dupl_symbol<char
>>> const*>(char const*, char const*, std::__1::__owns_one_state<char>*,
>>> unsigned int, unsigned int) in src.o
>>>
>>>       bool std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__match_at_start_ecma<std::__1::allocator<std::__1::sub_match<char
>>> const*> > >(char const*, char const*, std::__1::match_results<char const*,
>>> std::__1::allocator<std::__1::sub_match<char const*> > >&,
>>> std::__1::regex_constants::match_flag_type, bool) const in src.o
>>>
>>>       ...
>>>
>>>   "std::__1::regex_error::~regex_error()", referenced from:
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse<char const*>(char const*, char
>>> const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_basic_reg_exp<char const*>(char
>>> const*, char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_extended_reg_exp<char
>>> const*>(char const*, char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_assertion<char const*>(char const*,
>>> char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_atom<char const*>(char const*, char
>>> const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_ERE_dupl_symbol<char
>>> const*>(char const*, char const*, std::__1::__owns_one_state<char>*,
>>> unsigned int, unsigned int) in src.o
>>>
>>>       bool std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__match_at_start_ecma<std::__1::allocator<std::__1::sub_match<char
>>> const*> > >(char const*, char const*, std::__1::match_results<char const*,
>>> std::__1::allocator<std::__1::sub_match<char const*> > >&,
>>> std::__1::regex_constants::match_flag_type, bool) const in src.o
>>>
>>>       ...
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::__init(char const*, unsigned long)",
>>> referenced from:
>>>
>>>       _main in src.o
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
>>>
>>>       std::__1::__bracket_expression<char, std::__1::regex_traits<char>
>>> >::__exec(std::__1::__state<char>&) const in src.o
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::reserve(unsigned long)", referenced from:
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_collating_symbol<char
>>> const*>(char const*, char const*, std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >&) in src.o
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char
>>> const*>(char const*, char const*, char) const in src.o
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::basic_string(std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> > const&)",
>>> referenced from:
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_equivalence_class<char
>>> const*>(char const*, char const*, std::__1::__bracket_expression<char,
>>> std::__1::regex_traits<char> >*) in src.o
>>>
>>>       void std::__1::vector<std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >,
>>> std::__1::allocator<std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> > >
>>> >::__push_back_slow_path<std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >
>>> const&>(std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > const&&&) in src.o
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::~basic_string()", referenced from:
>>>
>>>       _main in src.o
>>>
>>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__start_matching_list(bool) in src.o
>>>
>>>       std::__1::__bracket_expression<char, std::__1::regex_traits<char>
>>> >::__exec(std::__1::__state<char>&) const in src.o
>>>
>>>       std::__1::__vector_base<std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >,
>>> std::__1::allocator<std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> > >
>>> >::~__vector_base() in src.o
>>>
>>>       std::__1::pair<std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >,
>>> std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > >::~pair() in src.o
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::transform<char*>(char*,
>>> char*) const in src.o
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>>
>>>       ...
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::operator=(std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> > const&)",
>>> referenced from:
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char
>>> const*>(char const*, char const*, char) const in src.o
>>>
>>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> >::operator=(char)", referenced from:
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_character_escape<char
>>> const*>(char const*, char const*, std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_expression_term<char
>>> const*>(char const*, char const*, std::__1::__bracket_expression<char,
>>> std::__1::regex_traits<char> >*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_class_escape<char const*>(char
>>> const*, char const*, std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >&,
>>> std::__1::__bracket_expression<char, std::__1::regex_traits<char> >*)
>>> in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_awk_escape<char const*>(char
>>> const*, char const*, std::__1::basic_string<char,
>>> std::__1::char_traits<char>, std::__1::allocator<char> >*) in src.o
>>>
>>>   "std::__1::__get_classname(char const*, bool)", referenced from:
>>>
>>>       unsigned int std::__1::regex_traits<char>::__lookup_classname<char
>>> const*>(char const*, char const*, bool, char) const in src.o
>>>
>>>   "std::__1::__shared_weak_count::__add_shared()", referenced from:
>>>
>>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::basic_regex(std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> > const&) in src.o
>>>
>>>   "std::__1::__shared_weak_count::__release_shared()", referenced from:
>>>
>>>       std::__1::shared_ptr<std::__1::__empty_state<char>
>>> >::~shared_ptr() in src.o
>>>
>>>   "std::__1::__shared_weak_count::~__shared_weak_count()", referenced
>>> from:
>>>
>>>       std::__1::__shared_ptr_pointer<std::__1::__empty_state<char>*,
>>> std::__1::default_delete<std::__1::__empty_state<char> >,
>>> std::__1::allocator<std::__1::__empty_state<char> >
>>> >::~__shared_ptr_pointer() in src.o
>>>
>>>   "std::__1::__get_collation_name(char const*)", referenced from:
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>>
>>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>>> std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char
>>> const*>(char const*, char const*, char) const in src.o
>>>
>>>   "std::__1::ctype<char>::id", referenced from:
>>>
>>>       std::__1::regex_traits<char>::__init() in src.o
>>>
>>>   "std::__1::locale::locale(std::__1::locale const&)", referenced from:
>>>
>>>       std::__1::regex_traits<char>::regex_traits(std::__1::regex_traits<char>
>>> const&) in src.o
>>>
>>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__start_matching_list(bool) in src.o
>>>
>>>   "std::__1::locale::locale()", referenced from:
>>>
>>>       std::__1::regex_traits<char>::regex_traits() in src.o
>>>
>>>  "std::__1::locale::~locale()", referenced from:
>>>
>>>       std::__1::regex_traits<char>::~regex_traits() in src.o
>>>
>>>       std::__1::regex_traits<char>::regex_traits() in src.o
>>>
>>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__start_matching_list(bool) in src.o
>>>
>>>   "std::__1::collate<char>::id", referenced from:
>>>
>>>       std::__1::regex_traits<char>::__init() in src.o
>>>
>>>   "typeinfo for std::__1::regex_error", referenced from:
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse<char const*>(char const*, char
>>> const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_basic_reg_exp<char const*>(char
>>> const*, char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_extended_reg_exp<char
>>> const*>(char const*, char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_assertion<char const*>(char const*,
>>> char const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_atom<char const*>(char const*, char
>>> const*) in src.o
>>>
>>>       char const* std::__1::basic_regex<char,
>>> std::__1::regex_traits<char> >::__parse_ERE_dupl_symbol<char
>>> const*>(char const*, char const*, std::__1::__owns_one_state<char>*,
>>> unsigned int, unsigned int) in src.o
>>>
>>>       bool std::__1::basic_regex<char, std::__1::regex_traits<char>
>>> >::__match_at_start_ecma<std::__1::allocator<std::__1::sub_match<char
>>> const*> > >(char const*, char const*, std::__1::match_results<char const*,
>>> std::__1::allocator<std::__1::sub_match<char const*> > >&,
>>> std::__1::regex_constants::match_flag_type, bool) const in src.o
>>>
>>>       ...
>>>
>>>   "typeinfo for std::__1::__shared_weak_count", referenced from:
>>>
>>>       typeinfo for std::__1::__shared_ptr_pointer
>>> <std::__1::__empty_state<char>*, std::__1::default_delete<std::__1::__empty_state<char>
>>> >, std::__1::allocator<std::__1::__empty_state<char> > > in src.o
>>>
>>>   "vtable for std::__1::__shared_count", referenced from:
>>>
>>>       std::__1::shared_ptr<std::__1::__empty_state<char>
>>> >::shared_ptr<std::__1::__empty_state<char>
>>> >(std::__1::__empty_state<char>*, std::__1::enable_if<is_convert
>>> ible<std::__1::__empty_state<char>*, std::__1::__empty_state<char>*>::value,
>>> std::__1::shared_ptr<std::__1::__empty_state<char> >::__nat>::type) in
>>> src.o
>>>
>>>   NOTE: a missing vtable usually means the first non-inline virtual
>>> member function has no definition.
>>>
>>>   "vtable for std::__1::__shared_weak_count", referenced from:
>>>
>>>       std::__1::shared_ptr<std::__1::__empty_state<char>
>>> >::shared_ptr<std::__1::__empty_state<char>
>>> >(std::__1::__empty_state<char>*, std::__1::enable_if<is_convert
>>> ible<std::__1::__empty_state<char>*, std::__1::__empty_state<char>*>::value,
>>> std::__1::shared_ptr<std::__1::__empty_state<char> >::__nat>::type) in
>>> src.o
>>>
>>>   NOTE: a missing vtable usually means the first non-inline virtual
>>> member function has no definition.
>>>
>>> ld: symbol(s) not found for architecture x86_64
>>>
>>> clang: error: linker command failed with exit code 1 (use -v to see
>>> invocation)
>>>
>>>
>>>
>>> ** BUILD FAILED **
>>>
>>>
>>>
>>> Did I forget something?
>>>
>>>
>>>
>>> Thanks in advance
>>>
>>>
>>>
>>> Best Regards
>>>
>>> Roman
>>>
>>> --
>>>
>>> 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-developers
>>>
>>>
>>> --
>>>
>>> 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-developers
>>>
>>
>>
>>
>> --
>> Craig Scott
>> Melbourne, Australia
>> https://crascit.com
>>
>>
>
>
> --
> Craig Scott
> Melbourne, Australia
> https://crascit.com
>



-- 
Craig Scott
Melbourne, Australia
https://crascit.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20161126/4ed25b84/attachment-0001.html>


More information about the CMake mailing list