Olá,
Estou fazendo um pacote (não oficial) para o Archlinux (minha distribuição) e makepkg
(a ferramenta de compilação de pacotes da distro) me avisa que xxhsum
tem referência ao diretório de compilação.
Eu verifiquei isso com
$ strings xxhsum | grep BUILD_DIR
e encontrou apenas uma ocorrência. Tentei construir o pacote com o sinalizador --save-temps
para gcc e encontrei o BUILD_DIR
no arquivo xxhsum.o.s
. Não entendo o formato desse arquivo, mas de acordo com o ambiente da string, de alguma forma, ele pode estar relacionado à função XXXbenchHash
. Infelizmente, não consegui descobrir como essa string chega a xxhsum
, não vejo nenhum uso de macros especiais lá.
Gostaria de me livrar desta string (veja, por exemplo, "compilações reproduzíveis"), mas agora estou perdido e não tenho nenhuma ideia do que fazer a seguir. Alguém tem ideia de como se livrar dessa string no binário compilado ou sabe como depurar o problema?
Isso é muito estranho.
Não há nada no código-fonte de xxhsum.c
suscetível de gerar uma referência a BUILD_DIR
.
Compilei em um Linux mint VM e fiz a mesma verificação que você:
$ strings xxhsum | grep BUILD_DIR
$
Não retornou nada.
Pode ser um artefato do sistema de construção.
Suponho que você use o diretório real em vez de BUILD_DIR, não é? Se você fizer isso, você pode estar certo, este é um artefato da minha ferramenta de construção. Vou tentar um sistema diferente para verificar isso. Quanto ao meu sistema atual, posso reproduzi-lo manualmente:
$ cd DIR_WITH_UNPACKED_SOURCE
$ mkdir build
$ cmake ../xxHash-0.6.5
$ make
$ strings xxhsum | grep BUILD_DIR
BUILD_DIR:
DIR_WITH_UNPACKED_SOURCE/xxHash-0.6.5/xxhsum.c
Ambiente: bash 4.4.023, gcc 8.1.1 20180531, binutils 2.30, cmake 3.11.4, make 4.2.1, glibc 2.27.
Ah, eu não testei cmake
, e isso pode estar introduzindo esse problema.
Eu apenas testei o processo de compilação make
mais simples:
$ cd XXH_SRC_DIR
$ make
$ strings xxhsum | grep BUILD_DIR
$
cmake
é mantido por terceiros (daí a tag "não oficial"), eu não entendo todos os seus efeitos internos e colaterais, infelizmente, e apenas mantenho oficialmente Makefile
.
Olá,
para registro, descobri o motivo e a solução alternativa para o problema. Resumindo: use o seguinte arquivo CMakeLists.txt
e coloque-o no diretório superior.
Longa história: a referência ao diretório de origem se deve à macro __FILE__
em todas as suas formas. Neste caso específico, ele se esgueira pela macro assert
. Se alguém compilar o projeto dentro do diretório de origem, não há problema porque neste caso __FILE__
é expandido (pelo compilador) para um caminho relativo. Mas um dos recursos cmake
mais usados é a compilação fora do diretório de origem e, nesse caso, o compilador expande a macro __FILE__
para o caminho completo. No entanto, é possível usar caminhos relativos ao diretório de origem, mas é necessário redefinir a macro __FILE__
. Pode-se usar cmake
conforme mostrado no arquivo acima.
Olá!
Eu acredito que a macro assert
deve ser definida como (void)0
se NDEBUG
estiver definida.
NDEBUG
é definido automaticamente pelo CMake se CMAKE_BUILD_TYPE estiver definido como _ "Release" _ (para geradores de configuração única como Makefiles Unix) ou se estiver criando projeto com a opção --config Release
(para geradores de multiconfiguração como Xcode) .
Para o tipo de compilação _ "RelWithDebInfo" _, deve-se definir NDEBUG
por conta própria nas fontes ou nas listas CMake.
Eu testei agora.
Boa sorte!
A lógica para assert
foi atualizada e é definida aqui:
https://github.com/Cyan4973/xxHash/blob/dev/xxhash.c#L146
Por padrão, todas as declarações em xxhash
estão desabilitadas.
Para habilitá-los, é necessário definir DEBUGLEVEL
com um valor >= 1
.
Mesmo neste caso, assert()
ainda pode ser desabilitado configurando NDEBUG
.
Qualquer que seja o valor de DEBUGLEVEL
,
NDEBUG
configuração não será modificada,
permanece exatamente o mesmo depois de incluir o código xxhash
(normalmente com XXH_INLINE_ALL
, que é o tipo de compilação de maior impacto).
Acredito que esse problema foi corrigido.
Eu testei um cmake
-produzido em xxhsum
em um sistema Linux usando strings
e não consegui encontrar nenhuma referência a BUILD_DIR
.
Comentários muito úteis
Olá,
para registro, descobri o motivo e a solução alternativa para o problema. Resumindo: use o seguinte arquivo
CMakeLists.txt
e coloque-o no diretório superior.Longa história: a referência ao diretório de origem se deve à macro
__FILE__
em todas as suas formas. Neste caso específico, ele se esgueira pela macroassert
. Se alguém compilar o projeto dentro do diretório de origem, não há problema porque neste caso__FILE__
é expandido (pelo compilador) para um caminho relativo. Mas um dos recursoscmake
mais usados é a compilação fora do diretório de origem e, nesse caso, o compilador expande a macro__FILE__
para o caminho completo. No entanto, é possível usar caminhos relativos ao diretório de origem, mas é necessário redefinir a macro__FILE__
. Pode-se usarcmake
conforme mostrado no arquivo acima.