Skip to content

Commit

Permalink
In MSVC builds embed a VERSIONINFO resource in our exe and DLL files.
Browse files Browse the repository at this point in the history
This embeds Windows version information into our executables and DLLs.
The most visible place to view this data is in the details tab of the file
properties window in Windows explorer.

Differential Revision: http://reviews.llvm.org/D7828

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238740 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
gregbedwell committed Jun 1, 2015
1 parent 7d97fc4 commit c2165f1
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 0 deletions.
86 changes: 86 additions & 0 deletions cmake/modules/AddLLVM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,78 @@ function(set_output_directory target bindir libdir)
endif()
endfunction()

# If on Windows and building with MSVC, add the resource script containing the
# VERSIONINFO data to the project. This embeds version resource information
# into the output .exe or .dll.
# TODO: Enable for MinGW Windows builds too.
#
function(add_windows_version_resource_file OUT_VAR)
set(sources ${ARGN})
if (MSVC)
set(resource_file ${LLVM_SOURCE_DIR}/resources/windows_version_resource.rc)
set(sources ${sources} ${resource_file})
source_group("Resource Files" ${resource_file})
set(windows_resource_file ${resource_file} PARENT_SCOPE)
endif(MSVC)

set(${OUT_VAR} ${sources} PARENT_SCOPE)
endfunction(add_windows_version_resource_file)

# set_windows_version_resource_properties(name resource_file...
# VERSION_MAJOR int
# Optional major version number (defaults to LLVM_VERSION_MAJOR)
# VERSION_MINOR int
# Optional minor version number (defaults to LLVM_VERSION_MINOR)
# VERSION_PATCHLEVEL int
# Optional patchlevel version number (defaults to LLVM_VERSION_PATCH)
# VERSION_STRING
# Optional version string (defaults to PACKAGE_VERSION)
# PRODUCT_NAME
# Optional product name string (defaults to "LLVM")
# )
function(set_windows_version_resource_properties name resource_file)
cmake_parse_arguments(ARG
""
"VERSION_MAJOR;VERSION_MINOR;VERSION_PATCHLEVEL;VERSION_STRING;PRODUCT_NAME"
""
${ARGN})

