Saya memiliki Proyek A yang mengekspor pustaka statis sebagai target:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Sekarang saya ingin menggunakan Proyek A sebagai proyek eksternal dari Proyek B dan menyertakan target yang dibangun:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Masalahnya adalah bahwa file penyertaan belum ada saat CMakeLists dari Proyek B dijalankan.
Apakah ada cara untuk membuat penyertaan bergantung pada proyek eksternal yang sedang dibangun?
Pembaruan : Saya menulis tutorial singkat CMake by Example berdasarkan ini dan masalah umum lainnya yang saya temui.
sumber
ExternalProject_Add
hanya bersikap sepertiadd_subdirectory
dan mengekspos semua target. Solusi yang Anda jelaskan di atas mungkin masih yang terbersih.ExternalProject
. Apakah itu konsistensi, atau lebih kanonik, atau sesuatu yang lain? Saya yakin saya kehilangan sesuatu yang mendasar di sini.Posting ini memiliki jawaban yang masuk akal:
CMakeLists.txt.in
:CMakeLists.txt
:Namun tampaknya cukup hacky. Saya ingin mengusulkan solusi alternatif - gunakan submodul Git.
Kemudian
MyProject/dependencies/gtest/CMakeList.txt
Anda dapat melakukan sesuatu seperti:Saya belum mencoba ini secara ekstensif tetapi tampaknya lebih bersih.
Sunting: Ada kerugian untuk pendekatan ini: Subdirektori mungkin menjalankan
install()
perintah yang tidak Anda inginkan. Posting ini memiliki pendekatan untuk menonaktifkannya tetapi itu buggy dan tidak berfungsi untuk saya.Edit 2: Jika Anda menggunakannya
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
, sepertinyainstall()
perintah di subdirektori tidak digunakan secara default.sumber
GIT_TAG
selama klon, Anda dapat kehilangan pengulangan build karena 2 tahun dari sekarang seseorang yang menjalankan skrip build akan mendapatkan versi yang berbeda dari yang Anda lakukan. Dokumen CMake merekomendasikan ini juga.Sunting: CMake sekarang memiliki dukungan bawaan untuk ini. Lihat jawaban baru .
Anda juga bisa memaksakan pembangunan target dependen dalam proses pembuatan sekunder
Lihat jawaban saya tentang topik terkait.
sumber
cmake
ExternalProject_Add
memang dapat digunakan, tetapi yang tidak saya sukai - adalah ia melakukan sesuatu selama pembuatan, polling berkelanjutan, dll. Saya lebih suka membangun proyek selama fase build, tidak ada yang lain. Saya telah mencoba menimpaExternalProject_Add
dalam beberapa upaya, sayangnya tidak berhasil.Kemudian saya juga mencoba menambahkan git submodule, tetapi itu menyeret seluruh repositori git, sementara dalam kasus tertentu saya hanya memerlukan subset dari seluruh repositori git. Apa yang telah saya periksa - memang mungkin untuk melakukan pemeriksaan git yang jarang, tetapi itu memerlukan fungsi terpisah, yang saya tulis di bawah ini.
Saya telah menambahkan dua pemanggilan fungsi di bawah ini hanya untuk mengilustrasikan bagaimana menggunakan fungsi tersebut.
Seseorang mungkin tidak suka checkout master / trunk, karena itu mungkin rusak - maka selalu mungkin untuk menentukan tag tertentu.
Checkout akan dilakukan hanya sekali, sampai Anda menghapus folder cache.
sumber
Saya sedang mencari solusi serupa. Balasan di sini dan Tutorial di atas bersifat informatif. Saya mempelajari posting / blog yang dirujuk di sini untuk membangun kesuksesan saya. Saya memposting CMakeLists.txt lengkap bekerja untuk saya. Saya rasa, ini akan berguna sebagai template dasar untuk pemula.
"CMakeLists.txt"
sumber