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.sc...@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.wue...@gmx.at> wrote: > >> but it does not set/add the required library >> >> Am 24.11.2016 um 22:01 schrieb Craig Scott <craig.sc...@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.wue...@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.wue...@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
-- 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