讓你的C程序,自動打印版本信息
一、軟件管理
稍微上點(diǎn)規(guī)模的軟件開發(fā)往往周期都非常長,中間會產(chǎn)生很多臨時版本,這些臨時版本往往會有各種各樣的bug,由于項(xiàng)目參與的人員眾多、水平參差不齊,軟件分支眾多、功能復(fù)雜,經(jīng)常會有各種稀奇古怪的事情發(fā)生,經(jīng)常遇到一個問題就是:某個測試版本測出了問題, 但是研發(fā)卻發(fā)現(xiàn)服務(wù)器中沒有對應(yīng)的版本與之對應(yīng)。
有的公司要求所有bug必須有始有終,一旦bug無法復(fù)現(xiàn),這時候測試和開發(fā)免不了一陣扯皮,這影響到績效?。。。∷园姹竟芾矸浅V匾,F(xiàn)在大多數(shù)公司軟件都是采用git管理,對于嵌入式軟件,廠家提供的sdk,往往都有g(shù)it本地倉庫,嵌入式軟件一般規(guī)模都不大,所以公司對軟件版本管理往往并不會太嚴(yán)格,很多嵌入式軟件工程師都沒能養(yǎng)成良好的軟件管理習(xí)慣。本文主要講解如何在編譯的時候就給軟件自動添加更新軟件版本的功能,程序運(yùn)行的開始就將版本打印出來,配合git,更方便的定位軟件版本問題。
二、軟件版本號
公司的軟件版本號往往都比較復(fù)雜,本文為便于讀者理解,將版本號的定義精簡如下:
僅僅打印版本發(fā)布的時間:
圖片
三、原理
我們可以定義一個頭文件sw_version.h專門存放版本信息的宏。
#define SW_VERSION “2024-09-09-7”
主程序包含該頭文件,并在程序運(yùn)行的開頭位置,打印改宏。
編譯過程中,編譯腳本mk.sh自動將當(dāng)前時間等信息更新到頭文件sw_version.h這樣我們編譯出的可執(zhí)行程序app就自帶了最新的版本信息。
圖片
更新頭文件sw_version.h中的內(nèi)容,我們可以字節(jié)編寫c程序修改,也可以直接使用命令date,本文通過后者來講解。
四、命令date
date選項(xiàng)
date 能用來顯示或設(shè)定系統(tǒng)的日期和時間:
- 常見選項(xiàng)
--help:顯示輔助信息
--version:顯示date命令版本信息
-u:顯示目前的格林威治時間
-d:做日期時間相關(guān)的運(yùn)算
- - date = 'dateStr' :做時間的相關(guān)運(yùn)算
本文主要用到顯示日期和時間的功能:
- 1) 顯示系統(tǒng)當(dāng)前日期時間
[root@hadoop ~]# date
- 2) 以指定格式顯示日期時間
[root@hadoop ~]# date '+%Y-%m-%d %H:%M:%S'
執(zhí)行結(jié)果:
圖片
date格式標(biāo)記日期、時間
date 能用來顯示或設(shè)定系統(tǒng)的日期和時間,在顯示方面,使用者能設(shè)定欲顯示的格式,格式設(shè)定為一個加號后接數(shù)個標(biāo)記。
日期方面:
%a : 星期幾 (Sun..Sat)
%A : 星期幾 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接顯示日期和時間
%d : 日 (01..31)
%D : 直接顯示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第幾天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第幾周 (00..53) (以 Sunday 為一周的第一天的情形)
%w : 一周中的第幾天 (0..6)
%W : 一年中的第幾周 (00..53) (以 Monday 為一周的第一天的情形)
%x : 直接顯示日期 (mm/dd/yyyy)
%y : 年份的最后兩位數(shù)字 (00.99)
%Y : 完整年份 (0000..9999)
時間方面:
%%: 打印出%
%n : 下一行
%t : 跳格
%H : 小時(00..23)
%k : 小時(0..23)
%l : 小時(1..12)
%M : 分鐘(00..59)
%p : 顯示本地AM或PM
%P : 顯示本地am或pm
%r : 直接顯示時間(12 小時制,格式為 hh:mm:ss [AP]M)
%s : 從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(shù)
%S : 秒(00..61)
%T : 直接顯示時間(24小時制)
%X : 相當(dāng)于%H:%M:%S %p
%Z : 顯示時區(qū)
若是不以加號作為開頭,則表示要設(shè)定時間,而時間格式為
MMDDhhmm[[CC]YY][.ss]
MM 為月份,
DD 為日,
hh 為小時,
mm 為分鐘,
CC 為年份前兩位數(shù)字,
YY 為年份后兩位數(shù)字,
ss 為秒數(shù)
五、腳本實(shí)例
腳本實(shí)例:
1 #!/bin/bash
2
3 str_frnotallow=#define SW_VERSION
4 quotatinotallow="\""
5 version_file=sw_version.h
6
7 rm $version_file
8 echo $str_front $quotation$(date '+%Y-%m-%d-%H')$quotation >> $version_file
* 3行:定義環(huán)境變量str_front,用于保存字符串 `#define SW_VERSION `
* 4行:定義環(huán)境變量quotation,保存字符`"`
* 5行:定義環(huán)境變量version_file,保存頭文件**sw_version.h**名字
* 7行:刪除頭文件**sw_version.h**
* 8行:更新最新版本信息到頭文件**sw_version.h**
借助date命令拼接成下面字符串
#define SW_VERSION “2024-09-09-7”
將該字符串信息,通過echo命令重定向到頭文件**sw_version.h**
>> 表示重定向,信息覆蓋
執(zhí)行結(jié)果
圖片
大家可以根據(jù)自己需要,自己定制自己需要的版本號格式,同時也可以把該腳本嵌入到自己的編譯腳本中。