Xxhash: [cmake] `xxhsum`ビルドディレクトリへの参照を避ける

作成日 2018年08月01日  ·  7コメント  ·  ソース: Cyan4973/xxHash

こんにちは、
Archlinux(私のディストリビューション)用の(非公式)パッケージを作成していますが、 makepkg (ディストリビューションパッケージビルドツール)は、 xxhsumにビルドディレクトリへの参照があることを警告しています。

私はそれをチェックしました

$ strings xxhsum | grep BUILD_DIR

発生が1つだけ見つかりました。 gccの--save-tempsフラグを使用してパッケージをビルドしようとしましたが、 xxhsum.o.sファイルにBUILD_DIRが見つかりました。 そのファイルの形式はわかりませんが、文字列の周囲によっては、 XXXbenchHash関数に関連している可能性があります。 残念ながら、その文字列がxxhsumにどのように到達するかを理解できませんでした。そこでは、特別なマクロの使用法は見当たりません。

この文字列を削除したいのですが(たとえば、「再現性のあるビルド」を参照)、今は迷子になっていて、さらに何をすべきかわかりません。 誰かがコンパイルされたバイナリでこの文字列を取り除く方法を知っているか、問題をデバッグする方法を知っていますか?

build issue help wanted

最も参考になるコメント

こんにちは、
記録のために、私は問題の理由と回避策を見つけました。 つまり、次のCMakeLists.txtファイルを使用して、最上位ディレクトリに配置します。

長い話:ソースディレクトリへの参照は、すべての形式の__FILE__マクロによるものです。 この特定のケースでは、 assertマクロを介して潜入します。 ソースディレクトリ内でプロジェクトをコンパイルする場合、この場合は__FILE__が(コンパイラによって)相対パスに展開されるため、問題はありません。 しかし、最もよく使用されるcmake機能の1つは、ソースディレクトリの外部でのコンパイルであり、その場合、コンパイラは__FILE__マクロをフルパスに展開します。 ただし、ソースディレクトリからの相対パスを使用することは可能ですが、 __FILE__マクロを再定義する必要があります。 上記のファイルに示されているように、 cmakeを使用できます。

全てのコメント7件

それはかなり奇妙です。
xxhsum.cソースコード内には、 BUILD_DIRへの参照を生成する可能性のあるものは何もありません。

Linux mint vmでコンパイルし、あなたと同じチェックを行いました:

$ strings xxhsum | grep BUILD_DIR
$

何も返されませんでした。

ビルドシステムのアーティファクトである可能性があります。

BUILD_DIRの代わりに実際のディレクトリを使用していると思いますね。 もしそうなら、あなたは正しいかもしれません、これは私のビルドツールのアーティファクトです。 これをチェックするために別のシステムを試してみます。 私の現在のシステムに関しては、これを手動で再現できます。

$ 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

環境:bash 4.4.023、gcc 8.1.1 20180531、binutils 2.30、cmake 3.11.4、make 4.2.1、glibc2.27。

ああ、私はcmakeテストしていません、そしてそれはこの問題を引き起こしているかもしれません。
私はより単純なmakeビルドプロセスのみをテストしました:

$ cd XXH_SRC_DIR
$ make
$ strings xxhsum | grep BUILD_DIR
$

cmakeはサードパーティによって維持されています(したがって「非公式」タグ)。残念ながら、その内部と副作用のすべてを理解しているわけではなく、公式に維持しているのはMakefileです。

こんにちは、
記録のために、私は問題の理由と回避策を見つけました。 つまり、次のCMakeLists.txtファイルを使用して、最上位ディレクトリに配置します。

長い話:ソースディレクトリへの参照は、すべての形式の__FILE__マクロによるものです。 この特定のケースでは、 assertマクロを介して潜入します。 ソースディレクトリ内でプロジェクトをコンパイルする場合、この場合は__FILE__が(コンパイラによって)相対パスに展開されるため、問題はありません。 しかし、最もよく使用されるcmake機能の1つは、ソースディレクトリの外部でのコンパイルであり、その場合、コンパイラは__FILE__マクロをフルパスに展開します。 ただし、ソースディレクトリからの相対パスを使用することは可能ですが、 __FILE__マクロを再定義する必要があります。 上記のファイルに示されているように、 cmakeを使用できます。

こんにちは!
NDEBUGが定義されている場合、 assertマクロは(void)0として定義する必要があります。

NDEBUGは、CMAKE_BUILD_TYPEが_ "Release" _に設定されている場合(Unix Makefilesなどの単一構成ジェネレーターの場合)または--config Releaseオプションを使用してプロジェクトをビルドする場合(Xcodeなどの複数構成ジェネレーターの場合)、CMakeによって自動的に定義されます。 。
_ "RelWithDebInfo" _ビルドタイプの場合、ソースまたはCMakeリストでNDEBUGを独自に定義する必要があります。
私は今それをテストしました。

幸運を!

assertのロジックが更新され、ここで定義されています。
https://github.com/Cyan4973/xxHash/blob/dev/xxhash.c#L146

デフォルトでは、 xxhash内のすべてのアサーションは無効になっています。
それらを有効にするには、 DEBUGLEVELを値>= 1に設定する必要があります。
この場合でも、 NDEBUG設定することで、 assert()を無効にすることができます。

DEBUGLEVELの値が何であれ、
NDEBUG設定は変更されませんが、
xxhashコードを含めた後もまったく同じです
(通常、最も影響力のあるビルドタイプであるXXH_INLINE_ALLを使用します)。

この問題は修正されたと思います。
stringsを使用してLinuxシステムでcmake生成されたxxhsumをテストしましたが、 cmake BUILD_DIRへの参照が見つかりません

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

gitmko0 picture gitmko0  ·  7コメント

carstenskyboxlabs picture carstenskyboxlabs  ·  6コメント

vinniefalco picture vinniefalco  ·  4コメント

jvriezen picture jvriezen  ·  6コメント

xinglin picture xinglin  ·  6コメント