Russian Qt Forum
Ноябрь 24, 2024, 05:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QBS: force rebuild  (Прочитано 5687 раз)
esaulenka
Гость
« : Апрель 03, 2020, 15:47 »

Помогите решить следующую задачку.
В выходной бинарник надо поместить timestamp с временем сборки.

Варианты решений:
1) Rule с генерацией хидера на три строчки (копипаста из vcs-module.qbs), инклюд этого заголовка.
Проблема - у Rule не работает alwaysRun: true. Когда оно вообще запускается, я так и не понял, но срабатывает как-то очень нерегулярно.
Как работает оригинал (без alwaysRun), вообще непонятно.

2) (более красивый, как мне кажется) помощью JS делаем property timestamp, добавляем это property в cpp.define.
Работает, но каким образом заставить qbs постоянно пересобирать нужный исходник (только один файл, остальные не трогать), если, по сути, в нём ничего не поменялось?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Апрель 03, 2020, 16:20 »

1) Скорее всего, нет зависимости от этого правила в результирующем продукте, см https://doc.qt.io/qbs/qml-qbslanguageitems-rule.html#a-complete-example

2) Лучше не надо.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Апрель 03, 2020, 18:23 »

А макросы __DATE__ и __TIME__ не работают? Зачем вообще какие-то Rule и прочее?
Записан

ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Апрель 03, 2020, 18:43 »

А макросы __DATE__ и __TIME__ не работают? Зачем вообще какие-то Rule и прочее?

Ну это типа время компиляции исходника, автор хочет чтобы _любая_ пересборка (даже null build) апдейтила таймстемп.
Впрочем, зачем это реально надо, я не представляю=)
Записан
esaulenka
Гость
« Ответ #4 : Апрель 03, 2020, 19:01 »

Надо было сразу код показать:
Код:
    // generate timestamp header
    Rule {
//        alwaysRun: true
        multiplex: true
        Artifact {
            filePath: product.sourceDirectory + "/System/timestamp.h"
            fileTags: "hpp"
        }
        prepare: {
            var cmd = new JavaScriptCommand();
            cmd.description = "generating " + output.fileName;
            cmd.sourceCode = function() {
                var f = new TextFile(output.filePath, TextFile.WriteOnly);
                var d = Date.now();
                d = Math.floor(d / 1000);   // in seconds
                try {
                    f.writeLine("#ifndef TIMESTAMP_H");
                    f.writeLine("#define TIMESTAMP_H");
                    f.writeLine('#define TIMESTAMP ' + d)
                    f.writeLine("#endif");
                } finally {
                    f.close();
                }
            };
            return [cmd];
        }
    }

То есть зависимость есть (где-то в недрах модуля cpp), при отсутствии файла он создаётся, и всё корректно собирается. А вот когда он заново генерируется, я не понял.


__TIME__ не очень интересен. Препроцессором его можно порезать-пересчитать-сложить как надо, но это настолько неудобно...
Ну и проблему регулярного ребилда файла, в котором этот __TIME__ объявлен, надо как-то решать.


> автор хочет чтобы _любая_ пересборка (даже null build) апдейтила таймстемп.
Можно для любого не-null, как проще. Просто этот таймстамп хочется положить в отдельный файлик и не трогать его никогда больше.


PS парни, отдельное спасибо за моментальный ответ!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Апрель 03, 2020, 19:23 »

Вот так работает, единственное отличие что сборка происходит в product.destinationDirectory а не в сорцы

Код:
import qbs
import qbs.TextFile

CppApplication {
    cpp.cxxLanguageVersion: "c++11"

    cpp.includePaths: product.destinationDirectory
    consoleApplication: true
    files: "main.cpp"

    // generate timestamp header
    Rule {
        alwaysRun: true
        multiplex: true
        Artifact {
            filePath: "timestamp.h"
            fileTags: "hpp"
        }
        prepare: {
            var cmd = new JavaScriptCommand();
            cmd.description = "generating " + output.fileName;
            cmd.sourceCode = function() {
                var f = new TextFile(output.filePath, TextFile.WriteOnly);
                var d = Date.now();
                d = Math.floor(d / 1000);   // in seconds
                try {
                    f.writeLine("#ifndef TIMESTAMP_H");
                    f.writeLine("#define TIMESTAMP_H");
                    f.writeLine('#define TIMESTAMP ' + d)
                    f.writeLine("#endif");
                } finally {
                    f.close();
                }
            };
            return [cmd];
        }
    }
}

PS: нужно больше инфы. Руль в модуле или продукте?
Записан
esaulenka
Гость
« Ответ #6 : Апрель 04, 2020, 19:36 »

Вот так работает, единственное отличие что сборка происходит в product.destinationDirectory а не в сорцы

Спасибо большое! Да, так работает. И так даже правильнее будет.

Осталось ощущение некоторой магии, ну да ладно...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Апрель 04, 2020, 21:41 »

Возможно, есть баг связанный со сброкой в сорцы, хз. Если будет не лень, еще поиграюсь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.