if (NOT DEFINED ARG_VERSION_MAJOR)
set(ARG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
endif()

if (NOT DEFINED ARG_VERSION_MINOR)
set(ARG_VERSION_MINOR ${LLVM_VERSION_MINOR})
endif()

if (NOT DEFINED ARG_VERSION_PATCHLEVEL)
set(ARG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
endif()

if (NOT DEFINED ARG_VERSION_STRING)
set(ARG_VERSION_STRING ${PACKAGE_VERSION})
endif()

if (NOT DEFINED ARG_PRODUCT_NAME)
set(ARG_PRODUCT_NAME "LLVM")
endif()

get_target_property(target_location ${name} LOCATION)
get_filename_component(target_filename ${target_location} NAME)

set_property(SOURCE ${resource_file}
PROPERTY COMPILE_DEFINITIONS
"RC_VERSION_FIELD_1=${ARG_VERSION_MAJOR}"
"RC_VERSION_FIELD_2=${ARG_VERSION_MINOR}"
"RC_VERSION_FIELD_3=${ARG_VERSION_PATCHLEVEL}"
"RC_VERSION_FIELD_4=0"
"RC_FILE_VERSION=\"${ARG_VERSION_STRING}\""
"RC_INTERNAL_NAME=\"${name}\""
"RC_ORIGINAL_FILENAME=\"${target_filename}\""
"RC_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\""
"RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"")
endfunction(set_windows_version_resource_properties)

# llvm_add_library(name sources...
# SHARED;STATIC
# STATIC by default w/o BUILD_SHARED_LIBS.
Expand Down Expand Up @@ -316,10 +388,17 @@ function(llvm_add_library name)
if(ARG_MODULE)
add_library(${name} MODULE ${ALL_FILES})
elseif(ARG_SHARED)
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
add_library(${name} SHARED ${ALL_FILES})
else()
add_library(${name} STATIC ${ALL_FILES})
endif()

if(DEFINED windows_resource_file)
set_windows_version_resource_properties(${name} ${windows_resource_file})
set(windows_resource_file ${windows_resource_file} PARENT_SCOPE)
endif()

set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
llvm_update_compile_flags(${name})
add_link_opts( ${name} )
Expand Down Expand Up @@ -482,11 +561,18 @@ endmacro(add_llvm_loadable_module name)

macro(add_llvm_executable name)
llvm_process_sources( ALL_FILES ${ARGN} )
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})

if( EXCLUDE_FROM_ALL )
add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
else()
add_executable(${name} ${ALL_FILES})
endif()

if(DEFINED windows_resource_file)
set_windows_version_resource_properties(${name} ${windows_resource_file})
endif()

llvm_update_compile_flags(${name})
add_link_opts( ${name} )

Expand Down
89 changes: 89 additions & 0 deletions resources/windows_version_resource.rc
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Microsoft Visual C++ resource script for embedding version information.
// The format is described at:
// http://msdn.microsoft.com/en-gb/library/windows/desktop/aa380599(v=vs.85).aspx
// The VERSIONINFO resource is described at:
// https://msdn.microsoft.com/en-gb/library/windows/desktop/aa381058(v=vs.85).aspx


// Default values for required fields.

#ifndef RC_VERSION_FIELD_1
#define RC_VERSION_FIELD_1 0
#endif

#ifndef RC_VERSION_FIELD_2
#define RC_VERSION_FIELD_2 0
#endif

#ifndef RC_VERSION_FIELD_3
#define RC_VERSION_FIELD_3 0
#endif

#ifndef RC_VERSION_FIELD_4
#define RC_VERSION_FIELD_4 0
#endif

#ifndef RC_COMPANY_NAME
#define RC_COMPANY_NAME ""
#endif

#ifndef RC_FILE_DESCRIPTION
#define RC_FILE_DESCRIPTION ""
#endif

#ifndef RC_FILE_VERSION
#define RC_FILE_VERSION ""
#endif

#ifndef RC_INTERNAL_NAME
#define RC_INTERNAL_NAME ""
#endif

#ifndef RC_ORIGINAL_FILENAME
#define RC_ORIGINAL_FILENAME ""
#endif

#ifndef RC_PRODUCT_NAME
#define RC_PRODUCT_NAME ""
#endif

#ifndef RC_PRODUCT_VERSION
#define RC_PRODUCT_VERSION ""
#endif


1 VERSIONINFO
FILEVERSION RC_VERSION_FIELD_1,RC_VERSION_FIELD_2,RC_VERSION_FIELD_3,RC_VERSION_FIELD_4
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
// Required strings
VALUE "CompanyName", RC_COMPANY_NAME
VALUE "FileDescription", RC_FILE_DESCRIPTION
VALUE "FileVersion", RC_FILE_VERSION
VALUE "InternalName", RC_INTERNAL_NAME
VALUE "OriginalFilename", RC_ORIGINAL_FILENAME
VALUE "ProductName", RC_PRODUCT_NAME
VALUE "ProductVersion", RC_PRODUCT_VERSION

// Optional strings
#ifdef RC_COMMENTS
VALUE "Comments", RC_COMMENTS
#endif

#ifdef RC_COPYRIGHT
VALUE "LegalCopyright", RC_COPYRIGHT
#endif
END
END

BLOCK "VarFileInfo"
BEGIN
// The translation must correspond to the above BLOCK inside StringFileInfo
// langID 0x0409 U.S. English
// charsetID 0x04B0 Unicode
VALUE "Translation", 0x0409, 0x04B0
END
END

0 comments on commit c2165f1

Please sign in to comment.