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:

Instalando targets

install(TARGETS <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 !)

Pasted image 20230111211355.png

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>
)

Pasted image 20230111213549.png

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.

Referência