CMake: Geçişli bağımlılığın nereden geldiğini nasıl anlarım?


10

Otomatik bağımlılık yayma gibi modern özellikleri kullanmak için eski bir CMake kurulumunu yeniden yazma sürecindeyim. (örneğin, target_include_directories(<target> PUBLIC <dir>)bunun yerine gibi şeyler kullanarak include_directories(<dir>)) Şu anda, bir grup genel dizin özelliği ayarlayarak tüm proje bağımlılığı bilgilerini el ile işliyoruz.

Testlerimde, yeni yapıdaki bir hedefin, eski yapıdaki bir kütüphaneye bağlanacağı birkaç örnek buldum. Ben projenin en tüm özyinelemeli görünüme sahip olan bir (ler) bulmak amacıyla bu hedefin bağımlılıkları geliyor bilmeleri, açıkça kendisine bağlayan söylemiyorum ama CMakeLists.txtben bulana kadar bağımlılık hiyerarşisini takip etmek, s söz konusu kütüphaneyi çeken bir kitap. Düzinelerce kütüphanemiz var, bu yüzden bu önemsiz bir süreç değil.

CMake, her bir hedef için hangi bağımlılıklarının açıkça eklendiğini ve hangilerinin geçişli bağımlılıklar yoluyla yayıldığını görmenin herhangi bir yolunu sunuyor mu?

Görünüşe --graphvizçıkış yapar bu farkı göstermek, böylece açıkça CKağıt içten bağlamı bilir. Ancak, treekomut satırında bağımlılık bilgilerini göstermek için benzer bir komut dosyası yazmak istiyorum ve Graphviz dosyalarını ayrıştırmak hem kabus hem de kesmek gibi geliyor.

Bildiğim kadarıyla söyleyebilirim, cmake-file-apiyok değil bu bilgiyi içermektedir. codemodel/target/dependenciesAlanın işe yarayabileceğini düşündüm , ancak hem karma hem de geçişli bağımlılıkları listeliyor. Ve backtraceher bağımlılığın alanı yalnızca geçerli hedef için add_executable/ add_libraryçağrısına geri bağlanır .


1
--graphizSeçenek sorunuza nasıl cevap vermiyor? Nokta dosyalarını ayrıştırmak neden kabus gibi geliyor? Nokta dosyaları, insan tarafından okunabilir bağlı noktaları temsil etmenin en basit, ortak ve esnek yoludur. İle gvprfayda Eğer awk-imsi tarzda onlarla her şeyi yapabilir ve diğer dillerde aktarabilirsiniz. Neden tam anlamıyla hedefler arasında ağaç benzeri bir bağımlılık yapısını temsil eden bir nokta dosyası, ne istediğini "görmenin" bir yolu değil?
KamilCuk

@KamilCuk Fuarı yeterli. Bence JSON gibi daha standart bir format için ek paketler kurmadan ve kendi ayrıştırıcımı yazmadan okuyabileceğimi umuyordum. Bağımlılık grafiğinin birden çok formatta kullanılabileceğini varsaydım (yine de örneğin CMake sunucusu API'sini denemem gerekiyor ). Ancak dotfiles bu bilgiyi almanın en kolay (veya tek) yoluysa, sorun değil.
0x5453

1
Graphviz'e bunları farklı gösteren çok fazla bahis oynamam. Bunu anlatan kod buraya bağlı , çok karmaşık değil.
kert

Yanıtlar:


4

dotTarafından oluşturulan dosyayı ayrıştırabilir graphvizve istediğiniz ayrıntıları ayıklayabilirsiniz. Aşağıda bunu yapmak için örnek python betiği bulunmaktadır.

import pydot
import sys

graph = pydot.graph_from_dot_file(sys.argv[1])
result = {}

for g in graph:
    # print(g)
    for node in g.get_node_list():
        if node.get("label") != None:
            result[node.get("label")] = []

    for edge in g.get_edges():
        result[g.get_node(edge.get_source())[0].get("label")].append(g.get_node(edge.get_destination())[0].get("label"))

for r in result:
    print(r+":"+",".join(result[r]))

Ayrıca cmake'den özel hedef olarak çalıştırmak için bu komut dosyasını da ekleyebilirsiniz, böylece sisteminizi sizden derleyebilirsiniz. Örnek cmake projesini burada bulabilirsiniz


Örnek için teşekkürler, bakmam gerekecek pydot.
0x5453
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.