2012/10/9 James Bigler <jamesbig...@gmail.com>: > > I spent some time in the debugger to try and understand why CMake is making > the decisions it is. It comes down to this function which loops over all > the LinkClosures and calls AddImplicitLinkInfo for all languages that > *don't* match the language of the target. > > //---------------------------------------------------------------------------- > void cmComputeLinkInformation::AddImplicitLinkInfo() > { > // The link closure lists all languages whose implicit info is needed. > cmTarget::LinkClosure const* > lc=this->Target->GetLinkClosure(this->Config); > for(std::vector<std::string>::const_iterator li = lc->Languages.begin(); > li != lc->Languages.end(); ++li) > { > // Skip those of the linker language. They are implicit. > if(*li != this->LinkLanguage) > { > this->AddImplicitLinkInfo(*li); > } > } > } > > > The LinkClosure is computed and the only language in it is CXX due to the > CXX-ness of the input sources. I'm not sure what to think about this. I > told CMake to link the target as if it were a C target, then it decides that > it needs CXX libraries because it found CXX sources in my library. > > If I go through the trouble of specifying that I want to link the library as > if it were C, why do the source files get to override my property? > > It also seems to me that the source file language should only guide the link > language when the user didn't specify it explicitly.
I agree with you even if it looks like a feature side-effect. It looks like if you need to set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 0) in order to make your current problem disappear (at least on Linux) I would bet that this "feature" did not include a test with a "single source" file. I would also bet that Brad should answer to this: commit fcab87c9f802965318bee033c2fa3ff27cfbfec7 Author: Brad King <brad.k...@kitware.com> Date: Thu Jul 30 10:59:37 2009 -0400 Do not always propagate linker language preference The commit "Consider link dependencies for link language" taught CMake to propagate linker language preference from languages compiled into libraries linked by a target. It turns out this should only be done for some languages, such as C++, because normally the language of the program entry point (main) should be used. We introduce variable CMAKE_<LANG>_LINKER_PREFERENCE_PROPAGATES to tell CMake whether a language should propagate its linker preference across targets. Currently it is true only for C++. commit fd633b33cff397b110cc69f82fd522cdf905952a Author: Brad King <brad.k...@kitware.com> Date: Thu Jul 30 10:59:25 2009 -0400 Refactor target linker language selection This factors the decision logic out of cmTarget::ComputeLinkClosure into dedicated class cmTargetSelectLinker. We replace several local variables with a single object instance, and organize code into methods. -- Erk Le gouvernement représentatif n'est pas la démocratie -- http://www.le-message.org -- 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