docs: Fix README link
[piglit.git] / cmake / piglit_util.cmake
blob918ea8421b8c87f5c684db40c85ad2aa54b39c99
1 # Copyright 2012 Intel Corporation
3 # Permission is hereby granted, free of charge, to any person obtaining a
4 # copy of this software and associated documentation files (the "Software"),
5 # to deal in the Software without restriction, including without limitation
6 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
7 # and/or sell copies of the Software, and to permit persons to whom the
8 # Software is furnished to do so, subject to the following conditions:
10 # The above copyright notice and this permission notice (including the next
11 # paragraph) shall be included in all copies or substantial portions of the
12 # Software.
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 # IN THE SOFTWARE.
22 # function piglit_include_target_api
24 # If the file CMakeLists.${piglit_target_api}.txt exists in the current source
25 # directory, then include it.
27 function(piglit_include_target_api)
29     # Verify that the value of `piglit_target_api` is valid.
30     set(valid_api FALSE)
32     foreach(api "gl" "gles1" "gles2" "gles3" "cl" "no_api")
33         if(piglit_target_api STREQUAL ${api})
34             set(valid_api TRUE)
35             break()
36         endif(piglit_target_api STREQUAL ${api})
37     endforeach(api)
39     if(NOT valid_api)
40         message(FATAL_ERROR "Invalid value for piglit_target_api: ${piglit_target_api}")
41     endif(NOT valid_api)
43     # Include CMakeLists.${piglit_target_api}.txt` if it exists.
44     set(api_file ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.${piglit_target_api}.txt)
45     if(EXISTS ${api_file})
46         include(${api_file})
47     endif(EXISTS ${api_file})
49 endfunction(piglit_include_target_api)
52 # function piglit_add_executable
54 # This function wraps `add_executable` and has the same signature.
56 # In addition to calling `add_executable`, it adds to each object file
57 # a dependency on piglit_dispatch's generated files.
59 function(piglit_add_executable name)
61     piglit_create_manifest_file(${name})
63     list(REMOVE_AT ARGV 0)
64     add_executable(${name} ${ARGV})
65     add_dependencies(${name} piglit_dispatch_gen)
67     install(TARGETS ${name} DESTINATION ${PIGLIT_INSTALL_LIBDIR}/bin)
69 endfunction(piglit_add_executable)
72 # function piglit_add_library
74 # This function wraps `add_library` and has the same signature.
76 # In addition to calling `add_library`, it adds to each object file
77 # a dependency on piglit_dispatch's generated files.
79 function(piglit_add_library name)
81     list(REMOVE_AT ARGV 0)
82     if(WIN32)
83         add_library(${name} STATIC ${ARGV})
84     else(WIN32)
85         add_library(${name} SHARED ${ARGV})
86         install(TARGETS ${name} DESTINATION ${PIGLIT_INSTALL_LIBDIR}/lib)
87     endif(WIN32)
88     add_dependencies(${name} piglit_dispatch_gen)
89     if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
90         set_target_properties(${name} PROPERTIES SOVERSION "0")
91     endif()
93 endfunction(piglit_add_library)
96 # This is lame, but Windows 10 (and maybe Win8) asks for confirmation
97 # before running .exe files containing the strings "patch", "setup",
98 # "update", etc.  In Cygwin, we simply get "Permission Denied".
99 # This causes the Piglit test to fail.
100 # The work-around is to create a "manifest" file for such executables.
101 # This function examines the target name and creates the manifest file
102 # if needed.  The file will be named "${target}.exe.manifest".
103 # 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
104 function(piglit_create_manifest_file target)
105    if (WIN32)
106       # look for known strings
107       string(FIND ${target} "patch" r1)
108       string(FIND ${target} "setup" r2)
109       string(FIND ${target} "update" r3)
111       # if any of those strings is in the target filename
112       if((${r1} GREATER -1) OR (${r2} GREATER -1) OR (${r3} GREATER -1))
113             # XXX we should probably use add_custom_command() here to copy
114             # the manifest file, but I've been unsuccessful in getting
115             # that to work.
116             file(GENERATE
117                  OUTPUT $<TARGET_FILE:${target}>.manifest
118                  INPUT ${CMAKE_SOURCE_DIR}/cmake/win10-manifest.txt)
120             install(FILES $<TARGET_FILE:${target}>.manifest
121                     DESTINATION ${PIGLIT_INSTALL_LIBDIR}/bin)
122        endif()
123    endif()
124 endfunction(piglit_create_manifest_file)