[LLVMdev] Some CMake issues (Are you being served?)

Stephen Kelly steveire at gmail.com
Sun Feb 2 00:09:59 PST 2014


Hello,

I work on CMake upstream. I'd like to find out in what ways CMake upstream 
does not fit the needs of llvm/clang, and then fill those gaps. The recent 
update of the minimum version to CMake 2.8.8 is a good start. Before being 
able to assess what is missing, it should be ensured that the current 
codebase is as modern as the minimum version allows, and it needs to be 
cleaned up.

1) You need to set the minimum required CMake version before the project() 
command.
    
The minimum version affects behavior by setting policies, and can
affect the behavior of the project() command.
    
 http://www.cmake.org/cmake/help/git-master/manual/cmake-policies.7.html
    
Eg
    
 http://www.cmake.org/cmake/help/git-master/policy/CMP0025.html

-project(LLVM)
 cmake_minimum_required(VERSION 2.8.8)
+project(LLVM)

You need to do the same in clang/CMakeLists.txt.

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.

3) In modern cmake code, the end*() commands have no content. See eg 

 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9db31162

You can run a similar command on the llvm cmake files. At least clang 
CMakeLists contains 

 endif(MSVC_IDE OR XCODE)

I didn't check others.

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.]

5) When I see things like this:

 add_dependencies(clangStaticAnalyzerCheckers
   ClangAttrClasses
   ClangAttrList
   ClangCommentNodes

and this:

 set(LLVM_LINK_COMPONENTS
  Support
 )

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.

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


The main oddness seems to come from the fact that the Makefile buildsystem 
doesn't create the cmake package config files. Fix that first or remove the 
Makefile buildsystem. I recall there was a discussion about that a few years 
ago.

Thanks,

Steve.





More information about the llvm-dev mailing list