Merge topic 'Threads-CXX'
fff9434d FindThreads: officially announce it works with only C++ enabled 66db914a FindThreads: fix printing a pointer value in test code 0b38424c FindThreads: make the call to try_run() work also if only C++ is enabled 9924a212 FindThreads: replace CheckIncludeFiles by CheckIncludeFile a27bc0cc Check(Function|Library|Symbol)Exists: make it work if only C++ is enabled 7279f293 FindThreads: add simple testcase
This commit is contained in:
commit
910ea21004
6
Help/release/dev/Threads-CXX.rst
Normal file
6
Help/release/dev/Threads-CXX.rst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Threads-CXX
|
||||||
|
------------
|
||||||
|
|
||||||
|
* The :module:`CheckFunctionExists`, :module:`CheckLibraryExists`,
|
||||||
|
:module:`CheckSymbolExists`, and :module:`FindThreads` modules learned to
|
||||||
|
work in environments where only CXX is enabled.
|
@ -31,7 +31,7 @@ void* runner(void* args)
|
|||||||
int cc;
|
int cc;
|
||||||
for ( cc = 0; cc < 10; cc ++ )
|
for ( cc = 0; cc < 10; cc ++ )
|
||||||
{
|
{
|
||||||
printf("%d CC: %d\n", (int)args, cc);
|
printf("%p CC: %d\n", args, cc);
|
||||||
}
|
}
|
||||||
res ++;
|
res ++;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#ifdef CHECK_FUNCTION_EXISTS
|
#ifdef CHECK_FUNCTION_EXISTS
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
char CHECK_FUNCTION_EXISTS();
|
char CHECK_FUNCTION_EXISTS();
|
||||||
#ifdef __CLASSIC_C__
|
#ifdef __CLASSIC_C__
|
||||||
int main(){
|
int main(){
|
||||||
|
@ -57,14 +57,26 @@ macro(CHECK_FUNCTION_EXISTS FUNCTION VARIABLE)
|
|||||||
else()
|
else()
|
||||||
set(CHECK_FUNCTION_EXISTS_ADD_INCLUDES)
|
set(CHECK_FUNCTION_EXISTS_ADD_INCLUDES)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
set(_cfe_source ${CMAKE_ROOT}/Modules/CheckFunctionExists.c)
|
||||||
|
elseif(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
set(_cfe_source ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckFunctionExists/CheckFunctionExists.cxx)
|
||||||
|
configure_file(${CMAKE_ROOT}/Modules/CheckFunctionExists.c "${_cfe_source}" COPYONLY)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "CHECK_FUNCTION_EXISTS needs either C or CXX language enabled")
|
||||||
|
endif()
|
||||||
|
|
||||||
try_compile(${VARIABLE}
|
try_compile(${VARIABLE}
|
||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
${CMAKE_ROOT}/Modules/CheckFunctionExists.c
|
${_cfe_source}
|
||||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||||
${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}
|
${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}
|
||||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
|
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
|
||||||
"${CHECK_FUNCTION_EXISTS_ADD_INCLUDES}"
|
"${CHECK_FUNCTION_EXISTS_ADD_INCLUDES}"
|
||||||
OUTPUT_VARIABLE OUTPUT)
|
OUTPUT_VARIABLE OUTPUT)
|
||||||
|
unset(_cfe_source)
|
||||||
|
|
||||||
if(${VARIABLE})
|
if(${VARIABLE})
|
||||||
set(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION}")
|
set(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION}")
|
||||||
if(NOT CMAKE_REQUIRED_QUIET)
|
if(NOT CMAKE_REQUIRED_QUIET)
|
||||||
|
@ -53,15 +53,26 @@ macro(CHECK_LIBRARY_EXISTS LIBRARY FUNCTION LOCATION VARIABLE)
|
|||||||
set(CHECK_LIBRARY_EXISTS_LIBRARIES
|
set(CHECK_LIBRARY_EXISTS_LIBRARIES
|
||||||
${CHECK_LIBRARY_EXISTS_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES})
|
${CHECK_LIBRARY_EXISTS_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
set(_cle_source ${CMAKE_ROOT}/Modules/CheckFunctionExists.c)
|
||||||
|
elseif(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
set(_cle_source ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckLibraryExists/CheckFunctionExists.cxx)
|
||||||
|
configure_file(${CMAKE_ROOT}/Modules/CheckFunctionExists.c "${_cle_source}" COPYONLY)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "CHECK_FUNCTION_EXISTS needs either C or CXX language enabled")
|
||||||
|
endif()
|
||||||
|
|
||||||
try_compile(${VARIABLE}
|
try_compile(${VARIABLE}
|
||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
${CMAKE_ROOT}/Modules/CheckFunctionExists.c
|
${_cle_source}
|
||||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||||
LINK_LIBRARIES ${CHECK_LIBRARY_EXISTS_LIBRARIES}
|
LINK_LIBRARIES ${CHECK_LIBRARY_EXISTS_LIBRARIES}
|
||||||
CMAKE_FLAGS
|
CMAKE_FLAGS
|
||||||
-DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION}
|
-DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION}
|
||||||
-DLINK_DIRECTORIES:STRING=${LOCATION}
|
-DLINK_DIRECTORIES:STRING=${LOCATION}
|
||||||
OUTPUT_VARIABLE OUTPUT)
|
OUTPUT_VARIABLE OUTPUT)
|
||||||
|
unset(_cle_source)
|
||||||
|
|
||||||
if(${VARIABLE})
|
if(${VARIABLE})
|
||||||
if(NOT CMAKE_REQUIRED_QUIET)
|
if(NOT CMAKE_REQUIRED_QUIET)
|
||||||
|
@ -44,10 +44,14 @@
|
|||||||
# (To distribute this file outside of CMake, substitute the full
|
# (To distribute this file outside of CMake, substitute the full
|
||||||
# License text for the above reference.)
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
macro(CHECK_SYMBOL_EXISTS SYMBOL FILES VARIABLE)
|
macro(CHECK_SYMBOL_EXISTS SYMBOL FILES VARIABLE)
|
||||||
_CHECK_SYMBOL_EXISTS("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c" "${SYMBOL}" "${FILES}" "${VARIABLE}" )
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
_CHECK_SYMBOL_EXISTS("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c" "${SYMBOL}" "${FILES}" "${VARIABLE}" )
|
||||||
|
elseif(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
_CHECK_SYMBOL_EXISTS("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.cxx" "${SYMBOL}" "${FILES}" "${VARIABLE}" )
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "CHECK_SYMBOL_EXISTS needs either C or CXX language enabled")
|
||||||
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
macro(_CHECK_SYMBOL_EXISTS SOURCEFILE SYMBOL FILES VARIABLE)
|
macro(_CHECK_SYMBOL_EXISTS SOURCEFILE SYMBOL FILES VARIABLE)
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
# Copyright 2002-2009 Kitware, Inc.
|
# Copyright 2002-2009 Kitware, Inc.
|
||||||
# Copyright 2011-2014 Rolf Eike Beer <eike@sf-mail.de>
|
# Copyright 2011-2015 Rolf Eike Beer <eike@sf-mail.de>
|
||||||
#
|
#
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
# see accompanying file Copyright.txt for details.
|
# see accompanying file Copyright.txt for details.
|
||||||
@ -51,15 +51,23 @@
|
|||||||
# (To distribute this file outside of CMake, substitute the full
|
# (To distribute this file outside of CMake, substitute the full
|
||||||
# License text for the above reference.)
|
# License text for the above reference.)
|
||||||
|
|
||||||
include (CheckIncludeFiles)
|
|
||||||
include (CheckLibraryExists)
|
include (CheckLibraryExists)
|
||||||
include (CheckSymbolExists)
|
include (CheckSymbolExists)
|
||||||
set(Threads_FOUND FALSE)
|
set(Threads_FOUND FALSE)
|
||||||
set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
|
set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
|
||||||
set(CMAKE_REQUIRED_QUIET ${Threads_FIND_QUIETLY})
|
set(CMAKE_REQUIRED_QUIET ${Threads_FIND_QUIETLY})
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
include (CheckIncludeFile)
|
||||||
|
elseif(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
include (CheckIncludeFileCXX)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "FindThreads only works if either C or CXX language is enabled")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Do we have sproc?
|
# Do we have sproc?
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES IRIX AND NOT CMAKE_THREAD_PREFER_PTHREAD)
|
if(CMAKE_SYSTEM_NAME MATCHES IRIX AND NOT CMAKE_THREAD_PREFER_PTHREAD)
|
||||||
|
include (CheckIncludeFiles)
|
||||||
CHECK_INCLUDE_FILES("sys/types.h;sys/prctl.h" CMAKE_HAVE_SPROC_H)
|
CHECK_INCLUDE_FILES("sys/types.h;sys/prctl.h" CMAKE_HAVE_SPROC_H)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -83,11 +91,18 @@ macro(_check_pthreads_flag)
|
|||||||
# If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
|
# If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
|
||||||
if(NOT DEFINED THREADS_HAVE_PTHREAD_ARG)
|
if(NOT DEFINED THREADS_HAVE_PTHREAD_ARG)
|
||||||
message(STATUS "Check if compiler accepts -pthread")
|
message(STATUS "Check if compiler accepts -pthread")
|
||||||
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
set(_threads_src ${CMAKE_CURRENT_LIST_DIR}/CheckForPthreads.c)
|
||||||
|
elseif(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
set(_threads_src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindThreads/CheckForPthreads.cxx)
|
||||||
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/CheckForPthreads.c "${_threads_src}" COPYONLY)
|
||||||
|
endif()
|
||||||
try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
|
try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
|
||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
${CMAKE_CURRENT_LIST_DIR}/CheckForPthreads.c
|
${_threads_src}
|
||||||
CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
|
CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
|
||||||
COMPILE_OUTPUT_VARIABLE OUTPUT)
|
COMPILE_OUTPUT_VARIABLE OUTPUT)
|
||||||
|
unset(_threads_src)
|
||||||
|
|
||||||
if(THREADS_HAVE_PTHREAD_ARG)
|
if(THREADS_HAVE_PTHREAD_ARG)
|
||||||
if(THREADS_PTHREAD_ARG STREQUAL "2")
|
if(THREADS_PTHREAD_ARG STREQUAL "2")
|
||||||
@ -120,7 +135,11 @@ if(CMAKE_HAVE_SPROC_H AND NOT CMAKE_THREAD_PREFER_PTHREAD)
|
|||||||
set(CMAKE_USE_SPROC_INIT 1)
|
set(CMAKE_USE_SPROC_INIT 1)
|
||||||
else()
|
else()
|
||||||
# Do we have pthreads?
|
# Do we have pthreads?
|
||||||
CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H)
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
CHECK_INCLUDE_FILE("pthread.h" CMAKE_HAVE_PTHREAD_H)
|
||||||
|
else()
|
||||||
|
CHECK_INCLUDE_FILE_CXX("pthread.h" CMAKE_HAVE_PTHREAD_H)
|
||||||
|
endif()
|
||||||
if(CMAKE_HAVE_PTHREAD_H)
|
if(CMAKE_HAVE_PTHREAD_H)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1365,6 +1365,8 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
|
|||||||
add_subdirectory(FindOpenSSL)
|
add_subdirectory(FindOpenSSL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(FindThreads)
|
||||||
|
|
||||||
# Matlab module
|
# Matlab module
|
||||||
if(CMake_TEST_FindMatlab)
|
if(CMake_TEST_FindMatlab)
|
||||||
ADD_TEST_MACRO(FindMatlab.basic_checks ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>)
|
ADD_TEST_MACRO(FindMatlab.basic_checks ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>)
|
||||||
|
10
Tests/FindThreads/C-only/CMakeLists.txt
Normal file
10
Tests/FindThreads/C-only/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
|
||||||
|
project(FindThreads_C-only C)
|
||||||
|
|
||||||
|
set(CMAKE_THREAD_PREFER_PTHREAD On)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
if (NOT WIN32)
|
||||||
|
add_executable(thr ${CMAKE_CURRENT_SOURCE_DIR}/../../../Modules/CheckForPthreads.c)
|
||||||
|
target_link_libraries(thr Threads::Threads)
|
||||||
|
endif ()
|
11
Tests/FindThreads/CMakeLists.txt
Normal file
11
Tests/FindThreads/CMakeLists.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
foreach (_lang IN ITEMS C CXX)
|
||||||
|
add_test(NAME FindThreads.${_lang}-only COMMAND ${CMAKE_CTEST_COMMAND}
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindThreads/${_lang}-only"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindThreads/${_lang}-only"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project FindThreads_${_lang}-only
|
||||||
|
--build-options ${build_options}
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V
|
||||||
|
)
|
||||||
|
endforeach ()
|
13
Tests/FindThreads/CXX-only/CMakeLists.txt
Normal file
13
Tests/FindThreads/CXX-only/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
|
||||||
|
project(FindThreads_CXX-only CXX)
|
||||||
|
|
||||||
|
set(CMAKE_THREAD_PREFER_PTHREAD On)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../../../Modules/CheckForPthreads.c
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/CheckForPthreads.cxx)
|
||||||
|
|
||||||
|
if (NOT WIN32)
|
||||||
|
add_executable(thr ${CMAKE_CURRENT_BINARY_DIR}/CheckForPthreads.cxx)
|
||||||
|
target_link_libraries(thr Threads::Threads)
|
||||||
|
endif ()
|
Loading…
x
Reference in New Issue
Block a user