cmake ile yapı yapılandırması yazıyorum: kendi koduyla ana proje dışında bazı dış kütüphaneler vardır. Bu kütüphanelerin kolay güncellenmesi için (zlib, libpng, ...) cmakelist dosyalarını değiştirmek istemiyorum, ancak belirli kütüphane hedeflerine (örneğin, target_link_libraries() içinde kullanmak için) ihtiyacım var. Diğer bir kısıtlama ise, kodumun harici kütüphanelere yüklenmesi gerektiğini söyleyemem, her şeyin tek bir kod ağacında bulunması ve birlikte oluşturulması gerekiyor. Herşeyi kütüphaneler yapılandırılmış (libs, header) sağlamak için Yerel bina klasörüne (make install
does) kitaplıklarını yüklemek istiyorum ve sonra projeye gerekli hedefleri almak için oluşturulan cmake dosyasını dahil etmek istiyorum. aşağıdaki gibiCmake hedef tetikleme yüklemek
Ben akışını varsayalım:
- birincil projede
- kullanımı ithal hedefleri oluşturulan cmake-dosyasını kullanarak
- ithalat hedefleri yerel dizine harici kütüphane dosyaları yüklemek
add_subdirectory()
- ile dış kütüphane kurmak cmake dosyaları
Sorun adım 2'yi otomatik hale getirmektir (gerek ana proje CMakeLists.txt içinde add_subdiretory
sonra install
hedef tetikleyin. Tüm kütüphaneleri kurabilir ve kurabilir ve kendi kodunu oluşturabilirim, ancak bu uygun değil.
Yani soru, cmake'nin derleme sırasında ara yükleme yapmasını nasıl söyleyebilirim? Burada
Biraz çalışma örneği:
dosya yapısı:
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// libheader.h
#ifndef _LIBHEADER_H_
#define _LIBHEADER_H_
int getRandomNumber();
#endif
lib/src/libsource bulunmaktadır.
pushd . && mkdir lib/build && cd lib/build && cmake .. && make && make install && popd && pushd . && mkdir prj/build && cd prj/build && cmake .. && make || popd
DÜZENLEME: Ana projede istenen cmakelists: cpp
#include <iostream>
#include "libheader.h"
int getRandomNumber()
{
return 4; // guaranteed to be random.
}
Hepiniz oluşturmak için aşağıdaki komutu kullanabilirsiniz
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)
[ExternalProject] (http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:ExternalProject) modülüne bir göz atın. –