# ***************************************************************************** # 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 to setup output name to OUTPUT_NAME # and turn on position independent code. This # was pulled in to cover the separate 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 "ghs") # LANGUAGE "CXX" alone is not enough for GHS compiler # as both CC and CXX execs point to the same binary add_definitions(-dotciscxx) endif (${PLATFORM} STREQUAL "ghs") if(NOT ${PLATFORM} STREQUAL "qnx") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() if (${PLATFORM} STREQUAL linux) add_definitions(-D__STDC_LIMIT_MACROS) add_definitions(-D__STDC_CONSTANT_MACROS) endif (${PLATFORM} STREQUAL linux) endmacro() # macro to properly setup the target_link_libraries # for both INTERNAL_LIBS and EXTERNAL_LIBS. macro(bs_ufo_link_libraries TARGET_NAME INTERNAL_LIBS EXTERNAL_LIBS) string(REPLACE " " ";" INTERNAL_LIBS_LIST "${INTERNAL_LIBS}") string(REPLACE " " ";" EXTERNAL_LIBS_LIST "${EXTERNAL_LIBS}") set(CMAKE_EXE_LINKER_FLAGS_RELEASE ) target_link_libraries( ${TARGET_NAME} -Wl,-Bsymbolic -Wl,--no-undefined ) foreach(lib ${INTERNAL_LIBS_LIST}) # work around an undef (DeleteGHAL3DRegInfo) when linking with external projects if(NOT lib MATCHES "glsl_fe_link") target_link_libraries(${TARGET_NAME} -Wl,--whole-archive ${lib}) endif() endforeach() target_link_libraries( ${TARGET_NAME} -Wl,--no-whole-archive ) foreach(lib ${EXTERNAL_LIBS_LIST}) target_link_libraries(${TARGET_NAME} ${lib}) endforeach() endmacro() macro(bs_ufo_link_libraries_noBsymbolic TARGET_NAME INTERNAL_LIBS EXTERNAL_LIBS) string(REPLACE " " ";" INTERNAL_LIBS_LIST "${INTERNAL_LIBS}") string(REPLACE " " ";" EXTERNAL_LIBS_LIST "${EXTERNAL_LIBS}") set(CMAKE_EXE_LINKER_FLAGS_RELEASE ) target_link_libraries( ${TARGET_NAME} -Wl,--no-undefined ) foreach(lib ${INTERNAL_LIBS_LIST}) # work around an undef (DeleteGHAL3DRegInfo) when linking with external projects if(NOT lib MATCHES "glsl_fe_link") target_link_libraries(${TARGET_NAME} -Wl,--whole-archive ${lib}) endif() endforeach() target_link_libraries( ${TARGET_NAME} -Wl,--no-whole-archive ) foreach(lib ${EXTERNAL_LIBS_LIST}) target_link_libraries(${TARGET_NAME} ${lib}) endforeach() 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() endif(NOT DEFINED _bs_include_utils)