#define
Qt Creator を使用してソース コードをビルドするたびにインクリメントされる C++ ソース内の変数 (または) が必要です。おそらくQt Creatorプラグインなど、これを行う方法はありますか? コマンドラインで「make」を使用してビルドする場合、それを行う方法はありますか?
5 に答える
.proファイルで、コマンドラインプログラムの結果を含む変数を作成できます。次に、それを使用して定義を作成できます。
BUILDNO = $$(command_to_get_the_build_number)
DEFINES += BUILD=$${BUILDNO}
単純な増分数が必要な場合は、非常に単純なスクリプトを使用できます。
#!/bin/bash
number=`cat build_number`
let number += 1
echo "$number" | tee build_number #<-- output and save the number back to file
これにより、ビルドするたびにビルド番号が増加し、ビルドしようとしても失敗した場合にも増加することに注意してください。より良い方法は、コードの状態に基づいてビルド番号を取得することです。多くのバージョン管理ツールでは、番号ではないにしても、そのためのテキスト文字列を取得できます。
Joerg Beutel の改善されたソリューションに相当する Windows https://stackoverflow.com/a/5967447/1619432 :
。プロ:
build_nr.commands = build_inc.bat
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr
HEADERS += build.h
build_inc.bat:
@echo off
set /p var= <build.txt
set /a var= %var%+1
echo %var% >build.txt
echo #define BUILD %var% >build.h
echo %var%
使用法
#include "build.h"
...
qDebug() << "Build number:" << BUILD;
以前にいくつかのテストの後で書いたように、新しいビルドが行われるたびにバージョン番号が更新されないため、元のソリューションに問題があることがわかりました。多くの場合、ソースファイルを編集してビルドを実行しましたが、それでも同じビルド番号を取得しました...ビルドプロセスは、何も変更されていないと判断し、ビルド番号を更新する手順をスキップしました。私は最初にそのステップを強制する方法を見つけようとしましたが、それを理解できませんでした。最後に、私は別の方法で行くことにしました。次に、スクリプトを使用し
て、更新された番号が後ろにbuild_number.h
あるを含むヘッダーファイルを生成します。#define BUILD
そのため、Calebsスクリプトが少し変更されました(build_number.sh
):
#!/bin/bash
number=`cat build_number`
let number++
echo "$number" | tee build_number #<-- output and save the number back to file
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h
増分番号は、。という名前のファイルに引き続き保存されますbuild_number
。生成されたヘッダーファイルをその番号で解析することで3番目のファイルを回避することもできましたが、それを拒否することにしました。スクリプトと生成されたヘッダーはプロジェクトディレクトリにあり、build_number
ファイルはビルドディレクトリにあることに注意してください。それは完璧ではありませんが、私はそれと一緒に暮らすことができます。
物事をまとめるために、やるべきことがもう少しあります。まず、生成されたヘッダーファイルをQt Designerでプロジェクトに追加する必要があります...ヘッダーファイルを右クリックして、[既存のファイルを追加]をクリックします。次に、BUILD定義がアクセスされるC ++ファイルに含める必要があります#include "build_number.h"
......そして最後に、プロジェクトファイルにいくつかの追加を行う必要があります(MyProject.pro
)。Calebsソリューションから削除したので、ここから始めます。
build_nr.commands = ../MyProject/build_number.sh
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr
これらの行(HEADERSセクションの前に配置)は、スクリプトの実行を強制します。スクリプトは、から最後のビルド番号を読み取りbuild_number
、インクリメントし、書き戻し、build_number.h
ファイルの更新バージョンを生成します。これはプロジェクトのソースの一部であるため、新しい値は毎回コードにリンクされます。
言及すべきことが1つあります。現在、構築プロセスは、何も変わっていないとは決して考えていません。したがって、コードを変更しないままにしても、makeを新たに実行すると、新しいバージョン番号が生成され、新しいバイナリがビルドされます。古いソリューションはコードが変更されたときに番号を残しました。この新しいソリューションは、ソースが変更されていない場合でも、その1つのヘッダーファイルに変更を強制するため、新しいビルドを強制します。間に何かを好む人もいるかもしれませんが、ヘッダーは1つの場所にしか含まれていないため、再構築は非常に高速で、それほど害はありません。しかし、それでも、誰かが両方の世界を最大限に活用する方法を知っている場合は、アドバイスしてください。少なくとも今は、同じバージョン番号の2つの異なるバイナリはありません。
カレブの提案は素晴らしいですが、私の場合は「箱から出して」うまくいきませんでした。代わりにいくつかのエラーが発生し、それらを修正するためにいくつかの読み取りが必要でした。変更はごくわずかです。私はUbuntuLinuxでQt4.7を使用していました...最初の変更は、信じられないかもしれませんが、からに移行するシェルスクリプトにありましlet number += 1
たlet number++
...私は通常Windozeを使用/プログラムしているので、説明できませんが、元のケースではコマンドライン(シェルプロンプト)からスクリプトを実行するとエラーが報告されますが、変更されたケースではすべてうまくいき、増分数が返されます...
Calebによって完全に報告されていないためbuild_number.sh
、シェルスクリプトの名前として使用し、その名前build_number
(なし.sh
)で別のファイルを作成し、内部にゼロだけを入れました。
最後の最も厄介なバグは、QtプロジェクトファイルでにBUILDNO = $$(command_to_get_the_build_number)
置き換えることで修正されました。ファイル名の後ろと前に必要なものにBUILDNO = $$system(./build_number.sh)
注意してください。後者は通常のLinuxユーザーにとっては初歩的なものですが、Windowsユーザーにとってはそれほど重要ではありません。system
$$
./
私のように、これがこれらすべてに不慣れな人々にとってより簡単になることを願っています。関数リファレンス、高度な使用法など、qmakeを探している場合は、QtDesignerのヘルプセクションで詳細を読むことができます。
ああ、最後の一言...私もに変更DEFINES += -DBUILD=$${BUILDNO}
しなければならなかったDEFINES += BUILD=$${BUILDNO}
ので、それ-D
はなくなりました。C ++コード内では、ファイルの先頭にBUILD
記述したかのように使用します。#define BUILD 1234