Index: cmake/modules/AddLLVM.cmake =================================================================== --- cmake/modules/AddLLVM.cmake +++ cmake/modules/AddLLVM.cmake @@ -219,6 +219,36 @@ 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. No-op function otherwise. +function(add_version_info_on_windows OUT_VAR) + set(sources ${ARGN}) + if (MSVC) + set(resource_file ${LLVM_SOURCE_DIR}/windows_version_resource.rc) + set(sources ${sources} ${resource_file}) + source_group("Resource Files" ${resource_file}) + + if (DEFINED SVN_REVISION) + set(RC_SVN_REVISION ${SVN_REVISION}) + else() + set(RC_SVN_REVISION 0) + endif() + + set_property(SOURCE ${resource_file} + PROPERTY COMPILE_DEFINITIONS + "RC_VERSION_FIELD_1=${LLVM_VERSION_MAJOR}" + "RC_VERSION_FIELD_2=${LLVM_VERSION_MINOR}" + "RC_VERSION_FIELD_3=${LLVM_VERSION_PATCH}" + "RC_VERSION_FIELD_4=${RC_SVN_REVISION}" + "RC_FILE_VERSION=\"${PACKAGE_VERSION}\"") + endif(MSVC) + + set(${OUT_VAR} ${sources} PARENT_SCOPE) +endfunction(add_version_info_on_windows) + + + # llvm_add_library(name sources... # SHARED;STATIC # STATIC by default w/o BUILD_SHARED_LIBS. @@ -307,6 +337,7 @@ if(ARG_MODULE) add_library(${name} MODULE ${ALL_FILES}) elseif(ARG_SHARED) + add_version_info_on_windows(ALL_FILES ${ALL_FILES}) add_library(${name} SHARED ${ALL_FILES}) else() add_library(${name} STATIC ${ALL_FILES}) @@ -460,6 +491,7 @@ macro(add_llvm_executable name) llvm_process_sources( ALL_FILES ${ARGN} ) + add_version_info_on_windows(ALL_FILES ${ALL_FILES}) if( EXCLUDE_FROM_ALL ) add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) else() Index: cmake/modules/HandleLLVMOptions.cmake =================================================================== --- cmake/modules/HandleLLVMOptions.cmake +++ cmake/modules/HandleLLVMOptions.cmake @@ -248,7 +248,9 @@ -D_CRT_NONSTDC_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS + ) + set(msvc_warning_flags # Disabled warnings. -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned' -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored' @@ -275,6 +277,11 @@ -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error. ) + foreach(flag ${msvc_warning_flags}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") + endforeach(flag) + # Enable warnings if (LLVM_ENABLE_WARNINGS) add_llvm_definitions( /W4 ) Index: windows_version_resource.rc =================================================================== --- windows_version_resource.rc +++ windows_version_resource.rc @@ -0,0 +1,80 @@ +// 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 + +#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_FILE_VERSION +#define RC_FILE_VERSION "" +#endif + +#ifndef RC_PRODUCT_VERSION +#define RC_PRODUCT_VERSION RC_FILE_VERSION +#endif + +#ifndef RC_ORIGINAL_FILENAME +#define RC_ORIGINAL_FILENAME "" +#endif + +#ifndef RC_INTERNAL_NAME +#define RC_INTERNAL_NAME "" +#endif + +#ifndef RC_FILE_DESCRIPTION +#define RC_FILE_DESCRIPTION "" +#endif + +#ifndef RC_COMPANY_NAME +#define RC_COMPANY_NAME "" +#endif + +#ifndef RC_COPYRIGHT +#define RC_COPYRIGHT "" +#endif + +#ifndef RC_PRODUCT_NAME +#define RC_PRODUCT_NAME RC_FILE_DESCRIPTION +#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 + VALUE "FileVersion", RC_FILE_VERSION + VALUE "ProductVersion", RC_PRODUCT_VERSION + VALUE "OriginalFilename", RC_ORIGINAL_FILENAME + VALUE "InternalName", RC_INTERNAL_NAME + VALUE "FileDescription", RC_FILE_DESCRIPTION + VALUE "CompanyName", RC_COMPANY_NAME + VALUE "LegalCopyright", RC_COPYRIGHT + VALUE "ProductName", RC_PRODUCT_NAME + 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