2013-12-11 35 views
5

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:

  1. xây dựng thư viện bên ngoài với add_subdirectory()
  2. cài đặt tập tin thư viện bên ngoài vào thư mục địa phương
  3. chỉ tiêu nhập khẩu sử dụng tạo ra cmake-file
  4. chỉ tiêu nhập khẩu
  5. 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) 
+0

Hãy xem mô-đun [ExternalProject] (http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:ExternalProject) –

Trả lời

1

xin lỗi, tôi không có đặc quyền để đưa bình luận

Vì vậy, tôi đặt liên kết tham chiếu tại đây

https://cmake.org/Bug/view.php?id=14311

này cũng rất hữu ích khi bao gồm cả mã nhị phân thư viện được xây dựng sẵn trong dự án .

add_library (dựng sẵn TĨNH NHẬP KHẨU) set_Property (MỤC TIÊU dựng sẵn HỮU IMPORTED_LOCATION $ {} CMAKE_CURRENT_SOURCE_DIR /libprebuilt.a)

cài đặt (CHỈ TIÊU other_built_targets dựng sẵn KHẨU dự án xuất RUNTIME ĐIỂM bin THƯ VIỆN ĐIỂM lib LƯU TRỮ DESTINATION lib)

Việc tạo sẵn một mục tiêu đã nhập giúp thuận tiện sử dụng trong dự án và xử lý nó giống như bất kỳ mục tiêu nào khác.

Các vấn đề liên quan