# Copyright(c) 2017 Intel Corporation | |
# Permission is hereby granted, free of charge, to any person obtaining a | |
# copy of this software and associated documentation files(the "Software"), | |
# to deal in the Software without restriction, including without limitation | |
# the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
# and / or sell copies of the Software, and to permit persons to whom the | |
# Software is furnished to do so, subject to the following conditions: | |
# The above copyright notice and this permission notice shall be included | |
# in all copies or substantial portions of the Software. | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
# OTHER DEALINGS IN THE SOFTWARE. | |
# utility functions for cmake | |
if(NOT DEFINED _bs_include_utils) | |
set(_bs_include_utils TRUE) | |
include(${BUILD_SYS_INC}/bs_base_utils.cmake) | |
# macro bs_assignments_from_file - Execute a file of assignments. | |
# This must be a macro and not a function so as to not provide an | |
# additional level of symbol scope. | |
# | |
# For an example, see file include/bs_enable.mk . | |
# | |
# Example file content: | |
# # A comment looks like this. Assignments follow: | |
# BS_ENABLE_gmmlib = 0 | |
# BS_ENABLE_igc = 0 | |
macro(bs_assignments_from_file file_path) | |
file(STRINGS "${file_path}" bsa_list) | |
bs_assignments_from_string("${bsa_list}") | |
endmacro(bs_assignments_from_file) | |
# Function to capitalize SourceString and return | |
# the result on ResultString | |
function(_bs_capitalize SourceString ResultString) | |
string(SUBSTRING ${SourceString} 0 1 FIRST_LETTER) | |
string(TOUPPER ${FIRST_LETTER} FIRST_LETTER) | |
string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" CapString "${SourceString}") | |
set(${ResultString} ${CapString} PARENT_SCOPE) | |
endfunction(_bs_capitalize) | |
# Function to return the canonical string for gen | |
# Ex: gen7.5 becomes gen75 | |
function(bs_canonicalize_string_gen SourceGen AllGens) | |
if ( ${SourceGen} MATCHES "[0-9].[0-9]") | |
STRING(REPLACE "." "" tempstr ${SourceGen}) | |
else() | |
set(tempstr "${SourceGen}0") | |
endif() | |
set(${AllGens} ${tempstr} PARENT_SCOPE) | |
endfunction(bs_canonicalize_string_gen) | |
# bs_list_to_string - Convert a cmake list to a string. | |
macro(bs_list_to_string varnam) | |
string(REPLACE ";" " " ${varnam} "${${varnam}}") | |
endmacro(bs_list_to_string) | |
# bs_string_to_list - Convert a string to a cmake list. | |
macro(bs_string_to_list varnam) | |
string(REPLACE " " ";" ${varnam} "${${varnam}}") | |
endmacro(bs_string_to_list) | |
# Macro to find the xsltproc installed on | |
# the system. | |
macro(bs_find_xsltproc) | |
if (NOT ${PLATFORM} STREQUAL Windows) | |
find_program(XSLTPROC xsltproc) | |
else() | |
find_program(XSLTPROC NAMES xslt msxsl msxsl.exe PATHS "${BS_DIR_INSTRUMENTATION}/tools") | |
endif() | |
endmacro(bs_find_xsltproc) | |
# Macro to find the python installed on | |
# the system. | |
macro(bs_find_python) | |
if (NOT ${PLATFORM} STREQUAL Windows) | |
find_program(PYTHON python) | |
else() | |
find_program(PYTHON NAMES python.exe PATHS "${GFX_DEVELOPMENT_DIR}/Tools/Build/scripts/deps/python27" NO_DEFAULT_PATH) | |
endif() | |
message("python is ${PYTHON}") | |
endmacro(bs_find_python) | |
# Macro to find the flex installed on | |
# the system. | |
macro(bs_find_flex) | |
if (NOT ${PLATFORM} STREQUAL Windows) | |
find_program(FLEX flex) | |
else() | |
find_program(FLEX NAMES flex flex.exe PATHS "${GFX_DEVELOPMENT_DIR}/Tools//OpenGL/BisonFlex/win") | |
endif() | |
endmacro(bs_find_flex) | |
# Macro to find the bison installed on | |
# the system. | |
macro(bs_find_bison) | |
if (NOT ${PLATFORM} STREQUAL Windows) | |
find_program(BISON bison) | |
else() | |
find_program(BISON NAMES bison bison.exe PATHS "${GFX_DEVELOPMENT_DIR}/Tools//OpenGL/BisonFlex/win") | |
endif() | |
endmacro(bs_find_bison) | |
# Macro to find the patch installed on | |
# the system. | |
macro(bs_find_patch) | |
find_program(PATCH NAMES patch patch.exe) | |
endmacro() | |
macro(bs_find_7z) | |
if (NOT ${PLATFORM} STREQUAL Windows) | |
find_program(7Z NAMES 7za 7z) | |
else() | |
find_program(7Z NAMES 7z.exe PATHS "${GFX_DEVELOPMENT_DIR}/Tools/Build/scripts/deps/7zip") | |
endif() | |
endmacro() | |
function(bs_check_component_enable component_name enable_flag_name) | |
set(_component_enable "${BS_ENABLE_${component_name}}") | |
if("${_component_enable}" STREQUAL "1") | |
set(_enable_flag 1) | |
elseif("${_component_enable}" STREQUAL "W") | |
if("${PLATFORM}" STREQUAL "Windows") | |
set(_enable_flag 1) | |
else() | |
set(_enable_flag 0) | |
endif() | |
elseif("${_component_enable}" STREQUAL "NW") | |
if(NOT "${PLATFORM}" STREQUAL "Windows") | |
set(_enable_flag 1) | |
else() | |
set(_enable_flag 0) | |
endif() | |
elseif("${_component_enable}" STREQUAL "0") | |
set(_enable_flag 0) | |
elseif("${_component_enable}" STREQUAL "t") | |
set(_enable_flag 0) | |
message(WARNING "${CMAKE_CURRENT_LIST_FILE}: warning: Obsolete component enable flag, now same as 0: ${component_name}: \"${_component_enable}\"") | |
else() | |
set(_enable_flag 0) | |
message(SEND_ERROR "${CMAKE_CURRENT_LIST_FILE}: error: Invalid component enable flag: ${component_name}: \"${_component_enable}\"") | |
endif() | |
if("${_enable_flag}") | |
message("${CMAKE_CURRENT_LIST_FILE}: component enabled (${_component_enable}): ${component_name}") | |
else() | |
message("${CMAKE_CURRENT_LIST_FILE}: component disabled: ${component_name}") | |
endif() | |
set(${enable_flag_name} ${_enable_flag} PARENT_SCOPE) | |
endfunction(bs_check_component_enable) | |
# macro to setup output name to OUTPUT_NAME | |
# and turn on position independent code. This | |
# was pulled in to cover the separate v2c hooks | |
# that each component was using to a standard macro | |
# for Linux builds only. Can be extended to | |
# cover other OS targets without the need to update | |
# individual component lists. | |
macro(bs_set_post_target) | |
if (${PLATFORM} STREQUAL linux) | |
set_property(TARGET ${LIB_NAME} PROPERTY OUTPUT_NAME ${OUTPUT_NAME}) | |
set_property(TARGET ${LIB_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON) | |
endif(${PLATFORM} STREQUAL linux) | |
endmacro() | |
# macro to setup standard defines This | |
# was pulled in to cover the separate v2c hooks | |
# that each component was using to a standard macro | |
# Can be extended to cover more OS targets without the need to update | |
# individual component lists. | |
macro(bs_set_defines) | |
if (${PLATFORM} STREQUAL linux) | |
add_definitions(-D__STDC_LIMIT_MACROS) | |
add_definitions(-D__STDC_CONSTANT_MACROS) | |
endif (${PLATFORM} STREQUAL linux) | |
endmacro() | |
# macro to setup forced exceptions for Linux | |
# builds only. Should be extended for other | |
# targets that require forced exceptions. | |
macro(bs_set_force_exceptions) | |
if (${PLATFORM} STREQUAL "linux") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_C_FLAGS_RELEASEINTERNAL "${CMAKE_C_FLAGS_RELEASEINTERNAL}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") | |
string(REPLACE "no-exceptions" "exceptions" CMAKE_CXX_FLAGS_RELEASEINTERNAL "${CMAKE_CXX_FLAGS_RELEASEINTERNAL}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_C_FLAGS_RELEASEINERNAL "${CMAKE_C_FLAGS_RELEASEINERNAL}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") | |
string(REPLACE "-DNO_EXCEPTION_HANDLING" "" CMAKE_CXX_FLAGS_RELEASEINTERNAL "${CMAKE_CXX_FLAGS_RELEASEINTERNAL}") | |
endif() | |
endmacro() | |
# function to force an error if a variable if it is not | |
# defined | |
function(bs_fatal_if_undefined) | |
string(REPLACE " " ";" _var_names "${ARGV}") | |
set(_undef_seen FALSE) | |
foreach(_varnam ${_var_names}) | |
if(NOT DEFINED ${_varnam}) | |
message(SEND_ERROR "Required variable not defined: ${_varnam}") | |
set(_undef_seen TRUE) | |
endif() | |
endforeach() | |
if(_undef_seen) | |
message(FATAL_ERROR "Stopping due to undefined variables") | |
endif(_undef_seen) | |
endfunction(bs_fatal_if_undefined) | |
# macro to return the llvm directory path | |
# for host and target builds. | |
macro(bs_get_llvm_dir) | |
set(LLVM_DIR ${DUMP_DIR}/igc/llvm/${LLVM_INT_DIR}) | |
set(CODEGEN_DIR ${DUMP_DIR}/codegen) | |
endmacro() | |
# macro to add common includes used by multiple components. | |
macro(bs_add_some_common_includes) | |
bs_fatal_if_undefined(PLATFORM) | |
if (${PLATFORM} STREQUAL linux) | |
bs_get_llvm_dir() | |
bs_fatal_if_undefined(CODEGEN_DIR LLVM_DIR GFX_DEVELOPMENT_DIR) | |
include_directories(${CODEGEN_DIR}) | |
include_directories(${LLVM_DIR}/include) | |
include_directories(${GFX_DEVELOPMENT_DIR}/Source/OpenGL/source/os/linux/oskl) | |
if(NOT "${LIBDRM_SRC}" STREQUAL "") | |
message("using LIBDRM_SRC=${LIBDRM_SRC}") | |
include_directories(${LIBDRM_SRC}) | |
include_directories(${LIBDRM_SRC}/include/drm) | |
include_directories(${LIBDRM_SRC}/intel) | |
else() | |
include_directories(${BS_DIR_OPENGL}/source/os/linux/oskl/drm_intel) | |
include_directories(${BS_DIR_INSTRUMENTATION}/driver/linux/drm_intel) | |
endif() | |
set(DRM_LIB_PATH drm) | |
set(DRM_INTEL_LIB_PATH drm_intel) | |
endif() | |
endmacro() | |
# macro to allow setting a list of extra compile | |
# definitions. | |
macro(bs_set_extra_target_properties targ propValues) | |
string(REPLACE " " ";" PROP_VALUES "${ARGV}") | |
if(TARGET "${targ}") | |
foreach(prop ${PROP_VALUES}) | |
if (${prop} STREQUAL ${targ}) | |
continue() | |
endif() | |
set_property(TARGET "${targ}" APPEND PROPERTY COMPILE_DEFINITIONS | |
${prop} | |
) | |
endforeach() | |
endif(TARGET "${targ}") | |
endmacro() | |
# | |
# Macro to help find libraries when they are build as external projects. | |
# | |
macro(bs_external_add_library names paths target_name shared) | |
find_library(_LIB NAMES ${names} PATHS ${paths}) | |
if(_LIB AND NOT TARGET ${target_name}) | |
message("importing external library ${target_name}") | |
if(${shared} MATCHES y) | |
add_library(${target_name} SHARED IMPORTED GLOBAL) | |
else() | |
add_library(${target_name} STATIC IMPORTED GLOBAL) | |
endif() | |
set_target_properties(${target_name} PROPERTIES IMPORTED_LOCATION "${_LIB}") | |
endif() | |
endmacro() | |
endif(NOT DEFINED _bs_include_utils) |