1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-01 12:40:36 +00:00

Implements $VERSIONINFO metacommand.

Allows embedding meta information on the final binary (Windows only).
This commit is contained in:
FellippeHeitor 2017-04-29 04:09:20 -03:00
parent d3fd0be2a4
commit 8d961597d9
3 changed files with 150 additions and 7 deletions

View file

@ -4,4 +4,4 @@ DIM SHARED AutoBuildMsg AS STRING
Version$ = "1.1"
'BuildNum format is YYYYMMDD/id, where id is a ever-increasing
'integer. If you make a change, update the date and increase the id!
BuildNum$ = "20170120/51"
BuildNum$ = "20170429/52"

View file

@ -1 +1,23 @@
0 ICON "qb64.ico"
1 VERSIONINFO
FILEVERSION 1,1,0,0
PRODUCTVERSION 1,1,0,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName","QB64\0"
VALUE "FileDescription","QB64 Compiler\0"
VALUE "FileVersion","1.1\0"
VALUE "InternalName","qb64.bas\0"
VALUE "LegalCopyright","LGPL\0"
VALUE "LegalTrademarks","\0"
VALUE "OriginalFilename","qb64.exe\0"
VALUE "ProductName","QB64\0"
VALUE "ProductVersion","1.1\0"
VALUE "Comments","QB64 is a modern extended BASIC programming language that retains QB4.5/Qbasic compatibility and compiles native binaries for Windows, Linux and macOS.\0"
END
END
END

View file

