Tôi đang viết cấu hình xây dựng với cmake: bên cạnh dự án chính với mã riêng có một số thư viện bên ngoài. Vì lợi ích của việc cập nhật dễ dàng các thư viện này (zlib, libpng, ...) Tôi không muốn sửa đổi các tệp cmakelists của nó, nhưng tôi cần các mục tiêu thư viện cụ thể (để sử dụng trong target_link_libraries() chẳng hạn). Một hạn chế khác là tôi không thể chỉ nói rằng mã của tôi cần thư viện bên ngoài được cài đặt, tất cả mọi thứ phải được đặt trong một cây mã nguồn và phải được xây dựng cùng nhau. Để giữ mọi thư viện cung cấp cấu trúc (libs, headers), tôi muốn cài đặt (như make install
) thư viện vào thư mục xây dựng cục bộ và sau đó bao gồm tệp cmake được tạo để nhập các mục tiêu cần thiết vào dự án của tôi.Cmake cài đặt mục tiêu kích hoạt
Tôi cho rằng dòng chảy như sau:
- xây dựng thư viện bên ngoài với
add_subdirectory()
- cài đặt tập tin thư viện bên ngoài vào thư mục địa phương
- chỉ tiêu nhập khẩu sử dụng tạo ra cmake-file chỉ tiêu nhập khẩu
- sử dụng trong các dự án chính các tệp cmake
Sự cố là tự động hóa bước 2 (cần phải kích hoạt mục tiêu install
sau add_subdiretory
bên trong dự án chính CMakeLists.txt). Tôi có thể xây dựng và cài đặt tất cả các thư viện và sau đó xây dựng mã riêng, nhưng điều này không thuận tiện.
Vì vậy, câu hỏi là làm thế nào tôi có thể nói cho cmake để làm cài đặt trung gian trong quá trình xây dựng?
Một chút ví dụ làm việc ở đây:
cấu trúc file:
prj/CMakeLists.txt
prj/src/main.cpp
lib/CMakeLists.txt
lib/include/libheader.h
lib/src/libsource.cpp
prj/CMakeLists.txt
project(TestProject)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE on)
set(WORK_DIR ${CMAKE_CURRENT_SOURCE_DIR})
# supposed to use add_subdirectory here (with forced install).
# and then include prespecified include-file as here.
include_directories(${WORK_DIR}/../lib/build/install/include)
include(${WORK_DIR}/../lib/build/install/lib/libtargets.cmake)
add_executable(main ${WORK_DIR}/src/main.cpp)
target_link_libraries(main library_target)
lib/CMakeLists.txt
project(TestLib)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE on)
set(WORK_DIR ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${WORK_DIR}/include)
add_library(library_target STATIC ${WORK_DIR}/src/libsource.cpp)
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)
install(FILES ${WORK_DIR}/include/libheader.h DESTINATION include)
install(TARGETS library_target DESTINATION lib EXPORT libtargets)
install(EXPORT libtargets DESTINATION lib)
prj/src/main.cpp
#include <iostream>
#include "libheader.h"
using std::cout;
int main()
{
cout << getRandomNumber() << "\n";
return 0;
}
lib/include/libheader.h
#ifndef _LIBHEADER_H_
#define _LIBHEADER_H_
int getRandomNumber();
#endif
lib/src/libsource.cpp
#include <iostream>
#include "libheader.h"
int getRandomNumber()
{
return 4; // guaranteed to be random.
}
Bạn có thể sử dụng lệnh sau đây để xây dựng tất cả:
pushd . && mkdir lib/build && cd lib/build && cmake .. && make && make install && popd && pushd . && mkdir prj/build && cd prj/build && cmake .. && make || popd
EDIT: mong muốn cmakelists trong dự án chính:
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)
add_subdirectory(${WORK_DIR}/../lib ${CMAKE_CURRENT_BINARY_DIR}/lib.d)
# force install here, somehow
# because if not we will get "include could not find load file" here.
include(${CMAKE_CURRENT_BINARY_DIR}/install/lib/libtargets.cmake)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/install/include)
Hãy xem mô-đun [ExternalProject] (http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:ExternalProject) –