[LLVMdev] compiler-rt CMake build

Greg Fitzgerald garious at gmail.com
Thu Mar 20 11:12:47 PDT 2014


> ExternalProject_Add(compiler-rt ...)

So that was quite the experiment.  Looking at
clang/runtime/CMakeLists.txt, I'm not seeing a lot of bang for buck
here, and it looks like this file is prone to bit rot.  I think we
should consider punting on this one and looking for a more incremental
strategy.  For instance, how about starting by moving the call
'add_llvm_external_project(compiler-rt)' from
llvm/projects/CMakesLists.txt to clang/runtime?  We can tweak this
macro (or a clang variant) to optionally do something like:

    include(AddCompilerRt)

That way if CMAKE_PREFIX_PATH includes a path to the compiler-rt
install directory, it can import all the same build targets that would
be created by add_subdirectory(compiler-rt).

If I were to use CMake's ExternalProject feature, it would be from a
top-level superproject.  I would use it to manage dependencies and to
populate CMAKE_PREFIX_PATH for each dependency.  CMake, Make or a
package manager, it wouldn't matter which you used for this part (I've
used Make for this).  Ultimately, you want to end up with a top-level
build that performs the following:

    mkdir -p llvm/out && cd llvm/out
    cmake .. -DCMAKE_INSTALL_PREFIX=ship
    ninja check-all install
    cd -

    mkdir -p compiler-rt/out && cd compiler-rt/out
    cmake .. -DCMAKE_PREFIX_PATH=`pwd`/../../llvm/out/ship
-DCMAKE_INSTALL_PREFIX=ship
    ninja check-all install
    cd -

    mkdir -p clang/out && cd clang/out
    cmake ..  -DCMAKE_PREFIX_PATH=`pwd`/../../llvm/out/ship:`pwd`/../../compiler-rt/out/ship
-DCMAKE_INSTALL_PREFIX=ship
    ninja check-all install
    cd -

In this scenario, the compiler-rt build creates a cmake module that
clang includes.  It uses that cmake module to find the compiler-rt
install targets and copy them into "lib/clang/<version>".  The clang
build then calls 'add_subdirectory' on the compiler-rt 'test'
directory, pointing it to the just-built-clang.  So the dependency
tree for clang is:

    sanitizer-tests -> clang -> compiler-rt -> c-compiler

Thoughts?

Thanks,
Greg


On Thu, Feb 27, 2014 at 1:19 AM, Alexey Samsonov <samsonov at google.com> wrote:
>
> On Wed, Feb 26, 2014 at 9:58 PM, Brad King <brad.king at kitware.com> wrote:
>>
>> On 02/26/2014 12:43 PM, Alexey Samsonov wrote:
>> > Do you think it makes sense to land my ExternalProject_Add patch
>> > so that others can experiment with it? I can add quit with a
>> > fatal_error/warning if the build tree rules are generated with Ninja.
>>
>> Since it is conditional on LLVM_BUILD_EXTERNAL_COMPILER_RT, yes.
>
>
> Submitted as r202367.
>
>>
>>
>> > parallelism doesn't work when I run "make check-compiler-rt -j8"
>> > in the original build tree, presumably because we call
>> > "cd /path/to/compiler-rt/build/tree && make check-all" there.
>>
>> Right.  The ExternalProject module has a special case for the
>> Makefile generators to make with $(MAKE) instead of "make":
>>
>>
>> http://cmake.org/gitweb?p=cmake.git;a=blob;f=Modules/ExternalProject.cmake;hb=v2.8.12.2#l846
>>
>> so that flags like -j propagate automatically.  You could do
>> that too:
>>
>>   if(CMAKE_GENERATOR MATCHES "Make")
>>     set(check_compiler_rt "$(MAKE)" "check-all")
>>   else()
>>     set(check_compiler_rt ${CMAKE_COMMAND} --build .
>>       --target check-all --config $<CONFIGURATION>)
>>   endif()
>>
>>   ExternalProject_Get_Property(compiler-rt BINARY_DIR)
>>   add_custom_target(check-compiler-rt
>>     COMMAND ${check_compiler_rt}
>>     DEPENDS compiler-rt
>>     WORKING_DIRECTORY ${BINARY_DIR}
>>     VERBATIM
>>     )
>>
>
> This worked, thanks! Currently I also print fatal_error message if I detect
> Ninja as a CMAKE_GENERATOR.
>
>
> --
> Alexey Samsonov, MSK
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list