cmake - 04 - Instalando targets, arquivos e diretórios
Index Chapter 01 02 03 04
Modos de instalação
o cmake disponibiliza os seguintes modos de instalação:
- install(TARGETS): este comando instala artefatos resultante do build, mas também bibliotecas e executáveis.
- install(FILES ou PROGRAMS): Este comando instala arquivos ou programas, além de atribuir permissões
- install(DIRECTORY): Este comando instala toda a estrutura de diretório.
- install(SCRIPT|CODE): Este comando executa um script cmake ou um trecho de código durante a instalação
- install(EXPORT): Este comando gera e instala um arquivo de exportação;
Instalando targets
Este comando é responsável por configurar a instalação. Somente artefatos de saída serão instalados. Os artefatos mais comuns são ARCHIVE, LIBRARY e RUNTIME. Consulte tipos de targets
Após o target ser marcado como instalável, CMake cuidará de produzir o código necessário para os artefatos produzidos pelo target.
Configurando o caminho de instalação
Vamos executar um exemplo:
cmake -B ./buildtree
cmake --build ./buildtree
cmake --install ./buildtree --prefix /tmp/teste_instalacao
O comando cmake --install tem os seguintes parâmetros:
--default-directory-permissions <permississões>: este comando atribui um conjunto padrão de permissão para os diretórios( u=rwx,g=rx,o=rx).
-v, --verbose: modo verboso, imprime na tela a execução durante a instalação.
--prefix <prefixo> Para especificar um caminho de destino fora do padrão armazenado na variável CMAKE_INSTALL_PREFIX.
Para configurar esta variável execute o comando no seu terminal:
cmake -DCMAKE_INSTALL_PREFIX=<caminho da instalação>
Se essa variável não for configurada, CMake irá atribui os valores padrão para esta variável como /usr/local no Unix e C:\Program Files no windows.
Para verificar se o comando foi inserido no cache use ccmake . (não se esqueça do ponto !)

Ou na linha de comando digite
cmake LAH | grep CMAKE_INSTALL_PREFIX
Também é possível adicionar diretamente no arquivo CMakeLists.txt, mas isso deve ser feito antes do comando project, se não ocorrerá erro na compilação.
SET(CMAKE_INSTALL_PREFIX <caminho da instalação>)
Para vários generators use o --config Debug no parâmetro da linha de comando install no shell. Por exemplo, para adicionar uma configuração específica para o generator Debug, execute conforme abaixo:
cmake -DCMAKE_INSTALL_PREFIX=<caminho da instalação> --config Debug
Caso não seja apresentado um caminho de instalação, o CMake usará usr/bin, por motivos históricos este é o path que tradicionalmente serve a esses propósitos no ambiente UNIX.
Repare que a instalação não moveu o executável diretamente para o caminho de destino, ao invés disso, ele criou um subdiretório bin, ou seja, caminho de destino/bin. Isso porque tradicionalmente os binários executáveis são adicionados dentro deste subdiretório. Mas vocês pode mudar esta configuração padrão do diretório de saída específicos para os artefatos
Configurando o diretório de saída
Os diretórios de saída podem ser configurados também no próprio comando comando install.
install(TARGETS <target>
RUNTIME DESTINATION <caminho da instalação>
)

| Tipo de Target | Variáveis do módulo GNUInstallDirs | diretório padrão |
|---|---|---|
| RUNTIME | {CMAKE_INSTALL_LIBDIR} |
lib |
| ARCHIVE | {CMAKE_INSTALL_INCLUDEDIR} |
include |
| PUBLIC_HEADER | `{CMAKE_INSTALL_DOCDIR}/myproj) |
install(FILES my-api.h {CMAKE_INSTALL_DOCDIR}/myproj
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ
)
> [!FAQ]
> O comando install(PROGRAMS...) é equivalente ao comando install (FILES...) com a diferença de que as permissões **OWNER_EXECUTE, GROUP_EXECUTE e WORLD_EXECUTE** serão automaticamente configuradas para o arquivo instalado.
>
### Instalando Diretórios
> [!TIP] install(DIRECTORY \<caminho do diretório\> ... TYPE \<tipo\> | DESTINATION \<dir\> [PERMISSIONS permissão...]) )
> Utilize este comando para instalação de diretórios. A estrutura inteira de diretórios e subdiretórios será replicada da forma que ela estiver.
Da mesma forma que o install(FILES). Existem também alguns atributos similares que podem ser usados com este comando:
*TYPE* é a mesma ideia do parâmetro install(FILES ... TYPE)
*DESTINATION* define o diretórios que serão copiados para um caminho determinado, podendo ser fora do ambiente padrão de instalação. Caminhos relativos serão acrescentados à variável CMAKE_INSTALL_PREFIX enquanto caminhos absolutos são usados da forma que estiverem, mas não serão suportados pelo cpack
*PATTERN* ou *REGEX* são filtros que permitem selecionar os diretórios que serão copiados para o diretório de instalação. Se quiser filtrar apenas por arquivos use *FILES_MATCHING PATTERN*
*FILE_MATCHING PATTERN* ou *FILE_MATCHING REGEX* parâmetro que permite estabelecer um critério de filtro para selecionar os arquivos que serão instalados, onde regex permite usar expressões regulares. Repare que este comando não se aplica a diretórios. Se quiser selecionar diretórios use o parâmetro EXCLUDE como veremos logo a seguir.
*EXCLUDE PATTERN* ou *PATTERN \<padrão para exclusão\> EXCLUDE* são dois parâmetros similares que permitem ignorar determinados diretórios durante a instalação.
Exemplos extraídos da documentação oficial
```cmake
install(DIRECTORY src/ DESTINATION doc/myproj FILES_MATCHING PATTERN "*.png")
install(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
P*MISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)
install(DIRECTORY diretorio1 DESTINATION {CMAKE_INSTALL_LOCALSTATEDIR} PATTERN "output" EXCLUDE)
Se nenhum diretório de input for fornecido, o diretório de destino será criado vazio.
O parâmetro PERMISSION
PERMISSION este parâmetro permite atribuir e alterar permissões durante a instalação de arquivos ou diretórios. Os valores possíveis são:
| OWNER | GROUP | WORLD |
|---|---|---|
| OWNER_READ | GROUP_READ | WORLD_READ |
| OWNER_WRITE | GROUP_WRITE | WORLD_WRITE |
| OWNER_EXECUTE | GROUP_EXECUTE | WORLD_EXECUTE |
O parâmetro OPTIONAL
Este parâmetro define a instalação do arquivo como opcional. A instalação não gerará erros caso o arquivo (ou diretório) não esteja presente.