Come incorniciare il concetto dietro CMake?

2

Sto usando CMake per diversi anni e ho scoperto che - nei casi in cui sono alle prese con CMake - sono ancora non completamente sicuro del concetto alla base di CMake (non prendendo in considerazione CTest , CPack o CDash fornito anche con CMake).

Quando ho iniziato mi sono imbattuto in la presentazione di Bill Hoffman su Google Tech Talks e un reclamo in cui mi è rimasto in mente:

CMake aims to give C++ compile portability like the compile once and run everywhere of Java, Python and C#

Partendo da lì e dai concetti base della pagina di CMake , sono arrivato a pensare a CMake in termini dei seguenti tre principali concetti di programmazione a livello:

  1. CMake è un livello di astrazione per la build e i sistemi operativi che supporta
  2. CMake è un linguaggio di programmazione di alto livello per le descrizioni delle procedure di creazione
  3. CMake ti assiste nello sviluppo multipiattaforma creando parti di codice configurabili

Sono pienamente consapevole della complessità del compito di CMake, ma spero che tu possa comunque aiutarmi con:

  • Essendo un livello di astrazione, non può / non deve esporre tutte le funzionalità del livello sottostante. Quindi, perché ci sono così tanti buchi da esplorare in CMake?
    • Soprattutto i comandi dall'inizio hanno bypass. Per esempio. add_definitions() : "Questo comando può essere utilizzato per aggiungere eventuali flag, ma è destinato ad aggiungere definizioni pre-processore "
    • Vedo che CMake sta andando nella giusta direzione, ad es. target_compile_features() per l'astrazione dei flag del compilatore
  • Per i casi in cui ho davvero bisogno di un bypass (qualcosa che posso realizzare solo nella lingua madre) perché CMake non fornisce un modo generico di "codice nativo in linea" come fanno altri linguaggi di programmazione di alto livello?
    • es. come la asm macro / comando in C ++
  • Va bene in CMake aggiungere un altro livello di astrazione a CMake stesso (per nascondere la complessità di CMake agli utenti dei miei ambienti di compilazione)?
    • Penso di si. E poiché capisco che è un linguaggio di programmazione di alto livello, perché no?

Grazie in anticipo per le tue opinioni e aiuto in questo.

    
posta Florian 15.10.2015 - 10:31
fonte

1 risposta

1

Dichiarazione di non responsabilità: la mia esperienza con CMake è estremamente limitata, quindi potrei facilmente sbagliare in alcune delle seguenti azioni.

Come ho capito, CMake è semplicemente un sistema di costruzione. In particolare, si propone di essere un sistema di compilazione per progetti multipiattaforma, utilizzabile su più sistemi operativi e compilatori.

Per motivi tecnici solidi, gli sviluppatori di CMake hanno scelto di implementare il loro sistema di build come strato su sistemi di build specifici della piattaforma (file di progetto di Visual Studio, makefile, ecc.), ma questo potrebbe aiutare a spiegare perché presentare una perdita il livello di astrazione di prova non è il suo obiettivo di design primario .

L'architettura delle applicazioni open source ha un chapter su CMake . Potrebbe fornire ulteriori approfondimenti. Ad esempio, discutono il design del linguaggio di CMake:

The CMake language is meant to be very simple. However, it is one of the major obstacles to adoption when a new project is considering CMake. Given its organic growth, the CMake language does have a few quirks. The first parser for the language was not even lex/yacc based but rather just a simple string parser. Given the chance to do the language over, we would have spent some time looking for a nice embedded language that already existed. Lua is the best fit that might have worked. It is very small and clean. Even if an external language like Lua was not used, I would have given more consideration to the existing language from the start.

    
risposta data 15.10.2015 - 15:09
fonte

Leggi altre domande sui tag