[LLVMdev] Some CMake issues (Are you being served?)
NAKAMURA Takumi
geek4civic at gmail.com
Sun Feb 2 09:42:58 PST 2014
Stephen,
> 1) You need to set the minimum required CMake version before the project()
> command.
Fixed in r200645.
> 2) You need to clean up tabs vs spaces. At least clang/CMakeLists.txt mixes
> them. I didn't look elsewhere but you should clean it all up.
Fixed in r200643 and r200644.
> 3) In modern cmake code, the end*() commands have no content. See eg
>
> http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9db31162
In historical reason, IMO, I'd not like to substitute all of them.
We will prune such legacy phrases whenever we touch around them.
> 4) There seems to be a 'cmake package config file' generated by the llvm
> build.
>
> http://www.cmake.org/cmake/help/git-master/manual/cmake-packages.7.html#package-configuration-file
>
> (the doc is new in master, but it applies almost entirely to CMake 2.8.8
> too)
>
> but it doesn't seem to appear in my llvm-3.5-dev ubuntu package.
>
> You need to ensure that the package config file is generated by your
> buildsystem. If you support two buildsystems, you need to ensure that it is
> generated properly by both of them. As far as I can see, the Makefile
> buildsystem in llvm does not generate the files. This is a significant bug.
> It is equivalent to not generating a required header file in one of your
> supported buildsystems.
>
> You need to ensure that the config file is generated by both buildsystems.
> That can mean that you avoid the built-in CMake facilities for creating
> packages.
>
> [Sidebar: This is part of the reason why I strongly recommend any project to
> have only one buildsystem. If it is impossible for you to drop the Makefile
> system, then consider dropping the CMake one. It creates false expectations
> of ability to use packages downstream.]
Brad King is proposing the stuff. Excuse me we haven't accepted his yet.
See also http://llvm.org/bugs/show_bug.cgi?id=15732
> 5) When I see things like this:
>
> add_dependencies(clangStaticAnalyzerCheckers
> ClangAttrClasses
> ClangAttrList
> ClangCommentNodes
They give dependencies for generated headers. What'd be wrong to you?
I have w-i-p patchset to nuke them (to go more suboptimal)
> and this:
>
> set(LLVM_LINK_COMPONENTS
> Support
> )
LLVM_LINK_COMPONENTS is for compatibility of autoconf build.
In AddLLVM.cmake and LLVM-Config.cmake, it is translated to
target_link_libraries.
> I don't know what those lines are for, but it looks like 'you're doing it
> wrong' from a dependency specification point of view, or CMake is not giving
> you the interfaces to do it right. If it's the latter, I want to fix that.
You may suppose the former is coming from historical reason. Please be patient.
The latter, I am certain CMake is insufficient.
I know it'd be not easy to describe optimal behavior for generated headers.
FYI, ClangXXX is doing;
1. Generate clang-tblgen.
2. Generate foo.inc from foobar.td.
3. Build object files with generated foo.inc.
Do you think we should give suboptimal dependency,
"Build all files whenever any of *.td were touchd"?
> 6) If you create a proper config file, then you can populate it with
> IMPORTED targets and use it in clang. IMPORTED targets record dependencies
> and usage requirements (when you start requiring CMake 2.8.9+ at least)
> properly.
>
> http://www.cmake.org/cmake/help/git-master/manual/cmake-buildsystem.7.html#imported-targets
Most of us are building clang in llvm build tree.
Aka "standalone clang" could be supposed as w-i-p.
I think other projects could be good studies for external cmake build.
I agree to update cmake version if LLVMConfig.cmake would work more smart. ;)
...Takumi
More information about the llvm-dev
mailing list