In MSVC builds embed a VERSIONINFO resource in our exe and DLL files.

This reinstates my commits r238740/r238741 which I reverted due to a failure
in the clang-cl selfhost tests on Windows.  I've now fixed the issue in
clang-cl that caused the failure so hopefully all should be well now.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239612 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Greg Bedwell 2015-06-12 15:58:29 +00:00
parent 3bc62ab179
commit cb2dfa6478
2 changed files with 171 additions and 0 deletions

View File

@ -228,6 +228,74 @@ function(set_output_directory target bindir libdir)
endif() endif()
endfunction() 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()
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_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\""
"RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"")
endfunction(set_windows_version_resource_properties)
# llvm_add_library(name sources... # llvm_add_library(name sources...
# SHARED;STATIC # SHARED;STATIC
# STATIC by default w/o BUILD_SHARED_LIBS. # STATIC by default w/o BUILD_SHARED_LIBS.
@ -316,10 +384,17 @@ function(llvm_add_library name)
if(ARG_MODULE) if(ARG_MODULE)
add_library(${name} MODULE ${ALL_FILES}) add_library(${name} MODULE ${ALL_FILES})
elseif(ARG_SHARED) elseif(ARG_SHARED)
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
add_library(${name} SHARED ${ALL_FILES}) add_library(${name} SHARED ${ALL_FILES})
else() else()
add_library(${name} STATIC ${ALL_FILES}) add_library(${name} STATIC ${ALL_FILES})
endif() 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}) set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
llvm_update_compile_flags(${name}) llvm_update_compile_flags(${name})
add_link_opts( ${name} ) add_link_opts( ${name} )
@ -482,11 +557,18 @@ endmacro(add_llvm_loadable_module name)
macro(add_llvm_executable name) macro(add_llvm_executable name)
llvm_process_sources( ALL_FILES ${ARGN} ) llvm_process_sources( ALL_FILES ${ARGN} )
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
if( EXCLUDE_FROM_ALL ) if( EXCLUDE_FROM_ALL )
add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
else() else()
add_executable(${name} ${ALL_FILES}) add_executable(${name} ${ALL_FILES})
endif() endif()
if(DEFINED windows_resource_file)
set_windows_version_resource_properties(${name} ${windows_resource_file})
endif()
llvm_update_compile_flags(${name}) llvm_update_compile_flags(${name})
add_link_opts( ${name} ) add_link_opts( ${name} )

View File

@ -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