সর্বদা সর্বনিম্ন প্রয়োজনীয় সংস্করণ নির্দিষ্ট করুন cmake
cmake_minimum_required(VERSION 3.9)
আপনি একটি প্রকল্প ঘোষণা করা উচিত। cmakeবলেছেন এটা বাধ্যতামূলক এবং এটা সুবিধাজনক ভেরিয়েবল নির্ধারণ করবে PROJECT_NAME, PROJECT_VERSIONএবং PROJECT_DESCRIPTION(3.9 cmake এই আধুনিক পরিবর্তনশীল অবশ্যম্ভাবী):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
একটি নতুন লাইব্রেরির লক্ষ্য ঘোষণা করুন। দয়া করে এর ব্যবহার এড়িয়ে চলুন file(GLOB ...)। এই বৈশিষ্ট্যটি সংকলন প্রক্রিয়াটিতে অংশীদারিত্বের সরবরাহ করে না। আপনি যদি অলস হন তবে এর কপি-পেস্ট আউটপুট ls -1 sources/*.cpp:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
VERSIONসম্পত্তি সেট করুন (alচ্ছিক তবে এটি একটি ভাল অনুশীলন):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
আপনি SOVERSIONএকটি বড় সংখ্যা সেট করতে পারেন VERSION। সুতরাং libmylib.so.1একটি syMLink হবে libmylib.so.1.0.0।
set_target_properties(mylib PROPERTIES SOVERSION 1)
আপনার লাইব্রেরির সর্বজনীন এপিআই ঘোষণা করুন। এই API টি তৃতীয় পক্ষের অ্যাপ্লিকেশনের জন্য ইনস্টল করা হবে। এটি আপনার প্রকল্পের গাছে আলাদা করা ভাল অনুশীলন (এটি include/ডিরেক্টরি স্থাপনের মতো )। লক্ষ্য করুন যে, প্রাইভেট শিরোনামগুলি ইনস্টল করা উচিত নয় এবং আমি উত্স ফাইলগুলির সাথে সেগুলি রাখার জন্য দৃ strongly়ভাবে পরামর্শ দিই।
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
আপনি যদি সাব-ডাইরেক্টরিগুলির সাথে কাজ করেন তবে আপেক্ষিক পাথগুলি অন্তর্ভুক্ত করা খুব সুবিধাজনক নয় "../include/mylib.h"। সুতরাং, অন্তর্ভুক্ত ডিরেক্টরিতে একটি শীর্ষ ডিরেক্টরি পাস করুন:
target_include_directories(mylib PRIVATE .)
অথবা
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
আপনার গ্রন্থাগারের জন্য একটি ইনস্টল বিধি তৈরি করুন। আমি CMAKE_INSTALL_*DIRসংজ্ঞায়িত ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দিই GNUInstallDirs:
include(GNUInstallDirs)
এবং ইনস্টল করার জন্য ফাইলগুলি ঘোষণা করুন:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
আপনি একটি pkg-configফাইল রফতানিও করতে পারেন । এই ফাইলটি আপনার তৃতীয় পক্ষের অ্যাপ্লিকেশনটিকে সহজেই আপনার গ্রন্থাগারটি আমদানির অনুমতি দেয়:
নামে একটি টেম্পলেট ফাইল তৈরি করুন mylib.pc.in( আরও তথ্যের জন্য পিসি (5) ম্যানপেজ দেখুন):
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
আপনার মধ্যে CMakeLists.txt, @ম্যাক্রোগুলি প্রসারিত করার জন্য একটি বিধি যুক্ত করুন ( @ONLYফর্মের ভেরিয়েবলগুলি প্রসারণ না করার জন্য চাকা করতে বলুন ${VAR}):
configure_file(mylib.pc.in mylib.pc @ONLY)
এবং পরিশেষে, উত্পন্ন ফাইল ইনস্টল করুন:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
আপনি cmake EXPORTবৈশিষ্ট্য ব্যবহার করতে পারেন । তবে এই বৈশিষ্ট্যটি কেবলমাত্র তার সাথে সামঞ্জস্যপূর্ণ cmakeএবং এটি ব্যবহার করা আমার পক্ষে কঠিন find
শেষ পর্যন্ত পুরো CMakeLists.txtদেখতে হবে:
cmake_minimum_required(VERSION 3.9)
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
include(GNUInstallDirs)
add_library(mylib SHARED src/mylib.c)
set_target_properties(mylib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER api/mylib.h)
configure_file(mylib.pc.in mylib.pc @ONLY)
target_include_directories(mylib PRIVATE .)
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)