Stlink: [instalar] CMakeLists.txt hardcodes / etc / ... caminhos

Criado em 12 fev. 2017  ·  19Comentários  ·  Fonte: stlink-org/stlink

Por favor, use GNUInstallDirs [1] para que sysconfdir possa ser passado para cmake de uma forma padrão.

(Em Nixpkgs, agora temos que corrigir CMakeLists.txt, e isso é um trabalho extra inútil para downstreams.)

[1] https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html

codfeature-request generadocumention staturesolved

Todos 19 comentários

Isso está disponível apenas no CMake 3.0 ou superior, atualmente oferecemos suporte para 2.6 e superior. Isso interromperá a compatibilidade.

Você pode propor um PR / patch e tentar não quebrar a compatibilidade com 2.6-3.0. Obrigado!

Veja também # 899.

Devemos ser capazes de lidar com isso agora, já que o requisito de versão mínima para cmake foi elevado para 3.4.2, então ninguém precisa mais se preocupar com compatibilidade quebrada.

@bjornfor : Eu adicionei o módulo GNUInstallDirs.cmake localmente, mas ainda não tenho certeza de como integrá-lo adequadamente à configuração de compilação que temos atualmente. Vou abrir um novo branch para isso, para que você ou qualquer outra pessoa possa dar uma olhada. Tenho certeza de que há pessoas que sabem mais sobre cmake do que eu atualmente ...

@ Nightwalker-87: GNUInstallDirs.cmake é distribuído com cmake, você não precisa adicioná-lo à base de código.

Para usá-lo apenas

include(GNUInstallDirs)

# Now you have access to all the variables mentioned in the docs
message("/etc files will be installed to ${CMAKE_INSTALL_FULL_SYSCONFDIR}")

Eu entendo, mas isso é realmente tudo o que precisa ser feito sem relação com qualquer configuração personalizada?

Eu penso que sim. Aqui está uma diferença (não testada) de como eu substituiria duas instâncias / etc codificadas no stlink:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 90378f9..e81f621 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,8 +2,9 @@ cmake_minimum_required(VERSION 2.8.7)
 set(CMAKE_USER_MAKE_RULES_OVERRIDE cmake/c_flag_overrides.cmake)
 project(stlink C)
 set(PROJECT_DESCRIPTION "Open source version of the STMicroelectronics Stlink Tools")
-set(STLINK_UDEV_RULES_DIR "/etc/udev/rules.d" CACHE PATH "Udev rules directory")
-set(STLINK_MODPROBED_DIR "/etc/modprobe.d" CACHE PATH "modprobe.d directory")
+include(GNUInstallDirs)
+set(STLINK_UDEV_RULES_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/udev/rules.d" CACHE PATH "Udev rules directory")
+set(STLINK_MODPROBED_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/modprobe.d" CACHE PATH "modprobe.d directory")
 set(STLINK_STATIC_LIB ON CACHE BOOL "Install static lib")

 if( IS_DIRECTORY ${LIB_INSTALL_DIR})

Ah, as instâncias de "/ etc /" restantes estão em comentários ou documentação, então acho que o patch acima é tudo o que é necessário. (O patch em nixpkgs foi feito com sed e sem GNUInstallDirs, então não é diretamente aplicável.)

@bjornfor : Você pode testar?

Funciona, brinquei com este script:

#!/usr/bin/env bash                                                                                                                                                                                                                                                                                                          

set -x                                                                                                                                                                                                                                                                                                                       

cmakeFlags=                                                                                                                                                                                                                                                                                                                  
#cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_SYSCONFDIR=/etc"                                                                                                                                                                                                                                                                    

cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=/local"                                                                                                                                                                                                                                                                       
#cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=/tmp/stlink-prefix"                                                                                                                                                                                                                                                          
#cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=/usr"                                                                                                                                                                                                                                                                        
#cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=/usr/local"                                                                                                                                                                                                                                                                  
#cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=/opt"                                                                                                                                                                                                                                                                        
#cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=/opt/stlink"                                                                                                                                                                                                                                                                 

nix-shell -p cmake pkgconfig libusb --command "mkdir -p build && cd build && rm -rf ../build/* && cmake $cmakeFlags .."                                                                                                                                                                                                      

Eu também editei CMakeLists.txt para imprimir variáveis ​​interessantes.

Eu acho que o CMAKE_INSTALL_FULL_SYSCONFDIR padrão pode não ser o que todos esperam (não que eu saiba o que é), então talvez seja uma boa ideia atualizar a documentação para sugerir a construção com -DCMAKE_INSTALL_SYSCONFDIR=/etc para garantir que não haja surpresas no caso comum LSB caso de distro. Histórico: o teste mostra que -DCMAKE_INSTALL_PREFIX = / usr resulta em CMAKE_INSTALL_FULL_SYSCONFDIR = / usr / etc.

Deixe-me dar uma olhada mais de perto nesta e na documentação relacionada na web.
Devemos ter uma ideia sobre como isso funciona em detalhes.
Vou atualizar a documentação do nosso projeto, se necessário.

Acho que -DCMAKE_INSTALL_SYSCONFDIR=/etc deveria ir para a configuração do cmake como padrão, referindo-se a: https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html

No entanto, não tenho certeza ainda, se nós

  • deve predefinir -DCMAKE_INSTALL_PREFIX= ou
  • deixe esse sinalizador para o usuário ou
  • faça uma predefinição (primeira opção) permitindo que ele sobrescreva este sinalizador de predefinição.

@bjornfor : Qual sua opinião sobre isso?

Para ter o mínimo de problemas de suporte, acho que devo predefinir -DCMAKE_INSTALL_SYSCONFDIR = / etc e deixar -DCMAKE_INSTALL_PREFIX = não definido.

Mas estou realmente inseguro quanto a predefinir / etc (em vez de apenas documentar a opção). Quero dizer, a opção já tem um valor padrão, então com / etc como padrão sobrescrito ele não se comportaria mais conforme documentado em GNUInstallDirs.

Ok, obrigado pelo seu feedback. Vou adicionar isso à nossa documentação então e podemos garantir os padrões conforme documentado em GNUInstallDirs, que também parece estar no sentido da postagem de abertura.

Acho que devemos dar uma olhada na configuração anterior agora, depois de incluir GNUInstallDirs para garantir que não haja conflitos em relação aos caminhos do diretório. Caso contrário, podemos descobrir que as configurações antigas reconfiguram as configurações padrão das anteriores, o que claramente não ajudaria ...

@bjornfor : Conforme proposto, adicionei uma nota sobre as opções de compilação do cmake relacionadas a GNUInstallDirs ao nosso manual de compilação. Portanto, este problema foi totalmente abordado e resolvido.

Obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações