簡単なCMakeC ++ライブラリの例を作成し、そのビルドを決定論的にしたいと思います(つまり、同じマシンの同じコードが常に同じファイルハッシュで同じライブラリを生成します)。
Main.cpp
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(Test)
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -rD <TARGET> <LINK_FLAGS> <OBJECTS>")
add_library(Test Main.cpp)
これをビルドすると、libTest.aファイルにタイムスタンプが含まれているため、非決定論的です。 「ar」の「D」決定的モード(CMakeLists.txtの3行目)を見つけました。アーカイブ内の各オブジェクトファイルのタイムスタンプが更新されます(0に設定されます)が、まだ1つのタイムスタンプが残っています。
相違:
user@ip:/x01/user/myWork/test/build>diff <(strings libTest.a) <(strings ../backup/libTest.a)
2c2
< / 1596642127 0 0 0 14 `
---
> / 1596641163 0 0 0 14 `
もちろん、後でアーカイブを編集してタイムスタンプを削除することはできますが、CMakeに別の方法はありますか?
ツールバージョン:
ar --version
GNU ar version 2.27-41.base.el7
gcc --version
gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
cmake --version
cmake version 3.12.2
make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
関連した質問
- AppleシリコンでBoostTestを使用してcmakeプロジェクトでテストスイートをビルドできません
- cmakeですべてのLLVMライブラリをリンクするにはどうすればよいですか?
- 「「MinGW/bin/gccexe」は、単純なテストプログラムをコンパイルできません。」
- gtestのコンパイル中にCmakeエラーが発生しました:gtest/internal/gtest-type-utilh:732:25:エラー:予期される型指定子
- cryptopp-cmakeとcrypto ++を使用してCMakeListstxtプロジェクトファイルを作成する
- cmakeはmakelistを生成しません
- qmakeからcmakeに変換する場合、同じ方法でライブラリを見つけるにはどうすればよいですか?
- qmakeをcmakeに変換するには、デバッグとリリース、および同様の構成オプションを設定するにはどうすればよいですか?
- CMakeでライブラリを外部プロジェクトとしてダウンロード、コンパイル、リンクするにはどうすればよいですか?
CMAKE_CXX_ARCHIVE_FINISHは私のために働いた。
CMakeLists.txt: