From 46ad93c20c279fb4a6b95ce9bf6e1b43dfd09f68 Mon Sep 17 00:00:00 2001 From: Greg Bedwell Date: Fri, 12 Jun 2015 15:58:29 +0000 Subject: [PATCH] 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. llvm-svn: 239612 --- cmake/modules/AddLLVM.cmake | 82 ++++++++++++++++++++++++ resources/windows_version_resource.rc | 89 +++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 resources/windows_version_resource.rc diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index 85a09845b2e..06919d96f0f 100644 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -228,6 +228,74 @@ 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() + + 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... # SHARED;STATIC # STATIC by default w/o BUILD_SHARED_LIBS. @@ -316,10 +384,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} ) @@ -482,11 +557,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} ) diff --git a/resources/windows_version_resource.rc b/resources/windows_version_resource.rc new file mode 100644 index 00000000000..6c96a4d215d --- /dev/null +++ b/resources/windows_version_resource.rc @@ -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 \ No newline at end of file