CMake stil kılavuzu
Aşağıdakilerden biri olan tüm CMake betiklerini bekliyoruz:
- dizininde
scripts/
veya vcpkg-*
Bağlantı noktasında
bu belgede belirtilen yönergeleri izlemelidir. Mevcut betikler henüz bu yönergeleri izlemeyebilir; eski betikleri bu yönergelere uygun olacak şekilde güncelleştirmeye devam edeceğiz.
Bu yönergeler betiklerimizde kararlılık oluşturmaya yöneliktir. Hem ileri hem de geri uyumluluğunu kolaylaştıracaklarını umuyoruz.
Out-parameters dışında, işlev parametreleri yerine veya öğesine başvurmak
${ARG<N>}
yerine her zaman kullanırızcmake_parse_arguments()
."Betik yerel yardımcı işlevleri" için bunun izlenmesi gerekmez
- Bu durumda, konumsal parametreler işlev bildirimine (kullanmak
${ARG<N>}
yerine) yerleştirilmeli ve yerel kurallara (örn.snake_case
) göre adlandırılmalıdır. - Özel durum: İsteğe bağlı olan konumsal parametrelere denetlendikten sonra
ARGC
aracılığıylaset(argument_name "${ARG<N>}")
bir ad verilmelidir.
- Bu durumda, konumsal parametreler işlev bildirimine (kullanmak
Out-parameters işlevin ilk parametresi olmalıdır. Örnek:
function(format out_var) cmake_parse_arguments(PARSE_ARGV 1 "arg" ...) # ... set(buffer "output") set("${out_var}" "${buffer}" PARENT_SCOPE) endfunction()
Ayrıştırılmamış veya kullanılmayan bağımsız değişken yoktur. Her zaman veya
arg_UNPARSED_ARGUMENTS
öğesiniARGN
denetleyin.FATAL_ERROR
mümkün olduğunda,WARNING
geriye dönük uyumluluk için gerekirse.Tümü
cmake_parse_arguments
kullanmalıdırPARSE_ARGV
.Tüm
foreach
döngüler , veyaIN ITEMS
RANGE
kullanmalıdırIN LISTS
.ve
${ARGN}
değişkenleri${ARGV}
, kullanıcıya yararlı iletiler dışında başvurulmaz.- (örn.
message(FATAL_ERROR "blah was passed extra arguments: ${ARGN}")
)
- (örn.
Makroları veya en üst düzey kodu değil her zaman işlevleri kullanırız.
- Özel durum: "betik yerel yardımcı makroları". Bazen küçük bir makro tanımlamak yararlı olabilir. Bu işlem tedbirli bir şekilde yapılmalı ve işlevler tercih edilmelidir.
- Özel durum:
vcpkg.cmake
'sfind_package
.
Betik ağacındaki betiklerin normal işlemin bir parçası olarak gözlemlenebilir değişikliklere ihtiyacı olması beklenmemelidir.
- Örnek ihlal:
vcpkg_acquire_msys()
MSYS projesinin eski paketleri bırakması nedeniyle zaman içinde güncelleştirilmesi gereken sabit kodlanmış paketlere ve sürümlere sahiptir. - Örnek özel durum:
vcpkg_from_sourceforge()
bakıma ihtiyacı olan ancak arayanlar üzerinde gözlemlenebilir bir davranış etkisi olmayan yansıtmaların bir listesine sahiptir.
- Örnek ihlal:
Alıntılama kuralları: CMake'te üç tür bağımsız değişken vardır: alıntısız (
foo(BAR)
), tırnak işareti (foo("BAR")
) ve köşeli ayraçlı (foo([[BAR]])
). Doğru alıntı yapmak için şu kuralları izleyin:Bağımsız değişken bir genişletme
${...}
içeriyorsa, tırnak içine alınmalıdır.Özel durum: bir değişken birden çok bağımsız değişken olarak işleve geçirildiğinde bir "splat" değişken genişletmesi. Bu durumda, bağımsız değişken basitçe olmalıdır
${foo}
:vcpkg_list(SET working_directory) if(DEFINED "arg_WORKING_DIRECTORY") vcpkg_list(SET working_directory WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}") endif() # calls do_the_thing() if NOT DEFINED arg_WORKING_DIRECTORY, # else calls do_the_thing(WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}") do_the_thing(${working_directory})
Aksi takdirde, bağımsız değişken ,
\"
veya\$
olmayan\\
kaçış dizileri içeriyorsa, bu bağımsız değişken tırnak içine alınmış bir bağımsız değişken olmalıdır.- Örneğin:
"foo\nbar"
tırnak içine alınmalıdır.
- Örneğin:
Aksi takdirde, bağımsız değişken bir
\
,"
veya$
içeriyorsa, bu bağımsız değişken köşeli ayraç içine alınmalıdır.Örnek:
set(x [[foo\bar]]) set(y [=[foo([[bar\baz]])]=])
Aksi takdirde, bağımsız değişken alfasayısal veya
_
olmayan karakterler içeriyorsa, bu bağımsız değişken tırnak içine alınmalıdır.Aksi takdirde bağımsız değişkenin tırnak işareti kaldırılmalıdır.
Özel durum: türünde
<variable|string>
bağımsız değişkenlerif()
her zaman tırnak içine alınmalıdır:Karşılaştırma işleçlerinin her iki bağımsız değişkeni de -
EQUAL
,STREQUAL
,VERSION_LESS
vb.ve için ilk bağımsız değişken
MATCHES
IN_LIST
Örnek:
if("${FOO}" STREQUAL "BAR") # ... if("${BAZ}" EQUAL "0") # ... if("FOO" IN_LIST list_variable) # ... if("${bar}" MATCHES [[a[bcd]+\.[bcd]+]]) # ...
Tek ifadeler ve almayan
<variable|string>
diğer koşul türleri için normal kuralları kullanın.
Basit out-parameters dışında hiçbir "işaretçi" veya "in-out" parametresi yoktur (burada bir kullanıcı içerik yerine değişken adı geçirir).
Değişkenlerin boş olduğu varsayılmaz. Değişkenin yerel olarak kullanılması amaçlanıyorsa, bir dize değişkeniyse ve
vcpkg_list(SET foo)
bir liste değişkeniyse ile birlikte açıkça boşset(foo "")
olarak başlatılmalıdır.set(var)
kullanılmamalıdır. Bir değişkeni ayarlamak,set(var "")
boş dizeye ayarlamak vevcpkg_list(SET var)
boş listeye ayarlamak için kullanınunset(var)
. Not: boş dize ve boş liste aynı değerdir;bu, sonuç farkı yerine bir notasyon farkıdırBir API sınırı boyunca üst kapsamdan devralınması beklenen tüm değişkenler (dosya yerel işlevi değil) belgelenmelidir. Üçlü dosyalarda belirtilen tüm değişkenler belgelenmiş olarak kabul edilir.
Out parametreleri yalnızca içinde
PARENT_SCOPE
ayarlanır ve hiçbir zaman okunmaz. Ayrıca bir işlev kapsamı aracılığıyla parametreleri iletmek için yardımcıyaz_vcpkg_forward_output_variable()
bakın.CACHE
değişkenler yalnızca güçlü bir şekilde bağlanmış işlevler arasında dahili olarak paylaşılan genel değişkenler için ve yineleme işini önlemek için tek bir işlev içindeki iç durum için kullanılır. Bunlar son derece dikkatli kullanılmalıdır ve diğer kodlar tarafından tanımlanacak yerel değişkenlerle çakışmayı önlemek için ön ekini kullanmalıdırZ_VCPKG_
.- Örnekler:
vcpkg_cmake_configure
'sZ_VCPKG_CMAKE_GENERATOR
z_vcpkg_get_cmake_vars
'sZ_VCPKG_GET_CMAKE_VARS_FILE
- Örnekler:
include()
s yalnızca veyavcpkg-port-config.cmake
içindeports.cmake
izin verilir.foreach(RANGE)
'nin bağımsız değişkenleri her zaman doğal sayılar olmalı ve<start>
her zaman değerinden küçük veya eşit<stop>
olmalıdır.Bu, aşağıdaki gibi bir şey tarafından denetlenmelidir:
if("${start}" LESS_EQUAL "${end}") foreach(RANGE "${start}" "${end}") ... endforeach() endif()
Tüm bağlantı noktası tabanlı betikler, birden çok kez dahil edilmemek için kullanılmalıdır
include_guard(GLOBAL)
.
- dışında
vcpkg.cmake
tüm CMake betikleri, içinde bulunancmake_minimum_required
ports.cmake
CMake sürümünü varsayabilir.- CMake'in
cmake_minimum_required
yeni bir sürümü her eklendiğindevcpkgTools.xml
, tüm yardımcıCMakeLists.txt
dosyalarda olduğu gibicmake_minimum_required
bu da çarpılmalıdır.
- CMake'in
vcpkg.cmake
CMake sürümünün genel olarak 3.7.2 sürümüne geri döndüğünü varsaymalıdır- Belirli işlevler ve seçenekler daha büyük bir CMake sürümü varsayabilir; varsa, bu işlevi veya seçeneği gerekli CMake sürümüyle açıklama satırı yaptığınızdan emin olun.
- İç olmayan işlevlerdeki bağımsız değişkenleri hiçbir zaman kaldırmaz; Artık bir şey yapmamaları gerekiyorsa, bunları normal kabul edin ve kullanım konusunda uyarın.
- Hiçbir zaman yeni bir zorunlu bağımsız değişken eklemeyin.
cmake_parse_arguments
: ön eki olarak ayarla"arg"
Yerel değişkenler ile adlandırılır
snake_case
İç genel değişken adları ön ek olarak
Z_VCPKG_
eklenir.Dış deneysel genel değişken adları ile
X_VCPKG_
ön eklenmiştir.İç işlevler ön ekli
z_vcpkg_
- Tek bir işlevin (yani yardımcı işlevlerin) iç işlevleri olarak adlandırılır
[z_]<func>_<name>
; burada<func>
yardımcı oldukları işlevin adı ve<name>
yardımcı işlevin yaptığı addır.z_
, yoksa<func>
z_
, ancak yardımcı işlevinez_z_foo_bar
ad vermediyseniz öne eklenmelidir.
- Tek bir işlevin (yani yardımcı işlevlerin) iç işlevleri olarak adlandırılır
Genel genel değişkenler olarak adlandırılır
VCPKG_
.
vcpkg geri bildirimi
vcpkg, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: