File tree 14 files changed +32
-16
lines changed
14 files changed +32
-16
lines changed Original file line number Diff line number Diff line change @@ -23,6 +23,8 @@ set(CMAKE_C_STANDARD 99)
23
23
set (CMAKE_CXX_STANDARD 20)
24
24
# we use c++20 features in some examples
25
25
26
+ option (dev "developer mode" )
27
+
26
28
message (STATUS "${PROJECT_NAME} CMake ${CMAKE_VERSION} " )
27
29
28
30
include (cmake/compilers.cmake)
Original file line number Diff line number Diff line change @@ -49,7 +49,7 @@ ctest --test-dir build
49
49
50
50
Note the use of CMake target property
51
51
[ LINKER_LANGUAGE] ( https://cmake.org/cmake/help/latest/prop_tgt/LINKER_LANGUAGE.html )
52
- necessary for CMake with Intel oneAPI on Linux / macOS .
52
+ necessary for CMake with Intel oneAPI or NVIDIA HPC SDK on Linux .
53
53
54
54
* C main program with Fortran library: ` LINKER_LANGUAGE C `
55
55
* C++ main program with Fortran library: ` LINKER_LANGUAGE CXX `
Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ add_library(addtwo OBJECT addtwo.cpp)
10
10
target_include_directories (addtwo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} )
11
11
12
12
add_executable (main_f main.f90 $<TARGET_OBJECTS:addone> $<TARGET_OBJECTS:addtwo>)
13
- set_property (TARGET main_f PROPERTY LINKER_LANGUAGE Fortran )
13
+ set_property (TARGET main_f PROPERTY LINKER_LANGUAGE ${linker_lang} )
14
14
15
15
add_test (NAME Fortran_main COMMAND main_f)
16
16
Original file line number Diff line number Diff line change @@ -2,14 +2,29 @@ include(CheckIncludeFile)
2
2
include (CheckSymbolExists)
3
3
include (CheckIncludeFileCXX)
4
4
5
+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.24 AND CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND CMAKE_GENERATOR STREQUAL "Unix Makefiles" )
6
+ # otherwise failed to link since -lc++ is missing
7
+ set (linker_lang CXX)
8
+ elseif (NOT CMAKE_GENERATOR MATCHES "Visual Studio" )
9
+ # IntelLLVM|NVHPC need Fortran.
10
+ # For other compilers (except as above) don't need it set, but Fortran doesn't hurt.
11
+ set (linker_lang Fortran)
12
+ endif ()
13
+
5
14
# --- abi check: C++ and Fortran compiler ABI compatibility
6
15
7
16
block()
8
17
9
- if (NOT DEFINED abi_compile)
18
+ if (dev AND NOT DEFINED abi_compile AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.25 )
10
19
11
20
message (CHECK_START "checking that C, C++, and Fortran compilers can link" )
12
- try_compile (abi_compile ${CMAKE_CURRENT_BINARY_DIR} /abi_compile ${CMAKE_CURRENT_LIST_DIR} /abi_check abi_check)
21
+
22
+ try_compile (abi_compile
23
+ PROJECT abi_check
24
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} /abi_check
25
+ CMAKE_FLAGS -Dlinker_lang=${linker_lang}
26
+ )
27
+
13
28
14
29
if (abi_compile)
15
30
message (CHECK_PASS "OK" )
Original file line number Diff line number Diff line change @@ -9,8 +9,7 @@ add_test(NAME CPP_array COMMAND cxx_f_array)
9
9
add_library (fortran_array OBJECT array.f90)
10
10
11
11
add_executable (fortran_cpp_array lib.c lib.cpp $<TARGET_OBJECTS:fortran_array>)
12
- if (NOT CMAKE_GENERATOR MATCHES "Visual Studio" )
13
- set_property (TARGET fortran_cpp_array PROPERTY LINKER_LANGUAGE Fortran)
14
- endif ()
12
+ set_property (TARGET fortran_cpp_array PROPERTY LINKER_LANGUAGE ${linker_lang} )
13
+
15
14
16
15
add_test (NAME Fortran_CPP_array COMMAND fortran_cpp_array)
Original file line number Diff line number Diff line change @@ -19,7 +19,7 @@ add_test(NAME Cpp_Fortran_bool COMMAND cxx_fortran_bool)
19
19
20
20
add_executable (fortran_cxx_bool main.f90)
21
21
target_link_libraries (fortran_cxx_bool PRIVATE bool_cxx)
22
- set_property (TARGET fortran_cxx_bool PROPERTY LINKER_LANGUAGE Fortran )
22
+ set_property (TARGET fortran_cxx_bool PROPERTY LINKER_LANGUAGE ${linker_lang} )
23
23
add_test (NAME Fortran_Cpp_bool COMMAND fortran_cxx_bool)
24
24
25
25
add_executable (fortran_c_bool main.f90)
Original file line number Diff line number Diff line change @@ -20,7 +20,7 @@ COMMAND ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:cxx_fortran_error> -Dexp_code=42 -P
20
20
add_library (cpp_err OBJECT ${PROJECT_SOURCE_DIR} /src/error/lib.cpp)
21
21
add_executable (fortran_cxx_error error_cpp.f90 $<TARGET_OBJECTS:cpp_err>)
22
22
if (NOT CMAKE_GENERATOR MATCHES "Visual Studio" )
23
- set_property (TARGET fortran_cxx_error PROPERTY LINKER_LANGUAGE Fortran )
23
+ set_property (TARGET fortran_cxx_error PROPERTY LINKER_LANGUAGE ${linker_lang} )
24
24
endif ()
25
25
add_test (NAME Fortran_C++_error
26
26
COMMAND ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:fortran_cxx_error> -Dexp_code=42 -P ${PROJECT_SOURCE_DIR} /cmake/test_error.cmake
Original file line number Diff line number Diff line change @@ -4,7 +4,7 @@ add_executable(exception_cpp exception.cpp $<TARGET_OBJECTS:raise_exception>)
4
4
add_test (NAME exception_cpp_invalid_arg COMMAND exception_cpp notnumber)
5
5
6
6
add_executable (exception_fortran exception.f90 $<TARGET_OBJECTS:raise_exception>)
7
- set_property (TARGET exception_fortran PROPERTY LINKER_LANGUAGE Fortran )
7
+ set_property (TARGET exception_fortran PROPERTY LINKER_LANGUAGE ${linker_lang} )
8
8
add_test (NAME exception_fortran_invalid_arg COMMAND ${CMAKE_COMMAND} -E env $<TARGET_FILE:exception_fortran>)
9
9
10
10
set_property (TEST exception_cpp_invalid_arg exception_fortran_invalid_arg
Original file line number Diff line number Diff line change 6
6
7
7
if (HAVE_C_ALLOC_CHAR)
8
8
add_executable (string_view string_view.f90 string_view.cpp)
9
- set_property (TARGET string_view PROPERTY LINKER_LANGUAGE Fortran )
9
+ set_property (TARGET string_view PROPERTY LINKER_LANGUAGE ${linker_lang} )
10
10
add_test (NAME string_view COMMAND string_view)
11
11
endif ()
12
12
Original file line number Diff line number Diff line change @@ -7,7 +7,7 @@ target_include_directories(int_iterator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
7
7
if (NOT (APPLE AND "$ENV{GITHUB_ACTIONS} " ))
8
8
add_executable (int_iterator_fortran main.f90)
9
9
target_link_libraries (int_iterator_fortran PRIVATE int_iterator)
10
- set_property (TARGET int_iterator_fortran PROPERTY LINKER_LANGUAGE Fortran )
10
+ set_property (TARGET int_iterator_fortran PROPERTY LINKER_LANGUAGE ${linker_lang} )
11
11
add_test (NAME IntegerIteratorFortran COMMAND int_iterator_fortran)
12
12
endif ()
13
13
Original file line number Diff line number Diff line change @@ -20,7 +20,7 @@ add_test(NAME C++_Fortran_pointer COMMAND cxx_fortran_pointer)
20
20
21
21
add_library (cpp_null OBJECT ${PROJECT_SOURCE_DIR} /src/pointer/null.cpp)
22
22
add_executable (fortran_cxx_null null_c.f90 $<TARGET_OBJECTS:cpp_null>)
23
- set_property (TARGET fortran_cxx_null PROPERTY LINKER_LANGUAGE Fortran )
23
+ set_property (TARGET fortran_cxx_null PROPERTY LINKER_LANGUAGE ${linker_lang} )
24
24
add_test (NAME Fortran_C++_null COMMAND fortran_cxx_null)
25
25
26
26
# for Visual Studio generator object library
Original file line number Diff line number Diff line change @@ -17,7 +17,7 @@ add_test(NAME Fortran_c_sleep COMMAND fortran_c_sleep)
17
17
add_executable (fortran_cpp_sleep test_sleep.f90)
18
18
target_link_libraries (fortran_cpp_sleep PRIVATE cpp_f_sleep)
19
19
add_test (NAME Fortran_cpp_sleep COMMAND fortran_cpp_sleep)
20
- set_property (TARGET fortran_cpp_sleep PROPERTY LINKER_LANGUAGE Fortran )
20
+ set_property (TARGET fortran_cpp_sleep PROPERTY LINKER_LANGUAGE ${linker_lang} )
21
21
22
22
# reference -- above methods recommended instead
23
23
if (WIN32 )
Original file line number Diff line number Diff line change @@ -18,7 +18,7 @@ add_test(NAME C++_Fortran_struct COMMAND cxx_fortran_struct)
18
18
19
19
add_executable (fortran_cxx_struct struct_tx.f90)
20
20
target_link_libraries (fortran_cxx_struct PRIVATE struct_cpp)
21
- set_property (TARGET fortran_cxx_struct PROPERTY LINKER_LANGUAGE Fortran )
21
+ set_property (TARGET fortran_cxx_struct PROPERTY LINKER_LANGUAGE ${linker_lang} )
22
22
add_test (NAME Fortran_C++_struct COMMAND fortran_cxx_struct)
23
23
24
24
add_library (fortran_derived OBJECT derived.f90)
Original file line number Diff line number Diff line change @@ -14,5 +14,5 @@ ${PROJECT_SOURCE_DIR}/src/vector/lib.cpp
14
14
)
15
15
add_executable (fortran_cxx_vector vector.f90 $<TARGET_OBJECTS:cpp_vector>)
16
16
# LINKER_LANGUAGE needed for Linux oneAPI
17
- set_property (TARGET fortran_cxx_vector PROPERTY LINKER_LANGUAGE Fortran )
17
+ set_property (TARGET fortran_cxx_vector PROPERTY LINKER_LANGUAGE ${linker_lang} )
18
18
add_test (NAME Fortran_C++_vector COMMAND fortran_cxx_vector)
You can’t perform that action at this time.
0 commit comments