সর্বদা সর্বনিম্ন প্রয়োজনীয় সংস্করণ নির্দিষ্ট করুন 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)