mirror of
https://github.com/reactos/CMake.git
synced 2024-11-24 03:59:58 +00:00
bd8b733d5e
the main project. I think it doesn't make sense if a project disables RPATH, uses CHECK_C_SOURCE_RUNS() to see if something is able to run, and this succeeds because it has been built with RPATH, but an executable built within the project won't be able to run since it has been built without RPATH. Alex
75 lines
3.3 KiB
CMake
75 lines
3.3 KiB
CMake
# - Check if the source code provided in the SOURCE argument compiles and runs.
|
|
# CHECK_C_SOURCE_RUNS(SOURCE VAR)
|
|
# - macro which checks if the source code runs
|
|
# SOURCE - source code to try to compile
|
|
# VAR - variable to store the result, 1 for success, empty for failure
|
|
#
|
|
# The following variables may be set before calling this macro to
|
|
# modify the way the check is run:
|
|
#
|
|
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
|
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
|
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
|
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
|
|
|
MACRO(CHECK_C_SOURCE_RUNS SOURCE VAR)
|
|
IF("${VAR}" MATCHES "^${VAR}$")
|
|
SET(MACRO_CHECK_FUNCTION_DEFINITIONS
|
|
"-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
|
|
IF(CMAKE_REQUIRED_LIBRARIES)
|
|
SET(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES
|
|
"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
|
|
ELSE(CMAKE_REQUIRED_LIBRARIES)
|
|
SET(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES)
|
|
ENDIF(CMAKE_REQUIRED_LIBRARIES)
|
|
IF(CMAKE_REQUIRED_INCLUDES)
|
|
SET(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES
|
|
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
|
ELSE(CMAKE_REQUIRED_INCLUDES)
|
|
SET(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES)
|
|
ENDIF(CMAKE_REQUIRED_INCLUDES)
|
|
FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c"
|
|
"${SOURCE}\n")
|
|
|
|
MESSAGE(STATUS "Performing Test ${VAR}")
|
|
TRY_RUN(${VAR}_EXITCODE ${VAR}_COMPILED
|
|
${CMAKE_BINARY_DIR}
|
|
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c
|
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
|
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
|
|
-DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
|
|
"${CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}"
|
|
"${CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}"
|
|
COMPILE_OUTPUT_VARIABLE OUTPUT)
|
|
# if it did not compile make the return value fail code of 1
|
|
IF(NOT ${VAR}_COMPILED)
|
|
SET(${VAR}_EXITCODE 1)
|
|
ENDIF(NOT ${VAR}_COMPILED)
|
|
# if the return value was 0 then it worked
|
|
IF("${${VAR}_EXITCODE}" EQUAL 0)
|
|
SET(${VAR} 1 CACHE INTERNAL "Test ${VAR}")
|
|
MESSAGE(STATUS "Performing Test ${VAR} - Success")
|
|
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
|
"Performing C SOURCE FILE Test ${VAR} succeded with the following output:\n"
|
|
"${OUTPUT}\n"
|
|
"Return value: ${${VAR}}\n"
|
|
"Source file was:\n${SOURCE}\n")
|
|
ELSE("${${VAR}_EXITCODE}" EQUAL 0)
|
|
IF(CMAKE_CROSSCOMPILING AND "${${VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN")
|
|
SET(${VAR} "${${VAR}_EXITCODE}")
|
|
ELSE(CMAKE_CROSSCOMPILING AND "${${VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN")
|
|
SET(${VAR} "" CACHE INTERNAL "Test ${VAR}")
|
|
ENDIF(CMAKE_CROSSCOMPILING AND "${${VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN")
|
|
|
|
MESSAGE(STATUS "Performing Test ${VAR} - Failed")
|
|
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
|
"Performing C SOURCE FILE Test ${VAR} failed with the following output:\n"
|
|
"${OUTPUT}\n"
|
|
"Return value: ${${VAR}_EXITCODE}\n"
|
|
"Source file was:\n${SOURCE}\n")
|
|
|
|
ENDIF("${${VAR}_EXITCODE}" EQUAL 0)
|
|
ENDIF("${VAR}" MATCHES "^${VAR}$")
|
|
ENDMACRO(CHECK_C_SOURCE_RUNS)
|
|
|