Skip to content

Commit 2900611

Browse files
committed
LINKER_LANGUAGE CXX for macOS AppleClang with Make
1 parent 9ed50ad commit 2900611

File tree

14 files changed

+32
-16
lines changed

14 files changed

+32
-16
lines changed

CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ set(CMAKE_C_STANDARD 99)
2323
set(CMAKE_CXX_STANDARD 20)
2424
# we use c++20 features in some examples
2525

26+
option(dev "developer mode")
27+
2628
message(STATUS "${PROJECT_NAME} CMake ${CMAKE_VERSION}")
2729

2830
include(cmake/compilers.cmake)

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ ctest --test-dir build
4949

5050
Note the use of CMake target property
5151
[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.
5353

5454
* C main program with Fortran library: `LINKER_LANGUAGE C`
5555
* C++ main program with Fortran library: `LINKER_LANGUAGE CXX`

cmake/abi_check/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ add_library(addtwo OBJECT addtwo.cpp)
1010
target_include_directories(addtwo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
1111

1212
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})
1414

1515
add_test(NAME Fortran_main COMMAND main_f)
1616

cmake/compilers.cmake

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,29 @@ include(CheckIncludeFile)
22
include(CheckSymbolExists)
33
include(CheckIncludeFileCXX)
44

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+
514
# --- abi check: C++ and Fortran compiler ABI compatibility
615

716
block()
817

9-
if(NOT DEFINED abi_compile)
18+
if(dev AND NOT DEFINED abi_compile AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.25)
1019

1120
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+
1328

1429
if(abi_compile)
1530
message(CHECK_PASS "OK")

test/array/CMakeLists.txt

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ add_test(NAME CPP_array COMMAND cxx_f_array)
99
add_library(fortran_array OBJECT array.f90)
1010

1111
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+
1514

1615
add_test(NAME Fortran_CPP_array COMMAND fortran_cpp_array)

test/bool/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ add_test(NAME Cpp_Fortran_bool COMMAND cxx_fortran_bool)
1919

2020
add_executable(fortran_cxx_bool main.f90)
2121
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})
2323
add_test(NAME Fortran_Cpp_bool COMMAND fortran_cxx_bool)
2424

2525
add_executable(fortran_c_bool main.f90)

test/error/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ COMMAND ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:cxx_fortran_error> -Dexp_code=42 -P
2020
add_library(cpp_err OBJECT ${PROJECT_SOURCE_DIR}/src/error/lib.cpp)
2121
add_executable(fortran_cxx_error error_cpp.f90 $<TARGET_OBJECTS:cpp_err>)
2222
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})
2424
endif()
2525
add_test(NAME Fortran_C++_error
2626
COMMAND ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:fortran_cxx_error> -Dexp_code=42 -P ${PROJECT_SOURCE_DIR}/cmake/test_error.cmake

test/exception/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ add_executable(exception_cpp exception.cpp $<TARGET_OBJECTS:raise_exception>)
44
add_test(NAME exception_cpp_invalid_arg COMMAND exception_cpp notnumber)
55

66
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})
88
add_test(NAME exception_fortran_invalid_arg COMMAND ${CMAKE_COMMAND} -E env $<TARGET_FILE:exception_fortran>)
99

1010
set_property(TEST exception_cpp_invalid_arg exception_fortran_invalid_arg

test/iso_fortran_binding/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ endif()
66

77
if(HAVE_C_ALLOC_CHAR)
88
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})
1010
add_test(NAME string_view COMMAND string_view)
1111
endif()
1212

test/iterator/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ target_include_directories(int_iterator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
77
if(NOT (APPLE AND "$ENV{GITHUB_ACTIONS}"))
88
add_executable(int_iterator_fortran main.f90)
99
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})
1111
add_test(NAME IntegerIteratorFortran COMMAND int_iterator_fortran)
1212
endif()
1313

test/pointer/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ add_test(NAME C++_Fortran_pointer COMMAND cxx_fortran_pointer)
2020

2121
add_library(cpp_null OBJECT ${PROJECT_SOURCE_DIR}/src/pointer/null.cpp)
2222
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})
2424
add_test(NAME Fortran_C++_null COMMAND fortran_cxx_null)
2525

2626
# for Visual Studio generator object library

test/sleep/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ add_test(NAME Fortran_c_sleep COMMAND fortran_c_sleep)
1717
add_executable(fortran_cpp_sleep test_sleep.f90)
1818
target_link_libraries(fortran_cpp_sleep PRIVATE cpp_f_sleep)
1919
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})
2121

2222
# reference -- above methods recommended instead
2323
if(WIN32)

test/struct/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ add_test(NAME C++_Fortran_struct COMMAND cxx_fortran_struct)
1818

1919
add_executable(fortran_cxx_struct struct_tx.f90)
2020
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})
2222
add_test(NAME Fortran_C++_struct COMMAND fortran_cxx_struct)
2323

2424
add_library(fortran_derived OBJECT derived.f90)

test/vector/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ ${PROJECT_SOURCE_DIR}/src/vector/lib.cpp
1414
)
1515
add_executable(fortran_cxx_vector vector.f90 $<TARGET_OBJECTS:cpp_vector>)
1616
# 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})
1818
add_test(NAME Fortran_C++_vector COMMAND fortran_cxx_vector)

0 commit comments

Comments
 (0)