こんにちは、
Archlinux(私のディストリビューション)用の(非公式)パッケージを作成していますが、 makepkg
(ディストリビューションパッケージビルドツール)は、 xxhsum
にビルドディレクトリへの参照があることを警告しています。
私はそれをチェックしました
$ strings xxhsum | grep BUILD_DIR
発生が1つだけ見つかりました。 gccの--save-temps
フラグを使用してパッケージをビルドしようとしましたが、 xxhsum.o.s
ファイルにBUILD_DIR
が見つかりました。 そのファイルの形式はわかりませんが、文字列の周囲によっては、 XXXbenchHash
関数に関連している可能性があります。 残念ながら、その文字列がxxhsum
にどのように到達するかを理解できませんでした。そこでは、特別なマクロの使用法は見当たりません。
この文字列を削除したいのですが(たとえば、「再現性のあるビルド」を参照)、今は迷子になっていて、さらに何をすべきかわかりません。 誰かがコンパイルされたバイナリでこの文字列を取り除く方法を知っているか、問題をデバッグする方法を知っていますか?
それはかなり奇妙です。
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
への参照が見つかりません
最も参考になるコメント
こんにちは、
記録のために、私は問題の理由と回避策を見つけました。 つまり、次の
CMakeLists.txt
ファイルを使用して、最上位ディレクトリに配置します。長い話:ソースディレクトリへの参照は、すべての形式の
__FILE__
マクロによるものです。 この特定のケースでは、assert
マクロを介して潜入します。 ソースディレクトリ内でプロジェクトをコンパイルする場合、この場合は__FILE__
が(コンパイラによって)相対パスに展開されるため、問題はありません。 しかし、最もよく使用されるcmake
機能の1つは、ソースディレクトリの外部でのコンパイルであり、その場合、コンパイラは__FILE__
マクロをフルパスに展開します。 ただし、ソースディレクトリからの相対パスを使用することは可能ですが、__FILE__
マクロを再定義する必要があります。 上記のファイルに示されているように、cmake
を使用できます。