@ -113,6 +113,13 @@ DIM SHARED ConsoleMode, No_C_Compile_Mode, Cloud, NoIDEMode
DIM SHARED CMDLineFile AS STRING
DIM SHARED ExeIconSet AS LONG
DIM SHARED VersionInfoSet AS _BYTE
'Variables to handle $VERSIONINFO metacommand:
DIM SHARED viFileVersionNum$, viProductVersionNum$, viCompanyName$
DIM SHARED viFileDescription$, viFileVersion$, viInternalName$
DIM SHARED viLegalCopyright$, viLegalTrademarks$, viOriginalFilename$
DIM SHARED viProductName$, viProductVersion$, viComments$
DIM SHARED NoChecks
@ -1458,6 +1465,11 @@ DynamicMode = 0
optionbase = 0
optionexplicit = 0: IF optionexplicit_cmd = -1 AND NoIDEMode = 1 THEN optionexplicit = -1
ExeIconSet = 0
VersionInfoSet = 0
viFileVersionNum$ = "": viProductVersionNum$ = "": viCompanyName$ = ""
viFileDescription$ = "": viFileVersion$ = "": viInternalName$ = ""
viLegalCopyright$ = "": viLegalTrademarks$ = "": viOriginalFilename$ = ""
viProductName$ = "": viProductVersion$ = "": viComments$ = ""
DataOffset = 0
statementn = 0
qberrorhappened = 0: qberrorcode = 0: qberrorline = 0
@ -1580,6 +1592,7 @@ END IF 'cloud = 0
FOR closeall = 1 TO 255: CLOSE closeall: NEXT
OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26 'relock
ff = FREEFILE: OPEN tmpdir$ + "icon.rc" FOR OUTPUT AS #ff: CLOSE #ff
IF Debug THEN CLOSE #9: OPEN tmpdir$ + "debug.txt" FOR APPEND AS #9
@ -3201,6 +3214,78 @@ DO
GOTO finishednonexec
END IF
IF LEFT$(a3u$, 12) = "$VERSIONINFO" THEN
'Embed version info into the final binary (Windows only)
FirstDelimiter = INSTR(a3u$, ":")
SecondDelimiter = INSTR(FirstDelimiter + 1, a3u$, "=")
IF FirstDelimiter = 0 OR SecondDelimiter = 0 OR SecondDelimiter = FirstDelimiter + 1 THEN
a$ = "Expected $VERSIONINFO:key=value": GOTO errmes
END IF
VersionInfoKey$ = LTRIM$(RTRIM$(MID$(a3u$, FirstDelimiter + 1, SecondDelimiter - FirstDelimiter - 1)))
VersionInfoValue$ = StrReplace$(LTRIM$(RTRIM$(MID$(a3$, SecondDelimiter + 1))), CHR$(34), "'")
SELECT CASE VersionInfoKey$
CASE "FILEVERSION#"
GOSUB ValidateVersion
viFileVersionNum$ = VersionInfoValue$
layout$ = "$VERSIONINFO:FILEVERSION#=" + VersionInfoValue$
CASE "PRODUCTVERSION#"
GOSUB ValidateVersion
viProductVersionNum$ = VersionInfoValue$
layout$ = "$VERSIONINFO:PRODUCTVERSION#=" + VersionInfoValue$
CASE "COMPANYNAME"
viCompanyName$ = VersionInfoValue$
layout$ = "$VERSIONINFO:CompanyName=" + VersionInfoValue$
CASE "FILEDESCRIPTION"
viFileDescription$ = VersionInfoValue$
layout$ = "$VERSIONINFO:FileDescription=" + VersionInfoValue$
CASE "FILEVERSION"
viFileVersion$ = VersionInfoValue$
layout$ = "$VERSIONINFO:FileVersion=" + VersionInfoValue$
CASE "INTERNALNAME"
viInternalName$ = VersionInfoValue$
layout$ = "$VERSIONINFO:InternalName=" + VersionInfoValue$
CASE "LEGALCOPYRIGHT"
viLegalCopyright$ = VersionInfoValue$
layout$ = "$VERSIONINFO:LegalCopyright=" + VersionInfoValue$
CASE "LEGALTRADEMARKS"
viLegalTrademarks$ = VersionInfoValue$
layout$ = "$VERSIONINFO:LegalTrademarks=" + VersionInfoValue$
CASE "ORIGINALFILENAME"
viOriginalFilename$ = VersionInfoValue$
layout$ = "$VERSIONINFO:OriginalFilename=" + VersionInfoValue$
CASE "PRODUCTNAME"
viProductName$ = VersionInfoValue$
layout$ = "$VERSIONINFO:ProductName=" + VersionInfoValue$
CASE "PRODUCTVERSION"
viProductVersion$ = VersionInfoValue$
layout$ = "$VERSIONINFO:ProductVersion=" + VersionInfoValue$
CASE "COMMENTS"
viComments$ = VersionInfoValue$
layout$ = "$VERSIONINFO:Comments=" + VersionInfoValue$
CASE ELSE
a$ = "Invalid key. (Use FILEVERSION#, PRODUCTVERSION#, CompanyName, FileDescription, FileVersion, InternalName, LegalCopyright, LegalTrademarks, OriginalFilename, ProductName, ProductVersion or Comments)"
GOTO errmes
END SELECT
VersionInfoSet = -1
GOTO finishednonexec
ValidateVersion:
'Check if only numbers and commas (4 comma-separated values)
IF LEN(VersionInfoValue$) = 0 THEN a$ = "Expected: $VERSIONINFO:" + VersionInfoKey$ + "=#,#,#,# (4 comma-separated numeric values: major, minor, revision and build)": GOTO errmes
viCommas = 0
FOR i = 1 TO LEN(VersionInfoValue$)
IF ASC(VersionInfoValue$, i) = 44 THEN viCommas = viCommas + 1
IF INSTR("0123456789,", MID$(VersionInfoValue$, i, 1)) = 0 OR (i = LEN(VersionInfoValue$) AND viCommas <> 3) OR RIGHT$(VersionInfoValue$, 1) = "," THEN
a$ = "Expected: $VERSIONINFO:" + VersionInfoKey$ + "=#,#,#,# (4 comma-separated numeric values: major, minor, revision and build)": GOTO errmes
END IF
NEXT
RETURN
END IF
IF LEFT$(a3u$, 8) = "$EXEICON" THEN
'Basic syntax check. Multi-platform.
IF ExeIconSet THEN a$ = "$EXEICON already defined": GOTO errmes
@ -11503,23 +11588,59 @@ END IF
IF os$ = "WIN" THEN
'Prepare to embed icon into .EXE
IF ExeIconSet THEN
linenumber = ExeIconSet 'on error, this allows reporting the linenumber where $EXEICON was used
wholeline = " $EXEICON:'" + ExeIconFile$ + "'"
IF ExeIconSet OR VersionInfoSet THEN
IF _FILEEXISTS(tmpdir$ + "icon.o") THEN
E = 0
ON ERROR GOTO qberror_test
KILL tmpdir$ + "icon.o"
IF E = 1 OR _FILEEXISTS(tmpdir$ + "icon.o") = -1 THEN a$ = "Error creating icon resource file": GOTO errmes
IF E = 1 OR _FILEEXISTS(tmpdir$ + "icon.o") = -1 THEN a$ = "Error creating resource file": GOTO errmes
ON ERROR GOTO qberror
END IF
END IF
IF ExeIconSet THEN
linenumber = ExeIconSet 'on error, this allows reporting the linenumber where $EXEICON was used
wholeline = " $EXEICON:'" + ExeIconFile$ + "'"
END IF
IF VersionInfoSet THEN
iconfilehandle = FREEFILE
OPEN tmpdir$ + "icon.rc" FOR APPEND AS #iconfilehandle
PRINT #iconfilehandle, ""
PRINT #iconfilehandle, "1 VERSIONINFO"
IF LEN(viFileVersionNum$) THEN PRINT #iconfilehandle, "FILEVERSION "; viFileVersionNum$
IF LEN(viProductVersionNum$) THEN PRINT #iconfilehandle, "PRODUCTVERSION "; viProductVersionNum$
PRINT #iconfilehandle, "BEGIN"
PRINT #iconfilehandle, " BLOCK " + QuotedFilename$("StringFileInfo")
PRINT #iconfilehandle, " BEGIN"
PRINT #iconfilehandle, " BLOCK " + QuotedFilename$("040904E4")
PRINT #iconfilehandle, " BEGIN"
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("CompanyName") + "," + QuotedFilename$(viCompanyName$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("FileDescription") + "," + QuotedFilename$(viFileDescription$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("FileVersion") + "," + QuotedFilename$(viFileVersion$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("InternalName") + "," + QuotedFilename$(viInternalName$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("LegalCopyright") + "," + QuotedFilename$(viLegalCopyright$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("LegalTrademarks") + "," + QuotedFilename$(viLegalTrademarks$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("OriginalFilename") + "," + QuotedFilename$(viOriginalFilename$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("ProductName") + "," + QuotedFilename$(viProductName$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("ProductVersion") + "," + QuotedFilename$(viProductVersion$ + "\0")
PRINT #iconfilehandle, " VALUE " + QuotedFilename$("Comments") + "," + QuotedFilename$(viComments$ + "\0")
PRINT #iconfilehandle, " END"
PRINT #iconfilehandle, " END"
PRINT #iconfilehandle, "END"
CLOSE #iconfilehandle
END IF
IF ExeIconSet OR VersionInfoSet THEN
ffh = FREEFILE
OPEN tmpdir$ + "call_windres.bat" FOR OUTPUT AS #ffh
PRINT #ffh, "internal\c\c_compiler\bin\windres.exe -i " + tmpdir$ + "icon.rc -o " + tmpdir$ + "icon.o"
CLOSE #ffh
SHELL _HIDE tmpdir$ + "call_windres.bat"
IF _FILEEXISTS(tmpdir$ + "icon.o") = 0 THEN
a$ = "Bad icon file": GOTO errmes
a$ = "Bad icon file"
IF VersionInfoSet THEN a$ = a$ + " or invalid $VERSIONINFO values"
GOTO errmes
END IF
END IF
END IF
@ -11983,7 +12104,7 @@ IF os$ = "WIN" THEN
END IF
'Add icon.o to the makeline
IF ExeIconSet THEN
IF ExeIconSet OR VersionInfoSet THEN
IF x THEN 'Use the previous libqb insertion point
a$ = LEFT$(a$, x + LEN(libqb$)) + "..\..\" + tmpdir$ + "icon.o " + MID$(a$, x + LEN(libqb$) + 1)
END IF