xref: /aosp_15_r20/external/intel-media-driver/Tools/bldsys/include/utils.cmake (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1# *****************************************************************************
2# Copyright (c) 2017 Intel Corporation
3#
4# Permission is hereby granted, free of charge, to any person obtaining a copy
5# of this software and associated documentation files (the "Software"), to deal
6# in the Software without restriction, including without limitation the rights
7# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8# copies of the Software, and to permit persons to whom the Software is
9# furnished to do so, subject to the following conditions:
10#
11# The above copyright notice and this permission notice shall be included in all
12# copies or substantial portions of the Software.
13#
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 THE
17# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20# SOFTWARE.
21# *****************************************************************************
22
23# utility functions for cmake
24
25if(NOT DEFINED _bs_include_utils)
26set(_bs_include_utils TRUE)
27
28include(${BUILD_SYS_INC}/bs_base_utils.cmake)
29
30
31# macro to setup output name to OUTPUT_NAME
32# and turn on position independent code. This
33# was pulled in to cover the separate hooks
34# that each component was using to a standard macro
35# for Linux builds only.  Can be extended to
36# cover other OS targets without the need to update
37# individual component lists.
38macro(bs_set_post_target)
39    if (${PLATFORM} STREQUAL linux)
40        set_property(TARGET ${LIB_NAME} PROPERTY OUTPUT_NAME ${OUTPUT_NAME})
41        set_property(TARGET ${LIB_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON)
42    endif(${PLATFORM} STREQUAL linux)
43endmacro()
44
45# macro to setup standard defines This
46# was pulled in to cover the separate v2c hooks
47# that each component was using to a standard macro
48# Can be extended to cover more OS targets without the need to update
49# individual component lists.
50macro(bs_set_defines)
51    if (${PLATFORM} STREQUAL "ghs")
52        # LANGUAGE "CXX" alone is not enough for GHS compiler
53        # as both CC and CXX execs point to the same binary
54        add_definitions(-dotciscxx)
55    endif (${PLATFORM} STREQUAL "ghs")
56
57    if(NOT ${PLATFORM} STREQUAL "qnx")
58        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
59    endif()
60
61    if (${PLATFORM} STREQUAL linux)
62        add_definitions(-D__STDC_LIMIT_MACROS)
63        add_definitions(-D__STDC_CONSTANT_MACROS)
64    endif (${PLATFORM} STREQUAL linux)
65endmacro()
66
67# macro to properly setup the target_link_libraries
68# for both INTERNAL_LIBS and EXTERNAL_LIBS.
69macro(bs_ufo_link_libraries TARGET_NAME INTERNAL_LIBS EXTERNAL_LIBS)
70
71    string(REPLACE " " ";" INTERNAL_LIBS_LIST "${INTERNAL_LIBS}")
72    string(REPLACE " " ";" EXTERNAL_LIBS_LIST "${EXTERNAL_LIBS}")
73
74    set(CMAKE_EXE_LINKER_FLAGS_RELEASE )
75
76    target_link_libraries(
77        ${TARGET_NAME}
78        -Wl,-Bsymbolic
79        -Wl,--no-undefined
80    )
81
82    foreach(lib ${INTERNAL_LIBS_LIST})
83        # work around an undef (DeleteGHAL3DRegInfo) when linking with external projects
84        if(NOT lib MATCHES "glsl_fe_link")
85            target_link_libraries(${TARGET_NAME} -Wl,--whole-archive ${lib})
86        endif()
87    endforeach()
88
89    target_link_libraries(
90        ${TARGET_NAME}
91        -Wl,--no-whole-archive
92    )
93
94    foreach(lib ${EXTERNAL_LIBS_LIST})
95        target_link_libraries(${TARGET_NAME} ${lib})
96    endforeach()
97
98endmacro()
99macro(bs_ufo_link_libraries_noBsymbolic TARGET_NAME INTERNAL_LIBS EXTERNAL_LIBS)
100
101    string(REPLACE " " ";" INTERNAL_LIBS_LIST "${INTERNAL_LIBS}")
102    string(REPLACE " " ";" EXTERNAL_LIBS_LIST "${EXTERNAL_LIBS}")
103
104    set(CMAKE_EXE_LINKER_FLAGS_RELEASE )
105
106    target_link_libraries(
107        ${TARGET_NAME}
108        -Wl,--no-undefined
109    )
110
111    foreach(lib ${INTERNAL_LIBS_LIST})
112        # work around an undef (DeleteGHAL3DRegInfo) when linking with external projects
113        if(NOT lib MATCHES "glsl_fe_link")
114            target_link_libraries(${TARGET_NAME} -Wl,--whole-archive ${lib})
115        endif()
116    endforeach()
117
118    target_link_libraries(
119        ${TARGET_NAME}
120        -Wl,--no-whole-archive
121    )
122
123    foreach(lib ${EXTERNAL_LIBS_LIST})
124        target_link_libraries(${TARGET_NAME} ${lib})
125    endforeach()
126
127endmacro()
128# macro to setup forced exceptions for Linux
129# builds only.  Should be extended for other
130# targets that require forced exceptions.
131macro(bs_set_force_exceptions)
132    if (${PLATFORM} STREQUAL "linux")
133        string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
134        string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
135        string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
136        string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS_RELEASEINTERNAL "${CMAKE_C_FLAGS_RELEASEINTERNAL}")
137
138        string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
139        string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
140        string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
141        string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS_RELEASEINTERNAL "${CMAKE_CXX_FLAGS_RELEASEINTERNAL}")
142
143        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
144        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
145        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
146        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS_RELEASEINERNAL "${CMAKE_C_FLAGS_RELEASEINERNAL}")
147
148        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
149        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
150        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
151        string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS_RELEASEINTERNAL "${CMAKE_CXX_FLAGS_RELEASEINTERNAL}")
152    endif()
153endmacro()
154
155# function to force an error if a variable if it is not
156# defined
157function(bs_fatal_if_undefined)
158    string(REPLACE " " ";" _var_names "${ARGV}")
159    set(_undef_seen FALSE)
160    foreach(_varnam ${_var_names})
161        if(NOT DEFINED ${_varnam})
162            message(SEND_ERROR "Required variable not defined: ${_varnam}")
163            set(_undef_seen TRUE)
164        endif()
165    endforeach()
166    if(_undef_seen)
167        message(FATAL_ERROR "Stopping due to undefined variables")
168    endif(_undef_seen)
169endfunction(bs_fatal_if_undefined)
170
171# macro to return the llvm directory path
172# for host and target builds.
173macro(bs_get_llvm_dir)
174    set(LLVM_DIR ${DUMP_DIR}/igc/llvm/${LLVM_INT_DIR})
175    set(CODEGEN_DIR ${DUMP_DIR}/codegen)
176endmacro()
177
178# macro to add common includes used by multiple components.
179macro(bs_add_some_common_includes)
180    bs_fatal_if_undefined(PLATFORM)
181    if (${PLATFORM} STREQUAL linux)
182        bs_get_llvm_dir()
183        bs_fatal_if_undefined(CODEGEN_DIR LLVM_DIR GFX_DEVELOPMENT_DIR)
184        include_directories(${CODEGEN_DIR})
185        include_directories(${LLVM_DIR}/include)
186        include_directories(${GFX_DEVELOPMENT_DIR}/Source/OpenGL/source/os/linux/oskl)
187
188        if(NOT "${LIBDRM_SRC}" STREQUAL "")
189            message("using LIBDRM_SRC=${LIBDRM_SRC}")
190            include_directories(${LIBDRM_SRC})
191            include_directories(${LIBDRM_SRC}/include/drm)
192            include_directories(${LIBDRM_SRC}/intel)
193        else()
194            include_directories(${BS_DIR_OPENGL}/source/os/linux/oskl/drm_intel)
195            include_directories(${BS_DIR_INSTRUMENTATION}/driver/linux/drm_intel)
196        endif()
197        set(DRM_LIB_PATH drm)
198        set(DRM_INTEL_LIB_PATH drm_intel)
199    endif()
200endmacro()
201
202# macro to allow setting a list of extra compile
203# definitions.
204macro(bs_set_extra_target_properties targ propValues)
205    string(REPLACE " " ";" PROP_VALUES "${ARGV}")
206    if(TARGET "${targ}")
207        foreach(prop ${PROP_VALUES})
208            if (${prop} STREQUAL ${targ})
209                continue()
210            endif()
211            set_property(TARGET "${targ}" APPEND PROPERTY COMPILE_DEFINITIONS
212                ${prop}
213            )
214        endforeach()
215    endif(TARGET "${targ}")
216endmacro()
217
218endif(NOT DEFINED _bs_include_utils)
219