Commit efc44699 authored by Daniel Cheng's avatar Daniel Cheng

Build clang tools using CMake

This patch adds the CMakeLists.txt necessary to build clang tools using
CMake. The build files have also been refactored by creating a
top-level CMakeLists.txt. The list of tools to be built can be
controlled by setting ${CHROMIUM_TOOLS}. Tools are now installed with
a CMake rule rather than a manual cp, which should make this logic a
little more platform independent.

R=hans@chromium.org

Review URL: https://codereview.chromium.org/583143002

Cr-Commit-Position: refs/heads/master@{#296081}
parent 8faf9472
cmake_minimum_required(VERSION 2.8.8)
project(ChromeExtras)
enable_testing()
list(APPEND CMAKE_MODULE_PATH "${LLVM_BUILD_DIR}/share/llvm/cmake")
# These tools are built using LLVM's build system, not Chromium's.
# It expects LLVM_SRC_DIR and LLVM_BUILD_DIR to be set.
# For example:
#
# cmake -GNinja \
# -DLLVM_BUILD_DIR=$CHROMIUM_SRC_DIR/third_party/llvm-build/Release+Asserts \
# -DLLVM_SRC_DIR=$CHROMIUM_SRC_DIR/third_party/llvm \
# -DCHROMIUM_TOOLS=blink_gc_plugin;plugin \
# $CHROMIUM_SRC_DIR/tools/clang/
# ninja
include(LLVMConfig)
include(AddLLVM)
include(HandleLLVMOptions)
# Use rpath to find the bundled standard C++ library.
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
if (APPLE)
set(CMAKE_INSTALL_NAME_DIR "@rpath")
set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
else(UNIX)
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib")
endif()
set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin")
set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib")
include_directories("${LLVM_SRC_DIR}/include"
"${LLVM_SRC_DIR}/tools/clang/include"
"${LLVM_BUILD_DIR}/include"
"${LLVM_BUILD_DIR}/tools/clang/include")
link_directories("${LLVM_SRC_DIR}/lib"
"${LLVM_SRC_DIR}/tools/clang/lib"
"${LLVM_BUILD_DIR}/lib"
"${LLVM_BUILD_DIR}/tools/clang/lib")
# cr_add_test(
# name
# testprog
# arguments...
# )
function(cr_add_test name testprog)
add_test(NAME ${name} COMMAND ${testprog} ${ARGN})
add_dependencies(check-all ${name})
endfunction(cr_add_test)
# Tests for all enabled tools can be run by building this target.
add_custom_target(check-all COMMAND ${CMAKE_CTEST_COMMAND} -V)
foreach(tool ${CHROMIUM_TOOLS})
add_subdirectory(${tool})
endforeach(tool)
cmake_minimum_required(VERSION 2.8.8)
project(BlinkGCPlugin)
# This pugin is built using LLVM's build system, not Chromium's.
# It expects LLVM_SRC_DIR and LLVM_BUILD_DIR to be set.
# For example:
#
# cmake -GNinja \
# -DLLVM_BUILD_DIR=$CHROMIUM_SRC_DIR/third_party/llvm-build/Release+Asserts \
# -DLLVM_SRC_DIR=$CHROMIUM_SRC_DIR/third_party/llvm \
# $CHROMIUM_SRC_DIR/tools/clang/blink_gc_plugin/
# ninja
list(APPEND CMAKE_MODULE_PATH "${LLVM_BUILD_DIR}/share/llvm/cmake")
include(LLVMConfig)
include(AddLLVM)
include(HandleLLVMOptions)
# Use rpath to find the bundled standard C++ library.
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
if (APPLE)
set(CMAKE_INSTALL_NAME_DIR "@rpath")
set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
else(UNIX)
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib")
endif()
set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin")
set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib")
include_directories("${LLVM_SRC_DIR}/include"
"${LLVM_SRC_DIR}/tools/clang/include"
"${LLVM_BUILD_DIR}/include"
"${LLVM_BUILD_DIR}/tools/clang/include")
# This line is read by update.sh and other scripts in tools/clang/scripts # This line is read by update.sh and other scripts in tools/clang/scripts
# Note: The spaces are significant. # Note: The spaces are significant.
set(LIBRARYNAME BlinkGCPlugin_12) set(LIBRARYNAME BlinkGCPlugin_12)
...@@ -44,3 +7,11 @@ add_llvm_loadable_module("lib${LIBRARYNAME}" ...@@ -44,3 +7,11 @@ add_llvm_loadable_module("lib${LIBRARYNAME}"
Edge.cpp Edge.cpp
RecordInfo.cpp RecordInfo.cpp
) )
install(TARGETS "lib${LIBRARYNAME}" LIBRARY DESTINATION lib)
cr_add_test(blink_gc_plugin_test
${CMAKE_CURRENT_SOURCE_DIR}/tests/test.sh
${LLVM_BUILD_DIR}/bin/clang
$<TARGET_FILE:lib${LIBRARYNAME}>
)
set(LLVM_LINK_COMPONENTS
BitReader
MCParser
Option
)
add_llvm_executable(empty_string
EmptyStringConverter.cpp
)
target_link_libraries(empty_string
clangAST
clangASTMatchers
clangAnalysis
clangBasic
clangDriver
clangEdit
clangFrontend
clangLex
clangParse
clangSema
clangSerialization
clangTooling
)
install(TARGETS empty_string RUNTIME DESTINATION bin)
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This Makefile requires the LLVM build system. In order to build this tool,
# please run tools/clang/scripts/build_tool.py.
CLANG_LEVEL := ../..
TOOLNAME = empty_string
NO_INSTALL = 1
include $(CLANG_LEVEL)/../../Makefile.config
LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc option
USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \
clangTooling.a clangParse.a clangSema.a \
clangStaticAnalyzerFrontend.a clangStaticAnalyzerCheckers.a \
clangStaticAnalyzerCore.a clangAnalysis.a clangRewriteFrontend.a \
clangRewrite.a clangEdit.a clangAST.a clangLex.a clangBasic.a \
clangASTMatchers.a
include $(CLANG_LEVEL)/Makefile
cmake_minimum_required(VERSION 2.8.8)
project(FindBadConstructs)
# This pugin is built using LLVM's build system, not Chromium's.
# It expects LLVM_SRC_DIR and LLVM_BUILD_DIR to be set.
# For example:
#
# cmake -GNinja \
# -DLLVM_BUILD_DIR=$CHROMIUM_SRC_DIR/third_party/llvm-build/Release+Asserts \
# -DLLVM_SRC_DIR=$CHROMIUM_SRC_DIR/third_party/llvm \
# $CHROMIUM_SRC_DIR/tools/clang/plugins/
# ninja
list(APPEND CMAKE_MODULE_PATH "${LLVM_BUILD_DIR}/share/llvm/cmake")
include(LLVMConfig)
include(AddLLVM)
include(HandleLLVMOptions)
# Use rpath to find the bundled standard C++ library.
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
if (APPLE)
set(CMAKE_INSTALL_NAME_DIR "@rpath")
set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
else(UNIX)
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib")
endif()
set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin")
set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib")
include_directories("${LLVM_SRC_DIR}/include"
"${LLVM_SRC_DIR}/tools/clang/include"
"${LLVM_BUILD_DIR}/include"
"${LLVM_BUILD_DIR}/tools/clang/include")
add_llvm_loadable_module(libFindBadConstructs add_llvm_loadable_module(libFindBadConstructs
ChromeClassTester.cpp ChromeClassTester.cpp
FindBadConstructsAction.cpp FindBadConstructsAction.cpp
FindBadConstructsConsumer.cpp FindBadConstructsConsumer.cpp
) )
install(TARGETS libFindBadConstructs LIBRARY DESTINATION lib)
cr_add_test(plugins_test
${CMAKE_CURRENT_SOURCE_DIR}/tests/test.sh
${LLVM_BUILD_DIR}/bin/clang
$<TARGET_FILE:libFindBadConstructs>
)
set(LLVM_LINK_COMPONENTS
BitReader
MCParser
Option
)
add_llvm_executable(rewrite_scoped_refptr
RewriteScopedRefptr.cpp
)
target_link_libraries(rewrite_scoped_refptr
clangAST
clangASTMatchers
clangAnalysis
clangBasic
clangDriver
clangEdit
clangFrontend
clangLex
clangParse
clangSema
clangSerialization
clangTooling
)
install(TARGETS rewrite_scoped_refptr RUNTIME DESTINATION bin)
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This Makefile requires the LLVM build system. In order to build this tool,
# please run tools/clang/scripts/build_tool.py.
CLANG_LEVEL := ../..
TOOLNAME = rewrite_scoped_refptr
NO_INSTALL = 1
include $(CLANG_LEVEL)/../../Makefile.config
LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc option
USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \
clangTooling.a clangParse.a clangSema.a \
clangStaticAnalyzerFrontend.a clangStaticAnalyzerCheckers.a \
clangStaticAnalyzerCore.a clangAnalysis.a clangRewriteFrontend.a \
clangRewrite.a clangEdit.a clangAST.a clangLex.a clangBasic.a \
clangASTMatchers.a
include $(CLANG_LEVEL)/Makefile
...@@ -17,7 +17,6 @@ COMPILER_RT_BUILD_DIR="${LLVM_DIR}/../llvm-build/compiler-rt" ...@@ -17,7 +17,6 @@ COMPILER_RT_BUILD_DIR="${LLVM_DIR}/../llvm-build/compiler-rt"
LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap" LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap"
LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install" LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install"
CLANG_DIR="${LLVM_DIR}/tools/clang" CLANG_DIR="${LLVM_DIR}/tools/clang"
CLANG_TOOLS_EXTRA_DIR="${CLANG_DIR}/tools/extra"
COMPILER_RT_DIR="${LLVM_DIR}/compiler-rt" COMPILER_RT_DIR="${LLVM_DIR}/compiler-rt"
LIBCXX_DIR="${LLVM_DIR}/projects/libcxx" LIBCXX_DIR="${LLVM_DIR}/projects/libcxx"
LIBCXXABI_DIR="${LLVM_DIR}/projects/libcxxabi" LIBCXXABI_DIR="${LLVM_DIR}/projects/libcxxabi"
...@@ -59,7 +58,7 @@ force_local_build= ...@@ -59,7 +58,7 @@ force_local_build=
run_tests= run_tests=
bootstrap= bootstrap=
with_android=yes with_android=yes
chrome_tools="plugins blink_gc_plugin" chrome_tools="plugins;blink_gc_plugin"
gcc_toolchain= gcc_toolchain=
if [[ "${OS}" = "Darwin" ]]; then if [[ "${OS}" = "Darwin" ]]; then
...@@ -119,8 +118,8 @@ while [[ $# > 0 ]]; do ...@@ -119,8 +118,8 @@ while [[ $# > 0 ]]; do
echo "--print-revision: Print current clang revision and exit." echo "--print-revision: Print current clang revision and exit."
echo "--without-android: Don't build ASan Android runtime library." echo "--without-android: Don't build ASan Android runtime library."
echo "--with-chrome-tools: Select which chrome tools to build." \ echo "--with-chrome-tools: Select which chrome tools to build." \
"Defaults to plugins." "Defaults to plugins;blink_gc_plugin."
echo " Example: --with-chrome-tools 'plugins empty-string'" echo " Example: --with-chrome-tools plugins;empty-string"
echo "--gcc-toolchain: Set the prefix for which GCC version should" echo "--gcc-toolchain: Set the prefix for which GCC version should"
echo " be used for building. For example, to use gcc in" echo " be used for building. For example, to use gcc in"
echo " /opt/foo/bin/gcc, use '--gcc-toolchain '/opt/foo" echo " /opt/foo/bin/gcc, use '--gcc-toolchain '/opt/foo"
...@@ -547,42 +546,31 @@ fi ...@@ -547,42 +546,31 @@ fi
# Build Chrome-specific clang tools. Paths in this list should be relative to # Build Chrome-specific clang tools. Paths in this list should be relative to
# tools/clang. # tools/clang.
# For each tool directory, copy it into the clang tree and use clang's build TOOL_SRC_DIR="${PWD}/${THIS_DIR}/../"
# system to compile it. TOOL_BUILD_DIR="${ABS_LLVM_BUILD_DIR}/tools/clang/tools/chrome-extras"
for CHROME_TOOL_DIR in ${chrome_tools}; do
TOOL_SRC_DIR="${PWD}/${THIS_DIR}/../${CHROME_TOOL_DIR}" rm -rf "${TOOL_BUILD_DIR}"
TOOL_BUILD_DIR="${ABS_LLVM_BUILD_DIR}/tools/clang/tools/chrome-${CHROME_TOOL_DIR}" mkdir -p "${TOOL_BUILD_DIR}"
pushd "${TOOL_BUILD_DIR}"
rm -rf "${TOOL_BUILD_DIR}" MACOSX_DEPLOYMENT_TARGET=10.6 cmake -GNinja \
mkdir -p "${TOOL_BUILD_DIR}" -DLLVM_BUILD_DIR="${ABS_LLVM_BUILD_DIR}" \
pushd "${TOOL_BUILD_DIR}" -DLLVM_SRC_DIR="${ABS_LLVM_DIR}" \
MACOSX_DEPLOYMENT_TARGET=10.6 cmake -GNinja \ -DCMAKE_C_COMPILER="${CC}" \
-DLLVM_BUILD_DIR="${ABS_LLVM_BUILD_DIR}" \ -DCMAKE_CXX_COMPILER="${CXX}" \
-DLLVM_SRC_DIR="${ABS_LLVM_DIR}" \ -DCMAKE_C_FLAGS="${CFLAGS}" \
-DCMAKE_C_COMPILER="${CC}" \ -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \
-DCMAKE_CXX_COMPILER="${CXX}" \ -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_C_FLAGS="${CFLAGS}" \ -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_CXX_FLAGS="${CXXFLAGS}" \ -DCMAKE_MODULE_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \ -DCMAKE_INSTALL_PREFIX="${ABS_LLVM_BUILD_DIR}" \
-DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \ -DCHROMIUM_TOOLS="${chrome_tools}" \
-DCMAKE_MODULE_LINKER_FLAGS="${LDFLAGS}" \ "${TOOL_SRC_DIR}"
"${TOOL_SRC_DIR}" popd
ninja ninja -C "${TOOL_BUILD_DIR}" install
cp -v "${TOOL_BUILD_DIR}/lib"/* "${ABS_LLVM_BUILD_DIR}/lib/"
popd
done
if [[ -n "$run_tests" ]]; then if [[ -n "$run_tests" ]]; then
# Run the tests for each chrome tool. # Run Chrome tool tests.
for CHROME_TOOL_DIR in ${chrome_tools}; do ninja -C "${TOOL_BUILD_DIR}" check-all
TOOL_SRC_DIR="${THIS_DIR}/../${CHROME_TOOL_DIR}"
TOOL_BUILD_DIR="${ABS_LLVM_BUILD_DIR}/tools/clang/tools/chrome-${CHROME_TOOL_DIR}"
LIBNAME=$(basename $(ls "${TOOL_BUILD_DIR}/lib/"))
if [[ -f "${TOOL_SRC_DIR}/tests/test.sh" ]]; then
"${TOOL_SRC_DIR}/tests/test.sh" "${ABS_LLVM_BUILD_DIR}/bin/clang" \
"${ABS_LLVM_BUILD_DIR}/lib/${LIBNAME}"
fi
done
# Run the LLVM and Clang tests. # Run the LLVM and Clang tests.
ninja -C "${LLVM_BUILD_DIR}" check-all ninja -C "${LLVM_BUILD_DIR}" check-all
fi fi
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment