[Piglit] [PATCH] cmake: create Win10 manifest files for particular executables

Brian Paul brianp at vmware.com
Sat Nov 4 20:56:19 UTC 2017


On 11/03/2017 09:06 AM, Jose Fonseca wrote:
> On 27/10/17 17:12, Brian Paul wrote:
>> On Windows10 (and possibly older versions), UAC (User Account Control)
>> intervenes when starting an executables with "patch", "update" or "setup"
>> in their name.  This requires the user to approve execution by clicking
>> in a dialog window (and even then, causes test failures).  With Cygwin,
>> you simply get "Permission Denied".
>>
>> Currently, there are four Piglit tests which need this special treatment:
>> bin/arb_compute_shader-zero-dispatch-size
>> bin/arb_tessellation_shader-invalid-patch-vertices-range
>> bin/glsl-uniform-update
>> bin/mipmap-setup
>>
>> A work-around is to create a manifest file for each effected executable.
>> This patch creates a <foo>.exe.manifest file if "foo" contains any of
>> the above strings.  There's no effect on non-Windows platforms.
>>
>> Note: this solution uses the cmake file(GENERATE ...) function.  I think
>> add_custom_command() is probably the proper approach, but I've been
>> unsuccessful in getting that to work.
>> ---
>>   cmake/piglit_util.cmake  | 30 ++++++++++++++++++++++++++++++
>>   cmake/win10-manifest.txt | 12 ++++++++++++
>>   2 files changed, 42 insertions(+)
>>   create mode 100644 cmake/win10-manifest.txt
>>
>> diff --git a/cmake/piglit_util.cmake b/cmake/piglit_util.cmake
>> index 411fa54..9b85761 100644
>> --- a/cmake/piglit_util.cmake
>> +++ b/cmake/piglit_util.cmake
>> @@ -58,6 +58,8 @@ endfunction(piglit_include_target_api)
>>   #
>>   function(piglit_add_executable name)
>> +    piglit_create_manifest_file(${name})
>> +
>>       list(REMOVE_AT ARGV 0)
>>       add_executable(${name} ${ARGV})
>>       add_dependencies(${name} piglit_dispatch_gen)
>
>
>
>
>> @@ -89,3 +91,31 @@ function(piglit_add_library name)
>>       endif() >
>>   endfunction(piglit_add_library)
>> +
>> +
>> +# This is lame, but Windows 10 (and maybe Win8) asks for confirmation
>> +# before running .exe files containing the strings "patch", "setup",
>> +# "update", etc.  In Cygwin, we simply get "Permission Denied".
>> +# This causes the Piglit test to fail.
>> +# The work-around is to create a "manifest" file for such executables.
>> +# This function examines the target name and creates the manifest file
>> +# if needed.  The file will be named "${target}.exe.manifest".
>> +# See
>> https://answers.microsoft.com/en-us/windows/forum/windows_7-security/uac-prompts-on-any-program-with-the-word-patch-or/c5359497-d16e-43c6-99f2-db3d8eecc9c0?auth=1
>>
>> +function(piglit_create_manifest_file target)
>> +   if (WIN32)
>> +      # look for known strings
>> +      string(FIND ${target} "patch" r1)
>> +      string(FIND ${target} "setup" r2)
>> +      string(FIND ${target} "update" r3)
>> +
>> +      # if any of those strings is in the target filename
>> +      if((${r1} GREATER -1) OR (${r2} GREATER -1) OR (${r3} GREATER -1))
>> +        # XXX we should probably use add_custom_command() here to copy
>> +        # the manifest file, but I've been unsuccessful in getting
>> +        # that to work.
>> +        file(GENERATE
>> +         OUTPUT bin/${target}.exe.manifest
>> +         INPUT ${CMAKE_SOURCE_DIR}/cmake/win10-manifest.txt)
>
> Neat. I hadn't realized the manifest files could exist as free standing
> .exe.manifest files (I presumed one would always have to build)
>
> I think you'll need to add a
>
>    install (FILES bin/${target}.exe.manifest DESTINATION
> ${PIGLIT_INSTALL_LIBDIR}/bin)
>
> inside piglit_add_executable() macro, so that the manifest files get
> copied and installed
>
> I think things would probably get easier to do this if you merged
> piglit_create_manifest_file macro into the piglit_add_executable macro
> body.

OK I tinkered with this for a few hours without luck.  I get cmake 
errors like:

% cmake
[...]
-- Configuring done
CMake Error in tests/shaders/CMakeLists.txt:
   Evaluation file "bin/glsl-uniform-update.exe.manifest" cannot be written.


My cmake skills are pretty weak and googling hasn't given me any tips.

-Brian



More information about the Piglit mailing list