Deterministi c Сборка библиотеки с использованием CMake - PullRequest
2 голосов
/ 05 августа 2020

Я создал простой пример библиотеки CMake C ++ и хочу сделать его сборку детерминированной c (т.е. один и тот же код на одной машине всегда генерирует одну и ту же библиотеку с тем же файлом ha sh).

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 содержит временную метку, которая делает его недетерминированным c . Я нашел режим "D" eterministi c для "ar" (3-я строка в CMakeLists.txt), и он обновляет (установлен в 0) метки времени каждого объектного файла в архиве, но все еще остается одна метка времени.

Diff:

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
...