Skip to content

Commit d0fb325

Browse files
committed
cmake: objects for AD, MD, SS c-bind shared/static lib builds
Without this approach, errors occur when making the _C_Binding.f90 for static and shared in parallel.
1 parent 92c80cc commit d0fb325

File tree

3 files changed

+42
-24
lines changed

3 files changed

+42
-24
lines changed

modules/aerodyn/CMakeLists.txt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,23 +98,30 @@ add_executable(unsteadyaero_driver
9898
)
9999
target_link_libraries(unsteadyaero_driver basicaerolib lindynlib versioninfolib)
100100

101+
101102
# AeroDyn-InflowWind c-bindings interface library
102-
add_library(aerodyn_inflow_c_binding SHARED
103+
# create object instead of directly linking into shared and static -- causes issues in parallel builds
104+
# This is only required because we are static linking the library for wavetank
105+
# NOTE: target linking at the object, static, and shared libraries. Different CMake versions handle this
106+
# slightly differently with unpredictable results if I don't.
107+
add_library(aerodyn_inflow_c_binding_object OBJECT
103108
src/AeroDyn_Inflow_C_Binding_Types.f90
104109
src/AeroDyn_Inflow_C_Binding.f90
105110
)
106-
target_link_libraries(aerodyn_inflow_c_binding aerodyn_driver_subs versioninfolib)
111+
target_link_libraries(aerodyn_inflow_c_binding_object adilib aerodyn_driver_subs nwtclibs versioninfolib)
112+
set_property(TARGET aerodyn_inflow_c_binding_object PROPERTY POSITION_INDEPENDENT_CODE 1) # required for shared libs
113+
114+
# shared
115+
add_library(aerodyn_inflow_c_binding SHARED $<TARGET_OBJECTS:aerodyn_inflow_c_binding_object>)
116+
target_link_libraries(aerodyn_inflow_c_binding adilib aerodyn_driver_subs nwtclibs versioninfolib)
107117
if(APPLE OR UNIX)
108118
target_compile_definitions(aerodyn_inflow_c_binding PRIVATE IMPLICIT_DLLEXPORT)
109119
endif()
110120

111121
# C-bindings non-shared interface
112122
# This is a workaround for building wavetank into a single DLL (also allows setting CU globaly for sending screen to file for labview integration)
113-
add_library(aerodyn_inflow_c_bind_static STATIC
114-
src/AeroDyn_Inflow_C_Binding_Types.f90
115-
src/AeroDyn_Inflow_C_Binding.f90
116-
)
117-
target_link_libraries(aerodyn_inflow_c_bind_static aerodyn_driver_subs versioninfolib)
123+
add_library(aerodyn_inflow_c_bind_static STATIC $<TARGET_OBJECTS:aerodyn_inflow_c_binding_object>)
124+
target_link_libraries(aerodyn_inflow_c_bind_static adilib aerodyn_driver_subs nwtclibs versioninfolib)
118125
if(APPLE OR UNIX)
119126
target_compile_definitions(aerodyn_inflow_c_bind_static PRIVATE IMPLICIT_DLLEXPORT)
120127
endif()

modules/moordyn/CMakeLists.txt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,25 @@ add_executable(moordyn_driver
3737
target_link_libraries(moordyn_driver moordynlib versioninfolib)
3838

3939
# C-bindings interface library
40-
add_library(moordyn_c_binding SHARED
41-
src/MoorDyn_C_Binding.f90
42-
)
43-
target_link_libraries(moordyn_c_binding moordynlib seastlib versioninfolib)
40+
# create object instead of directly linking into shared and static -- causes issues in parallel builds
41+
# This is only required because we are static linking the library for wavetank
42+
# NOTE: target linking at the object, static, and shared libraries. Different CMake versions handle this
43+
# slightly differently with unpredictable results if I don't.
44+
add_library(moordyn_c_binding_object OBJECT src/MoorDyn_C_Binding.f90)
45+
target_link_libraries(moordyn_c_binding_object moordynlib seastlib nwtclibs versioninfolib)
46+
set_property(TARGET moordyn_c_binding_object PROPERTY POSITION_INDEPENDENT_CODE 1) # required for shared libs
47+
48+
# shared
49+
add_library(moordyn_c_binding SHARED $<TARGET_OBJECTS:moordyn_c_binding_object>)
50+
target_link_libraries(moordyn_c_binding moordynlib seastlib nwtclibs versioninfolib)
4451
if(APPLE OR UNIX)
4552
target_compile_definitions(moordyn_c_binding PRIVATE IMPLICIT_DLLEXPORT)
4653
endif()
4754

4855
# C-bindings non-shared interface
4956
# This is a workaround for building wavetank into a single DLL (also allows setting CU globaly for sending screen to file for labview integration)
50-
add_library(moordyn_c_bind_static STATIC
51-
src/MoorDyn_C_Binding.f90
52-
)
53-
target_link_libraries(moordyn_c_bind_static moordynlib seastlib versioninfolib)
57+
add_library(moordyn_c_bind_static SHARED $<TARGET_OBJECTS:moordyn_c_binding_object>)
58+
target_link_libraries(moordyn_c_bind_static moordynlib seastlib nwtclibs versioninfolib)
5459
if(APPLE OR UNIX)
5560
target_compile_definitions(moordyn_c_bind_static PRIVATE IMPLICIT_DLLEXPORT)
5661
endif()

modules/seastate/CMakeLists.txt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,27 @@ add_library(seastlib STATIC
3939
)
4040
target_link_libraries(seastlib nwtclibs versioninfolib)
4141

42+
4243
# C-bindings interface library
43-
add_library(seastate_c_binding SHARED
44-
src/SeaState_C_Binding.f90
45-
)
46-
target_link_libraries(seastate_c_binding seastlib versioninfolib)
44+
# create object instead of directly linking into shared and static -- causes issues in parallel builds
45+
# This is only required because we are static linking the library for wavetank
46+
# NOTE: target linking at the object, static, and shared libraries. Different CMake versions handle this
47+
# slightly differently with unpredictable results if I don't.
48+
add_library(seastate_c_binding_object OBJECT src/SeaState_C_Binding.f90)
49+
target_link_libraries(seastate_c_binding_object seastlib nwtclibs versioninfolib)
50+
set_property(TARGET seastate_c_binding_object PROPERTY POSITION_INDEPENDENT_CODE 1) # required for shared libs
51+
52+
# shared
53+
add_library(seastate_c_binding SHARED $<TARGET_OBJECTS:seastate_c_binding_object>)
54+
target_link_libraries(seastate_c_binding seastlib nwtclibs versioninfolib)
4755
if(APPLE OR UNIX)
4856
target_compile_definitions(seastate_c_binding PRIVATE IMPLICIT_DLLEXPORT)
4957
endif()
5058

51-
# C-bindings non-shared interface
59+
# C-bindings static interface
5260
# This is a workaround for building wavetank into a single DLL (also allows setting CU globaly for sending screen to file for labview integration)
53-
add_library(seastate_c_bind_static STATIC
54-
src/SeaState_C_Binding.f90
55-
)
56-
target_link_libraries(seastate_c_bind_static seastlib versioninfolib)
61+
add_library(seastate_c_bind_static STATIC $<TARGET_OBJECTS:seastate_c_binding_object>)
62+
target_link_libraries(seastate_c_bind_static seastlib nwtclibs versioninfolib)
5763
if(APPLE OR UNIX)
5864
target_compile_definitions(seastate_c_bind_static PRIVATE IMPLICIT_DLLEXPORT)
5965
endif()

0 commit comments

Comments
 (0)