[CMake] Download more then one repo prior to build_command
Rian Quinn
rianquinn at gmail.com
Mon Mar 13 12:09:39 EDT 2017
Below is my current cmake script for building libc++. There are several things about this script I would like to cleanup, but the really big one is fact that I have to download libcxx and libcxxabi twice. This is because libcxx, libcxxabi and llvm have a circular dependency (each relies on the other), so all three repos need to be downloaded before libcxxabi can be built, and then finally libcxx.
Any thoughts on ways I can remove the extra download? I tried setting DOWNLOAD_COMMAND “”, and then setting SOURCE_DIR to the previously downloaded location, but cmake complains about the fact that the directory is empty (because it has not been downloaded during the configure step).
Thanks,
- Rian
----------------------------------------------------------------------------------------------------------------------------------------------------------------
# cmake -DCMAKE_TOOLCHAIN_FILE=~/bfprefix/cmake/CMakeToolchain_VMM.txt -DDISABLE_WARNINGS=on ..
cmake_minimum_required(VERSION 3.4)
project(bfsysroot C CXX)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/bfprefix" CACHE PATH "default install path" FORCE)
endif()
include("${CMAKE_INSTALL_PREFIX}/cmake/CMakeGlobal_Project.txt")
# ------------------------------------------------------------------------------
# Newlib
# ------------------------------------------------------------------------------
list(APPEND NEWLIB_ARGS
"--prefix=${CMAKE_INSTALL_PREFIX}/sysroots/"
"--target=${BAREFLANK_TARGET}"
"--disable-libgloss"
"--disable-multilib"
"--disable-newlib-supplied-syscalls"
"--enable-newlib-multithread"
"--enable-newlib-iconv"
"CC_FOR_TARGET=${CMAKE_C_COMPILER}"
"CXX_FOR_TARGET=${CMAKE_CXX_COMPILER}"
)
ExternalProject_Add(
newlib
PREFIX ${CMAKE_BINARY_DIR}/newlib
GIT_REPOSITORY https://github.com/Bareflank/newlib.git
GIT_TAG newlib-2.5.0-v1.2
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/newlib/configure "${NEWLIB_ARGS}" CFLAGS_FOR_TARGET=${CMAKE_C_FLAGS}
BUILD_COMMAND make
INSTALL_COMMAND make install
LOG_CONFIGURE 1
LOG_BUILD 1
LOG_INSTALL 1
)
# ------------------------------------------------------------------------------
# Unwind
# ------------------------------------------------------------------------------
list(APPEND BFUNWIND_CMAKE_ARGS
"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
)
ExternalProject_Add(
bfunwind
PREFIX ${CMAKE_BINARY_DIR}/bfunwind
GIT_REPOSITORY https://github.com/Bareflank/bfunwind.git
CMAKE_ARGS ${BFUNWIND_CMAKE_ARGS}
DEPENDS newlib
)
# ------------------------------------------------------------------------------
# Download LLVM
# ------------------------------------------------------------------------------
ExternalProject_Add(
download_llvm
PREFIX ${CMAKE_BINARY_DIR}/download_llvm
DOWNLOAD_COMMAND git clone --depth 1 -b release_39 https://github.com/llvm-mirror/llvm.git download_llvm
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
# ------------------------------------------------------------------------------
# Download Libcxxabi
# ------------------------------------------------------------------------------
ExternalProject_Add(
download_libcxxabi
PREFIX ${CMAKE_BINARY_DIR}/download_libcxxabi
DOWNLOAD_COMMAND git clone --depth 1 -b libcxxabi-39-v1 https://github.com/Bareflank/libcxxabi.git download_libcxxabi
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
# ------------------------------------------------------------------------------
# Download Libcxx
# ------------------------------------------------------------------------------
ExternalProject_Add(
download_libcxx
PREFIX ${CMAKE_BINARY_DIR}/download_libcxx
DOWNLOAD_COMMAND git clone --depth 1 -b libcxx-39-v1 https://github.com/Bareflank/libcxx.git download_libcxx
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
# ------------------------------------------------------------------------------
# Libcxxabi
# ------------------------------------------------------------------------------
list(APPEND LIBCXXABI_CMAKE_ARGS
"-DCMAKE_INSTALL_PREFIX=${BAREFLANK_SYSROOT_PATH}"
"-DLLVM_PATH=${CMAKE_BINARY_DIR}/download_llvm/src/download_llvm"
"-DLIBCXXABI_LIBCXX_PATH=${CMAKE_BINARY_DIR}/download_libcxx/src/download_libcxx"
"-DLIBCXXABI_SYSROOT=${BAREFLANK_SYSROOT_PATH}"
"-DLIBCXXABI_HAS_PTHREAD_API=ON"
"-DLLVM_ENABLE_LIBCXX=ON"
"-DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}"
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
"-DCMAKE_AR=${CMAKE_AR}"
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
)
ExternalProject_Add(
libcxxabi
PREFIX ${CMAKE_BINARY_DIR}/libcxxabi
DOWNLOAD_COMMAND git clone --depth 1 -b libcxxabi-39-v1 https://github.com/Bareflank/libcxxabi.git
CMAKE_ARGS ${LIBCXXABI_CMAKE_ARGS}
DEPENDS bfunwind download_llvm download_libcxx download_libcxxabi
)
# ------------------------------------------------------------------------------
# Libcxx
# ------------------------------------------------------------------------------
list(APPEND LIBCXX_CMAKE_ARGS
"-DCMAKE_INSTALL_PREFIX=${BAREFLANK_SYSROOT_PATH}"
"-DLLVM_PATH=${CMAKE_BINARY_DIR}/download_llvm/src/download_llvm"
"-DLIBCXX_CXX_ABI=libcxxabi"
"-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${CMAKE_BINARY_DIR}/download_libcxxabi/src/download_libcxxabi/include/"
"-DLIBCXX_SYSROOT=${BAREFLANK_SYSROOT_PATH}"
"-DLIBCXX_HAS_PTHREAD_API=ON"
"-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF"
"-DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}"
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
"-DCMAKE_AR=${CMAKE_AR}"
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
)
ExternalProject_Add(
libcxx
PREFIX ${CMAKE_BINARY_DIR}/libcxx
DOWNLOAD_COMMAND git clone --depth 1 -b libcxx-39-v1 https://github.com/Bareflank/libcxx.git
CMAKE_ARGS ${LIBCXX_CMAKE_ARGS}
DEPENDS bfunwind download_llvm download_libcxx download_libcxxabi libcxxabi
)
More information about the CMake
mailing list