Sono nuovo di CMake e ho un problema a cui non riesco a capire una soluzione. Sto usando CMake per compilare un progetto con un gruppo di sotto-dir opzionali e crea file di libreria condivisi come previsto. Questa parte sembra funzionare bene. Ciascuna di queste sub-dir contiene un file sql. Devo concat tutto tutti i file sql selezionati in un file di intestazione sql e installare il risultato. Così un file come:Utilizzando CMake, come posso concatare i file e installarli
sql_header.sql
sub_dir_A.sql
sub_dir_C.sql
sub_dir_D.sql
Se ho fatto questo direttamente in un file make potrei fare qualcosa di simile a quanto segue solo più intelligente per affrontare solo i sub-directory selezionati:
cat sql_header.sql > "${INSTALL_PATH}/somefile.sql"
cat sub_dir_A.sql >> "${INSTALL_PATH}/somefile.sql"
cat sub_dir_C.sql >> "${INSTALL_PATH}/somefile.sql"
cat sub_dir_D.sql >> "${INSTALL_PATH}/somefile.sql"
ho sorta della capito pezzi di questo, come posso usare:
LIST(APPEND PACKAGE_SQL_FILES "some_file.sql")
che presumo che posso mettere in ognuno dei file sub-dirs CMakeLists.txt per raccogliere i nomi dei file. E posso creare una macro simile:
CAT(IN "${PACKAGE_SQL_FILES}" OUT "${INSTALL_PATH}/somefile.sql")
Ma mi sono perso tra quando il CMake corre inizialmente e quando viene eseguito dal make install. Forse c'è un modo migliore per farlo. Ho bisogno che funzioni su Windows e Linux.
Sarei felice con alcuni suggerimenti per indicarmi la giusta direzione.
Bel uso di configure_file ... ;-) – DLRdave
Grazie, è stato molto utile.È difficile ottenere risultati in bolla se si hanno più directory a più profondità, ma ho avuto modo di lavorare usando i suggerimenti molto utili. Grazie! –
Ho provato questo, e ha funzionato ... a meno che il file non abbia il punto e virgola, a quel punto fallisce perché il punto e virgola viene rimosso in modo silenzioso. Questa è una normale conseguenza del fatto che il punto e virgola è il separatore di lista in cmake. Il caso di test più semplice che mostra il problema è 'set (CONTENTS" a; b; c \ n ") file (WRITE out.txt $ {CONTENTS})' La correzione è di citare il contenuto quando si scrive, ad es. '" $ {CONTENTS} "' –