diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d1d3dd61a..1839225aed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,9 +19,12 @@ project(OpenFAST CXX C Fortran) include(${CMAKE_SOURCE_DIR}/cmake/OpenfastCmakeUtils.cmake) include(${CMAKE_SOURCE_DIR}/cmake/OpenfastFortranOptions.cmake) +include (FindPackageHandleStandardArgs) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") +set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_SOURCE_DIR}/build/ftnmods) + # CMake Configuration variables if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING @@ -38,6 +41,7 @@ option(ORCA_DLL_LOAD "Enable OrcaFlex Library Load" on) option(BUILD_OPENFAST_CPP_API "Enable building OpenFAST - C++ API" off) option(BUILD_FASTFARM "Enable building FAST.Farm" off) option(OPENMP "Enable OpenMP support" off) +option(USE_LOCAL_STATIC_LAPACK "Enable downloading and building static LAPACK and BLAS libs" off) if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # Configure the default install path to openfast/install set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install" CACHE PATH "OpenFAST install directory" FORCE) @@ -107,10 +111,33 @@ if (MKL_FOUND) set(BLAS_LIBRARIES ${MKL_LIBRARIES}) set(LAPACK_LIBRARIES ${MKL_LIBRARIES}) set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES "ifport;ifcore;imf;svml;m;ipgo;intlc;c;irc_s;dl;c") -else() - find_package(BLAS REQUIRED) - find_package(LAPACK REQUIRED) -endif() +else(MKL_FOUND) + if (USE_LOCAL_STATIC_LAPACK) + + message(STATUS "--> Reference LAPACK and BLAS will be downloaded and build as static libraries for linking with openfast") + include(ExternalProject) + ExternalProject_Add( + lapack + URL http://www.netlib.org/lapack/lapack.tgz + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_SOURCE_DIR}/install + PREFIX ${CMAKE_BINARY_DIR}/dependencies + ) + if (UNIX) + set(LAPACK_LIBRARIES ${CMAKE_BINARY_DIR}/dependencies/src/lapack-build/lib/liblapack.a ${CMAKE_BINARY_DIR}/dependencies/src/lapack-build/lib/libblas.a CACHE STRING "LAPACK library" FORCE) + else (UNIX) # On Windows + set(LAPACK_LIBRARIES ${CMAKE_BINARY_DIR}/dependencies/src/lapack-build/libliblapack.lib ${CMAKE_BINARY_DIR}/dependencies/src/lapack-build/lib/libblas.lib CACHE STRING "LAPACK library" FORCE) + endif (UNIX) + + install(FILES ${LAPACK_LIBRARIES} DESTINATION ${CMAKE_SOURCE_DIR}/install/lib) + + else(USE_LOCAL_STATIC_LAPACK) + + find_package(BLAS REQUIRED) + find_package(LAPACK REQUIRED) + + endif(USE_LOCAL_STATIC_LAPACK) + +endif(MKL_FOUND) # Set the RPATH after configuring the install prefix include(${CMAKE_SOURCE_DIR}/cmake/set_rpath.cmake) @@ -210,3 +237,4 @@ option(BUILD_DOCUMENTATION "Build documentation." OFF) if(BUILD_DOCUMENTATION) add_subdirectory(docs) endif() + diff --git a/glue-codes/openfast-cpp/CMakeLists.txt b/glue-codes/openfast-cpp/CMakeLists.txt index c08ebe66fc..50d318e669 100644 --- a/glue-codes/openfast-cpp/CMakeLists.txt +++ b/glue-codes/openfast-cpp/CMakeLists.txt @@ -18,6 +18,8 @@ if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") cmake_policy(SET CMP0074 NEW) endif() +enable_language(CXX Fortran) + set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -38,26 +40,108 @@ include_directories(${CMAKE_BINARY_DIR}/modules/supercontroller/) include_directories(${MPI_INCLUDE_PATH}) add_library(openfastcpplib - src/OpenFAST.cpp src/SC.cpp) + src/OpenFAST.cpp + src/SC.cpp + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ +) + set_property(TARGET openfastcpplib PROPERTY POSITION_INDEPENDENT_CODE ON) + +# note the use of ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}. This is to ensure the compiler +# links to the required fortran libraries (e.g. libgfortran). Because the library is +# entirely made up of objects cmake cannot reliably detect that it is a fortran library +# and must be informed of the correct libraries to link to or else there can be undefined +# symbol errors target_link_libraries(openfastcpplib - openfastlib + openfastlib_common_obj + openfast_prelib_obj + maplib_obj + mapcpplib_obj + nwtcbaselib_obj + nwtcsyslib_obj + nwtclibs_obj + ifwlib_obj + fvwlib_obj + uaaerolib_obj + afinfolib_obj + aeroacoustics_obj + aerodynlib_obj + aerodyn14lib_obj + servodynlib_obj + elastodynlib_obj + beamdynlib_obj + subdynlib_obj + hydrodynlib_obj + orcaflexlib_obj + extptfm_mckflib_obj + openfoamtypeslib_obj + foamfastlib_obj + scdataextypeslib_obj + scdataexlib_obj + feamlib_obj + moordynlib_obj + icedynlib_obj + icefloelib_obj + openfast_postlib_obj + versioninfolib_obj ${HDF5_C_LIBRARIES} ${HDF5_HL_LIBRARIES} ${ZLIB_LIBRARIES} ${LIBXML2_LIBRARIES} ${MPI_LIBRARIES} - ${CMAKE_DL_LIBS}) + ${CMAKE_DL_LIBS} + ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES} +) add_executable(openfastcpp src/FAST_Prog.cpp) -target_link_libraries(openfastcpp openfastcpplib openfastlib +target_link_libraries(openfastcpp + openfastcpplib ${MPI_LIBRARIES} ${YAML_CPP_LIBRARIES} ${HDF5_C_LIBRARIES} ${HDF5_HL_LIBRARIES} ${ZLIB_LIBRARIES} ${LIBXML2_LIBRARIES} - ${CMAKE_DL_LIBS}) + ${CMAKE_DL_LIBS} +) + +if (OPENMP) + find_package(OpenMP) + if(OpenMP_CXX_FOUND) + target_link_libraries(openfastcpplib OpenMP::OpenMP_CXX) + target_link_libraries(openfastcpp OpenMP::OpenMP_CXX) + endif() +endif(OPENMP) if(MPI_COMPILE_FLAGS) set_target_properties(openfastcpp PROPERTIES diff --git a/glue-codes/openfast/CMakeLists.txt b/glue-codes/openfast/CMakeLists.txt index 5fe7c78227..15f28f7214 100644 --- a/glue-codes/openfast/CMakeLists.txt +++ b/glue-codes/openfast/CMakeLists.txt @@ -23,8 +23,54 @@ set_property(TARGET openfast PROPERTY LINKER_LANGUAGE Fortran) include_directories(${CMAKE_SOURCE_DIR}/modules/openfast-library/src/) include_directories(${CMAKE_BINARY_DIR}/modules/openfoam/) include_directories(${CMAKE_BINARY_DIR}/modules/supercontroller/) -add_executable(openfast_cpp src/FAST_Prog.cpp src/FastLibAPI.cpp) -target_link_libraries(openfast_cpp openfastlib) + +add_executable(openfast_cpp src/FAST_Prog.cpp src/FastLibAPI.cpp + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ +) + +set_property(TARGET openfast_cpp PROPERTY LINKER_LANGUAGE CXX) + +target_link_libraries(openfast_cpp +${LAPACK_LIBRARIES} +${CMAKE_DL_LIBS} +) + +if (OPENMP) + find_package(OpenMP) + if(OpenMP_CXX_FOUND) + target_link_libraries(openfast_cpp OpenMP::OpenMP_CXX) + endif() +endif(OPENMP) string(TOUPPER ${CMAKE_Fortran_COMPILER_ID} _compiler_id) if (${_compiler_id} STREQUAL "GNU" AND NOT ${VARIABLE_TRACKING}) diff --git a/glue-codes/simulink/src/create_FAST_SFunc.m b/glue-codes/simulink/src/create_FAST_SFunc.m index e6f1144b17..9d3291b536 100644 --- a/glue-codes/simulink/src/create_FAST_SFunc.m +++ b/glue-codes/simulink/src/create_FAST_SFunc.m @@ -14,7 +14,7 @@ mexname = 'FAST_SFunc'; % base name of the resulting mex file -built_with_visualStudio = true; %if the libraries were built with cmake, set to false +built_with_visualStudio = false; %if the libraries were built with cmake, set to false if (ispc && built_with_visualStudio) @@ -47,12 +47,12 @@ % If there are shared libraries does it work for outDir to be the local directory? else installDir = '../../../install'; - outDir = fullfile(installDir, 'lib'); + outDir = '.'; end libDir = fullfile(installDir, 'lib'); includeDir = fullfile(installDir, 'include'); - libName = 'openfastlib'; + libName = 'openfastlib_mex'; end %% BUILD COMMAND @@ -76,9 +76,14 @@ else % mac/unix mex('-largeArrayDims', ... - '-v', ... %add this line for "verbose" output (for debugging) + ... '-v', ... %add this line for "verbose" output (for debugging) ['-L', libDir], ... ['-l', libName], ... + '-lgfortran', ... + '-lquadmath', ... + '-llapack', ... + '-lblas', ... + '-ldl', ... ['-I', includeDir], ... '-outdir', outDir, ... ['CFLAGS=$CFLAGS -DS_FUNCTION_NAME=' mexname], ... diff --git a/modules/aerodyn/CMakeLists.txt b/modules/aerodyn/CMakeLists.txt index 4d88c7ea1a..291c90f6be 100644 --- a/modules/aerodyn/CMakeLists.txt +++ b/modules/aerodyn/CMakeLists.txt @@ -80,23 +80,39 @@ set(ADI_LIB_SOURCES ) # UnsteadyAero lib -add_library(uaaerolib ${UA_LIBS_SOURCES}) +add_library(uaaerolib_obj OBJECT ${UA_LIBS_SOURCES}) +target_link_libraries(uaaerolib_obj afinfolib_obj nwtclibs_obj) + +add_library(uaaerolib $) target_link_libraries(uaaerolib afinfolib nwtclibs) # AirfoilInfo lib -add_library(afinfolib ${AFINFO_LIBS_SOURCES}) +add_library(afinfolib_obj OBJECT ${AFINFO_LIBS_SOURCES}) +target_link_libraries(afinfolib_obj nwtclibs_obj) + +add_library(afinfolib $) target_link_libraries(afinfolib nwtclibs) # this lib is only for the ctest -add_library(fvwlib ${FVW_LIBS_SOURCES}) +add_library(fvwlib_obj OBJECT ${FVW_LIBS_SOURCES}) +target_link_libraries(fvwlib_obj uaaerolib_obj afinfolib_obj nwtclibs_obj) + +add_library(fvwlib $) target_link_libraries(fvwlib uaaerolib afinfolib nwtclibs) # Aero acoustics -add_library(aeroacoustics ${AEROACOUSTIC_SOURCES}) +add_library(aeroacoustics_obj OBJECT ${AEROACOUSTIC_SOURCES}) +target_link_libraries(aeroacoustics_obj afinfolib_obj nwtclibs_obj) + +add_library(aeroacoustics $) target_link_libraries(aeroacoustics afinfolib nwtclibs) -add_library(aerodynlib ${AD_LIBS_SOURCES}) -target_link_libraries(aerodynlib fvwlib uaaerolib afinfolib nwtclibs aeroacoustics) + +add_library(aerodynlib_obj OBJECT ${AD_LIBS_SOURCES}) +target_link_libraries(aerodynlib_obj uaaerolib_obj afinfolib_obj fvwlib_obj aeroacoustics_obj nwtclibs_obj) + +add_library(aerodynlib $ $ $ $ $) +target_link_libraries(aerodynlib nwtclibs) # ADI lib add_library(adilib ${ADI_LIB_SOURCES}) @@ -133,7 +149,7 @@ if(APPLE OR UNIX) endif() -install(TARGETS unsteadyaero_driver aerodyn_driver adilib aerodynlib fvwlib uaaerolib afinfolib aeroacoustics aerodyn_inflow_c_binding +install(TARGETS unsteadyaero_driver aerodyn_driver adilib aerodynlib fvwlib uaaerolib afinfolib aeroacoustics aerodyn_inflow_c_binding aerodynlib_obj fvwlib_obj uaaerolib_obj afinfolib_obj aeroacoustics_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/aerodyn14/CMakeLists.txt b/modules/aerodyn14/CMakeLists.txt index 58741a9281..f455acc6fd 100644 --- a/modules/aerodyn14/CMakeLists.txt +++ b/modules/aerodyn14/CMakeLists.txt @@ -29,10 +29,13 @@ set(AD14_LIBS_SOURCES src/DWM_Types.f90 ) -add_library(aerodyn14lib ${AD14_LIBS_SOURCES}) +add_library(aerodyn14lib_obj OBJECT ${AD14_LIBS_SOURCES}) +target_link_libraries(aerodyn14lib_obj ifwlib_obj nwtclibs_obj) + +add_library(aerodyn14lib $) target_link_libraries(aerodyn14lib ifwlib nwtclibs) -install(TARGETS aerodyn14lib +install(TARGETS aerodyn14lib aerodyn14lib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/beamdyn/CMakeLists.txt b/modules/beamdyn/CMakeLists.txt index dae656b088..45ee2b9426 100644 --- a/modules/beamdyn/CMakeLists.txt +++ b/modules/beamdyn/CMakeLists.txt @@ -26,10 +26,13 @@ set(BD_SOURCES src/BeamDyn_Types.f90 ) -add_library(beamdynlib ${BD_SOURCES}) +add_library(beamdynlib_obj OBJECT ${BD_SOURCES}) +target_link_libraries(beamdynlib_obj nwtclibs_obj) + +add_library(beamdynlib $) target_link_libraries(beamdynlib nwtclibs) -install(TARGETS beamdynlib +install(TARGETS beamdynlib beamdynlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib @@ -42,7 +45,7 @@ set(BD_DRIVER_SOURCES add_executable(beamdyn_driver ${BD_DRIVER_SOURCES}) target_link_libraries(beamdyn_driver beamdynlib nwtclibs versioninfolib ${CMAKE_DL_LIBS}) -install(TARGETS beamdyn_driver +install(TARGETS beamdyn_driver RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) diff --git a/modules/elastodyn/CMakeLists.txt b/modules/elastodyn/CMakeLists.txt index 5610748e9c..a5ecccde58 100644 --- a/modules/elastodyn/CMakeLists.txt +++ b/modules/elastodyn/CMakeLists.txt @@ -26,10 +26,13 @@ set(ED_SOURCES src/ElastoDyn_Types.f90 ) -add_library(elastodynlib ${ED_SOURCES}) +add_library(elastodynlib_obj OBJECT ${ED_SOURCES}) +target_link_libraries(elastodynlib_obj servodynlib_obj nwtclibs_obj) + +add_library(elastodynlib $) target_link_libraries(elastodynlib servodynlib nwtclibs) -install(TARGETS elastodynlib +install(TARGETS elastodynlib elastodynlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/extptfm/CMakeLists.txt b/modules/extptfm/CMakeLists.txt index 384212ab1d..068e5078d3 100644 --- a/modules/extptfm/CMakeLists.txt +++ b/modules/extptfm/CMakeLists.txt @@ -18,15 +18,19 @@ if (GENERATE_TYPES) generate_f90_types(src/ExtPtfm_MCKF_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/ExtPtfm_MCKF_Types.f90) endif() -add_library(extptfm_mckflib +set(EXTPTFM_SOURCES src/ExtPtfm_MCKF.f90 src/ExtPtfm_MCKF_IO.f90 src/ExtPtfm_MCKF_Types.f90 ) +add_library(extptfm_mckflib_obj OBJECT ${EXTPTFM_SOURCES}) +target_link_libraries(extptfm_mckflib_obj nwtclibs_obj) + +add_library(extptfm_mckflib $) target_link_libraries(extptfm_mckflib nwtclibs) -install(TARGETS extptfm_mckflib +install(TARGETS extptfm_mckflib extptfm_mckflib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/feamooring/CMakeLists.txt b/modules/feamooring/CMakeLists.txt index 42411802d3..ff5380e49a 100644 --- a/modules/feamooring/CMakeLists.txt +++ b/modules/feamooring/CMakeLists.txt @@ -23,10 +23,13 @@ set(FEAM_LIBS_SOURCES src/FEAMooring_Types.f90 ) -add_library(feamlib ${FEAM_LIBS_SOURCES}) +add_library(feamlib_obj OBJECT ${FEAM_LIBS_SOURCES}) +target_link_libraries(feamlib_obj nwtclibs_obj) + +add_library(feamlib $) target_link_libraries(feamlib nwtclibs) -install(TARGETS feamlib +install(TARGETS feamlib feamlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION lib ARCHIVE DESTINATION lib diff --git a/modules/hydrodyn/CMakeLists.txt b/modules/hydrodyn/CMakeLists.txt index 1c44d66919..94cca4a15c 100644 --- a/modules/hydrodyn/CMakeLists.txt +++ b/modules/hydrodyn/CMakeLists.txt @@ -56,7 +56,10 @@ set(HYDRODYN_SOURCES src/Waves2_Types.f90 ) -add_library(hydrodynlib ${HYDRODYN_SOURCES}) +add_library(hydrodynlib_obj OBJECT ${HYDRODYN_SOURCES}) +target_link_libraries(hydrodynlib_obj nwtclibs_obj) + +add_library(hydrodynlib $) target_link_libraries(hydrodynlib nwtclibs) # c-bindings interface library @@ -73,7 +76,7 @@ target_link_libraries(hydrodyn_driver hydrodynlib nwtclibs versioninfolib) # src/SS_Radiation_DriverCode.f90) #target_link_libraries(ss_radiation hydrodynlib nwtclibs) -install(TARGETS hydrodynlib hydrodyn_driver hydrodyn_c_binding +install(TARGETS hydrodynlib hydrodyn_driver hydrodyn_c_binding hydrodynlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/icedyn/CMakeLists.txt b/modules/icedyn/CMakeLists.txt index af328a1a21..f5ad693815 100644 --- a/modules/icedyn/CMakeLists.txt +++ b/modules/icedyn/CMakeLists.txt @@ -18,14 +18,18 @@ if (GENERATE_TYPES) generate_f90_types(src/Registry_IceDyn.txt ${CMAKE_CURRENT_LIST_DIR}/src/IceDyn_Types.f90) endif() -add_library(icedynlib +set(ICEDYN_SOURCES src/IceDyn.f90 src/IceDyn_Types.f90 ) +add_library(icedynlib_obj OBJECT ${ICEDYN_SOURCES}) +target_link_libraries(icedynlib_obj nwtclibs_obj) + +add_library(icedynlib $) target_link_libraries(icedynlib nwtclibs) -install(TARGETS icedynlib +install(TARGETS icedynlib icedynlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION lib ARCHIVE DESTINATION lib diff --git a/modules/icefloe/CMakeLists.txt b/modules/icefloe/CMakeLists.txt index 12fc293ac0..090a089ea6 100644 --- a/modules/icefloe/CMakeLists.txt +++ b/modules/icefloe/CMakeLists.txt @@ -37,10 +37,13 @@ set(ICEFLOE_LIBS_SOURCES src/icefloe/IceFloe_Types.f90 ) -add_library(icefloelib ${ICEFLOE_LIBS_SOURCES}) +add_library(icefloelib_obj OBJECT ${ICEFLOE_LIBS_SOURCES}) +target_link_libraries(icefloelib_obj nwtclibs_obj) + +add_library(icefloelib $) target_link_libraries(icefloelib nwtclibs versioninfolib) -install(TARGETS icefloelib +install(TARGETS icefloelib icefloelib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION lib ARCHIVE DESTINATION lib diff --git a/modules/inflowwind/CMakeLists.txt b/modules/inflowwind/CMakeLists.txt index 58168790fe..3584020202 100644 --- a/modules/inflowwind/CMakeLists.txt +++ b/modules/inflowwind/CMakeLists.txt @@ -48,12 +48,16 @@ set(IFW_SOURCES src/Lidar_Types.f90 ) -add_library(ifwlib ${IFW_SOURCES}) +add_library(ifwlib_obj OBJECT ${IFW_SOURCES}) +target_link_libraries(ifwlib_obj nwtclibs_obj) + +add_library(ifwlib $) target_link_libraries(ifwlib nwtclibs) # C-bound interface library -add_library(ifw_c_binding SHARED src/IfW_C_Binding.f90) -target_link_libraries(ifw_c_binding ifwlib versioninfolib ${CMAKE_DL_LIBS}) +add_library(ifw_c_binding SHARED src/IfW_C_Binding.f90 $) +target_link_libraries(ifw_c_binding nwtclibs versioninfolib ${CMAKE_DL_LIBS}) + if(APPLE OR UNIX) target_compile_definitions(ifw_c_binding PUBLIC -DIMPLICIT_DLLEXPORT) endif() @@ -67,7 +71,7 @@ set(IFW_DRIVER_SOURCES add_executable(inflowwind_driver ${IFW_DRIVER_SOURCES}) target_link_libraries(inflowwind_driver ifwlib versioninfolib ${CMAKE_DL_LIBS}) -install(TARGETS inflowwind_driver ifwlib ifw_c_binding +install(TARGETS inflowwind_driver ifwlib ifw_c_binding ifwlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/map/CMakeLists.txt b/modules/map/CMakeLists.txt index 2589d5a893..f03e673222 100644 --- a/modules/map/CMakeLists.txt +++ b/modules/map/CMakeLists.txt @@ -33,24 +33,33 @@ endif() file(GLOB MAP_CLIB_SOURCES src/*.c src/*.cc src/*/*.c src/*/*.cc) file(GLOB MAP_C_HEADERS src/*.h src/*/*.h) -add_library(mapcpplib ${MAP_CLIB_SOURCES} src/MAP_Types.f90 src/MAP_Fortran_Types.f90) +add_library(mapcpplib_obj OBJECT ${MAP_CLIB_SOURCES} src/MAP_Types.f90 src/MAP_Fortran_Types.f90) -target_include_directories(mapcpplib PUBLIC +target_include_directories(mapcpplib_obj PUBLIC $ $ $ $ $) +target_link_libraries(mapcpplib_obj nwtclibs_obj) + +add_library(mapcpplib $) target_link_libraries(mapcpplib nwtclibs) -add_library(maplib +set(MAP_F_SOURCES src/map.f90 src/MAP_Types.f90 src/MAP_Fortran_Types.f90 ) -target_link_libraries(maplib mapcpplib) -install(TARGETS maplib mapcpplib +add_library(maplib_obj OBJECT src/map.f90) +target_link_libraries(maplib_obj mapcpplib_obj nwtclibs_obj) + +add_library(maplib $ $) +target_link_libraries(maplib maplib_obj mapcpplib_obj) + + +install(TARGETS maplib mapcpplib maplib_obj mapcpplib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION lib ARCHIVE DESTINATION lib diff --git a/modules/moordyn/CMakeLists.txt b/modules/moordyn/CMakeLists.txt index a6d27af363..ab22f40e0c 100644 --- a/modules/moordyn/CMakeLists.txt +++ b/modules/moordyn/CMakeLists.txt @@ -29,7 +29,10 @@ set(MOORDYN_LIBS_SOURCES src/MoorDyn_Types.f90 ) -add_library(moordynlib ${MOORDYN_LIBS_SOURCES}) +add_library(moordynlib_obj OBJECT ${MOORDYN_LIBS_SOURCES}) +target_link_libraries(moordynlib_obj nwtclibs_obj) + +add_library(moordynlib $) target_link_libraries(moordynlib nwtclibs) # c-bindings interface library @@ -40,7 +43,7 @@ if(APPLE OR UNIX) endif() -install(TARGETS moordynlib +install(TARGETS moordynlib moordynlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION lib ARCHIVE DESTINATION lib diff --git a/modules/nwtc-library/CMakeLists.txt b/modules/nwtc-library/CMakeLists.txt index 4078fbe223..3d11e20005 100644 --- a/modules/nwtc-library/CMakeLists.txt +++ b/modules/nwtc-library/CMakeLists.txt @@ -19,12 +19,12 @@ set(NWTCLIBS_SOURCES src/ModMesh.f90 src/ModMesh_Mapping.f90 src/ModMesh_Types.f90 - src/NWTC_Base.f90 + src/NWTC_IO.f90 src/NWTC_Library.f90 src/NWTC_Num.f90 src/NWTC_RandomNumber.f90 - src/SingPrec.f90 + src/NWTC_Library_Types.f90 src/VTK.f90 src/YAML.f90 @@ -91,52 +91,84 @@ if (CMAKE_BUILD_TYPE MATCHES Debug) endif() endif() endif() -endif() - - -if(BUILD_OPENFAST_SIMULINK_API) - - if (APPLE OR UNIX) - if (${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU") - set(NWTC_SYS_FILE src/SysMatlabLinuxGnu.f90) - elseif (${CMAKE_Fortran_COMPILER_ID} MATCHES "^Intel") - set(NWTC_SYS_FILE src/SysMatlabLinuxIntel.f90) - endif() - elseif (WIN32) - set(NWTC_SYS_FILE src/SysMatlabWindows.f90) - endif() +endif() -elseif (${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU") +if (${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU") if (WIN32) set(NWTC_SYS_FILE src/SysGnuWin.f90) + set(NWTC_SYS_FILE_MATLAB src/SysMatlabWindows.f90) elseif (APPLE OR UNIX OR CYGWIN) set(NWTC_SYS_FILE src/SysGnuLinux.f90) + set(NWTC_SYS_FILE_MATLAB src/SysMatlabLinuxGnu.f90) endif () elseif (${CMAKE_Fortran_COMPILER_ID} MATCHES "^Intel") if (APPLE OR UNIX) set(NWTC_SYS_FILE src/SysIFL.f90) + set(NWTC_SYS_FILE_MATLAB src/SysMatlabLinuxIntel.f90) elseif (WIN32) set(NWTC_SYS_FILE src/SysIVF.f90) + set(NWTC_SYS_FILE_MATLAB src/SysMatlabWindows.f90) endif (APPLE OR UNIX) endif () if (NWTC_SYS_FILE) message("-- Setting system file as: ${NWTC_SYS_FILE}") - list(APPEND NWTCLIBS_SOURCES ${NWTC_SYS_FILE}) else (NWTC_SYS_FILE) message(FATAL_ERROR "Cannot determine system file used with NWTC_Library") endif (NWTC_SYS_FILE) -add_library(nwtclibs ${NWTCLIBS_SOURCES}) + +add_library(nwtcbaselib_obj OBJECT src/NWTC_Base.f90 src/SingPrec.f90) + +add_library(nwtcsyslib_obj OBJECT ${NWTC_SYS_FILE}) +target_link_libraries(nwtcsyslib_obj nwtcbaselib_obj ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS}) +if (USE_LOCAL_STATIC_LAPACK) + add_dependencies(nwtcsyslib_obj lapack) +endif() + +add_library(nwtclibs_obj OBJECT ${NWTCLIBS_SOURCES}) +target_link_libraries(nwtclibs_obj nwtcbaselib_obj ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS}) +if (USE_LOCAL_STATIC_LAPACK) + add_dependencies(nwtclibs_obj lapack) +endif() + +add_library(nwtclibs $ $ $) +target_link_libraries(nwtclibs ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS}) +add_dependencies (nwtclibs nwtclibs_obj nwtcsyslib_obj) +if (USE_LOCAL_STATIC_LAPACK) + add_dependencies(nwtclibs lapack) +endif() + if(BUILD_OPENFAST_SIMULINK_API) + + if (NWTC_SYS_FILE_MATLAB) + message("-- Setting Matlab system file as: ${NWTC_SYS_FILE_MATLAB}") + else (NWTC_SYS_FILE_MATLAB) + message(FATAL_ERROR "Cannot determine Matlab system file used with NWTC_Library") + endif (NWTC_SYS_FILE_MATLAB) + + # Append the matlab mex libraries to the target find_package(Matlab REQUIRED) - target_link_libraries(nwtclibs ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS} ${Matlab_MEX_LIBRARY}) -else() - target_link_libraries(nwtclibs ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS}) -endif() -install(TARGETS nwtclibs + message(STATUS "In NWTC Matlab_MEX_LIBRARY: ${Matlab_MEX_LIBRARY}") + + add_library(nwtcsyslib_matlab_obj OBJECT ${NWTC_SYS_FILE_MATLAB}) + target_link_libraries(nwtcsyslib_matlab_obj nwtclibs_obj nwtcbaselib_obj ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS} ${Matlab_MEX_LIBRARY}) + + if (USE_LOCAL_STATIC_LAPACK) + add_dependencies(nwtcsyslib_matlab_obj lapack) + endif() + + install(TARGETS nwtcsyslib_matlab_obj + EXPORT "${CMAKE_PROJECT_NAME}Libraries" + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) + +endif(BUILD_OPENFAST_SIMULINK_API) + +install(TARGETS nwtclibs nwtclibs_obj nwtcsyslib_obj nwtcbaselib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) + diff --git a/modules/openfast-library/CMakeLists.txt b/modules/openfast-library/CMakeLists.txt index b838662c2d..b4fd37aee2 100644 --- a/modules/openfast-library/CMakeLists.txt +++ b/modules/openfast-library/CMakeLists.txt @@ -22,8 +22,33 @@ if (GENERATE_TYPES) generate_f90_types(src/FAST_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/FAST_Types.f90 -noextrap) endif() -add_library(openfast_prelib src/FAST_Types.f90) +add_library(openfast_prelib_obj OBJECT src/FAST_Types.f90) +target_link_libraries(openfast_prelib_obj + nwtclibs_obj + ifwlib_obj + fvwlib_obj + uaaerolib_obj + afinfolib_obj + aeroacoustics_obj + aerodynlib_obj + aerodyn14lib_obj + servodynlib_obj + elastodynlib_obj + beamdynlib_obj + subdynlib_obj + hydrodynlib_obj + orcaflexlib_obj + extptfm_mckflib_obj + openfoamtypeslib_obj + scdataextypeslib_obj + feamlib_obj + moordynlib_obj + icedynlib_obj + icefloelib_obj + maplib_obj +) +add_library(openfast_prelib $) target_link_libraries(openfast_prelib nwtclibs ifwlib @@ -45,18 +70,157 @@ target_link_libraries(openfast_prelib maplib ) -add_library(openfast_postlib + +set(OPENFAST_POSTLIB_SOURCES src/FAST_Lin.f90 src/FAST_Mods.f90 src/FAST_Subs.f90 src/FAST_Solver.f90 - ) -target_link_libraries(openfast_postlib openfast_prelib scdataexlib foamfastlib versioninfolib) +) + +add_library(openfast_postlib_obj OBJECT ${OPENFAST_POSTLIB_SOURCES}) +target_link_libraries(openfast_postlib_obj openfast_prelib_obj scdataexlib_obj foamfastlib_obj versioninfolib_obj) + +add_library(openfast_postlib $) +target_link_libraries(openfast_postlib openfast_prelib_obj scdataexlib foamfastlib versioninfolib) + +add_library(openfastlib_common_obj OBJECT src/FAST_Library.f90) +target_link_libraries(openfastlib_common_obj +openfast_prelib_obj +maplib_obj +nwtclibs_obj +nwtcsyslib_obj +nwtcbaselib_obj +ifwlib_obj +fvwlib_obj +uaaerolib_obj +afinfolib_obj +aeroacoustics_obj +aerodynlib_obj +aerodyn14lib_obj +servodynlib_obj +elastodynlib_obj +beamdynlib_obj +subdynlib_obj +hydrodynlib_obj +orcaflexlib_obj +extptfm_mckflib_obj +openfoamtypeslib_obj +foamfastlib_obj +scdataextypeslib_obj +scdataexlib_obj +feamlib_obj +moordynlib_obj +icedynlib_obj +icefloelib_obj +openfast_postlib_obj +versioninfolib_obj +) + +# Note that the python interface requires that openfastlib be a shared library +# so it can be opened with dlopen +add_library(openfastlib SHARED + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ +) + +target_link_libraries(openfastlib + ${LAPACK_LIBRARIES} + ${CMAKE_DL_LIBS} +) + +if (USE_LOCAL_STATIC_LAPACK) + add_dependencies(openfastlib lapack) +endif() -add_library(openfastlib SHARED src/FAST_Library.f90) -target_link_libraries(openfastlib openfast_postlib openfast_prelib scdataexlib foamfastlib) set_property(TARGET openfastlib PROPERTY LINKER_LANGUAGE Fortran) +if(BUILD_OPENFAST_SIMULINK_API) + + find_package(Matlab REQUIRED) + message(STATUS "Matlab_MEX_LIBRARY: ${Matlab_MEX_LIBRARY}") + + add_library(openfastlib_mex + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + ) + + target_link_libraries(openfastlib_mex + ${LAPACK_LIBRARIES} + ${CMAKE_DL_LIBS} + ${Matlab_MEX_LIBRARY} + ) + + if (USE_LOCAL_STATIC_LAPACK) + add_dependencies(openfastlib_mex lapack) + endif() + + install(TARGETS openfastlib_mex + EXPORT ${CMAKE_PROJECT_NAME}Libraries + RUNTIME DESTINATION lib + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib) + +endif(BUILD_OPENFAST_SIMULINK_API) + string(TOUPPER ${CMAKE_Fortran_COMPILER_ID} _compiler_id) string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type) if (${_compiler_id} STREQUAL "GNU" AND NOT ${VARIABLE_TRACKING}) @@ -76,7 +240,7 @@ if (${_compiler_id} MATCHES "^INTEL" AND ${_build_type} STREQUAL "RELEASE" AND N set_source_files_properties(src/FAST_Types.f90 PROPERTIES COMPILE_FLAGS "-O2") endif() -install(TARGETS openfastlib openfast_prelib openfast_postlib +install(TARGETS openfastlib openfast_prelib openfast_postlib openfast_postlib_obj openfast_prelib_obj openfastlib_common_obj EXPORT ${CMAKE_PROJECT_NAME}Libraries RUNTIME DESTINATION lib ARCHIVE DESTINATION lib diff --git a/modules/openfoam/CMakeLists.txt b/modules/openfoam/CMakeLists.txt index 7d895a7cf9..b715a3d1c9 100644 --- a/modules/openfoam/CMakeLists.txt +++ b/modules/openfoam/CMakeLists.txt @@ -21,15 +21,28 @@ endif() # copy the header files to their build location configure_file(src/OpenFOAM_Types.h ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) -add_library(openfoamtypeslib src/OpenFOAM_Types.f90) +set(OFTYPES_SOURCES + src/OpenFOAM_Types.f90 +) + +add_library(openfoamtypeslib_obj OBJECT ${OFTYPES_SOURCES}) +target_link_libraries(openfoamtypeslib_obj nwtclibs_obj) + +add_library(openfoamtypeslib $) target_link_libraries(openfoamtypeslib nwtclibs) -add_library(foamfastlib +set(FOAMFAST_SOURCES src/OpenFOAM.f90 ) + +add_library(foamfastlib_obj OBJECT ${FOAMFAST_SOURCES}) +target_link_libraries(foamfastlib_obj openfoamtypeslib_obj openfast_prelib_obj nwtclibs_obj) + +add_library(foamfastlib $) target_link_libraries(foamfastlib openfoamtypeslib openfast_prelib nwtclibs) -install(TARGETS openfoamtypeslib foamfastlib + +install(TARGETS openfoamtypeslib openfoamtypeslib_obj foamfastlib foamfastlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/orcaflex-interface/CMakeLists.txt b/modules/orcaflex-interface/CMakeLists.txt index fb6da14c5a..75a5bbc01c 100644 --- a/modules/orcaflex-interface/CMakeLists.txt +++ b/modules/orcaflex-interface/CMakeLists.txt @@ -24,10 +24,15 @@ else (ORCA_DLL_LOAD) add_definitions(-DNO_LibLoad) endif (ORCA_DLL_LOAD) -add_library(orcaflexlib +set(ORCAFLEX_SOURCES src/OrcaFlexInterface.f90 src/OrcaFlexInterface_Types.f90 ) + +add_library(orcaflexlib_obj OBJECT ${ORCAFLEX_SOURCES}) +target_link_libraries(orcaflexlib_obj nwtclibs_obj) + +add_library(orcaflexlib $) target_link_libraries(orcaflexlib nwtclibs) add_executable(orca_driver @@ -36,7 +41,7 @@ add_executable(orca_driver src/OrcaDriver.f90) target_link_libraries(orca_driver orcaflexlib) -install(TARGETS orcaflexlib orca_driver +install(TARGETS orcaflexlib orca_driver orcaflexlib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/servodyn/CMakeLists.txt b/modules/servodyn/CMakeLists.txt index 0f74f81919..c7c5f2a443 100644 --- a/modules/servodyn/CMakeLists.txt +++ b/modules/servodyn/CMakeLists.txt @@ -32,7 +32,10 @@ set(SrvD_SOURCES src/ServoDyn_Types.f90 ) -add_library(servodynlib ${SrvD_SOURCES}) +add_library(servodynlib_obj OBJECT ${SrvD_SOURCES}) +target_link_libraries(servodynlib_obj nwtclibs_obj) + +add_library(servodynlib $) target_link_libraries(servodynlib nwtclibs) add_executable(servodyn_driver src/ServoDyn_Driver.f90) @@ -42,7 +45,7 @@ target_link_libraries(servodyn_driver servodynlib nwtclibs versioninfolib ${CMAK # add_executable(strucctrl_driver src/StrucCtrl_Driver.f90) # target_link_libraries(strucctrl_driver servodynlib nwtclibs ${CMAKE_DL_LIBS}) -install(TARGETS servodynlib servodyn_driver # strucctrl_driver +install(TARGETS servodynlib servodynlib_obj servodyn_driver # strucctrl_driver EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/subdyn/CMakeLists.txt b/modules/subdyn/CMakeLists.txt index 452832fea3..ad31feddd4 100644 --- a/modules/subdyn/CMakeLists.txt +++ b/modules/subdyn/CMakeLists.txt @@ -29,7 +29,10 @@ set(SUBDYN_SOURCES src/SubDyn_Types.f90 ) -add_library(subdynlib ${SUBDYN_SOURCES}) +add_library(subdynlib_obj OBJECT ${SUBDYN_SOURCES}) +target_link_libraries(subdynlib_obj nwtclibs_obj) + +add_library(subdynlib $) target_link_libraries(subdynlib nwtclibs) set(SUBDYN_DRIVER_SOURCES @@ -38,7 +41,7 @@ set(SUBDYN_DRIVER_SOURCES add_executable(subdyn_driver ${SUBDYN_DRIVER_SOURCES}) target_link_libraries(subdyn_driver subdynlib nwtclibs versioninfolib) -install(TARGETS subdynlib subdyn_driver +install(TARGETS subdynlib subdynlib_obj subdyn_driver EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/supercontroller/CMakeLists.txt b/modules/supercontroller/CMakeLists.txt index 2bf5b44ad1..66589955e4 100644 --- a/modules/supercontroller/CMakeLists.txt +++ b/modules/supercontroller/CMakeLists.txt @@ -27,10 +27,16 @@ endif() configure_file(src/SuperController_Types.h ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) configure_file(src/SCDataEx_Types.h ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) -add_library(scdataextypeslib src/SCDataEx_Types.f90) +add_library(scdataextypeslib_obj OBJECT src/SCDataEx_Types.f90) +target_link_libraries(scdataextypeslib_obj nwtclibs_obj) + +add_library(scdataextypeslib $) target_link_libraries(scdataextypeslib nwtclibs) -add_library(scdataexlib src/SC_DataEx.f90) +add_library(scdataexlib_obj src/SC_DataEx.f90) +target_link_libraries(scdataexlib_obj scdataextypeslib_obj openfast_prelib_obj nwtclibs_obj) + +add_library(scdataexlib $) target_link_libraries(scdataexlib scdataextypeslib openfast_prelib nwtclibs) add_library(sctypeslib src/SuperController_Types.f90) @@ -42,8 +48,9 @@ target_link_libraries(scfastlib sctypeslib openfast_prelib nwtclibs) add_library(sclib SHARED src/SC_DLL.F90) + +install(TARGETS sctypeslib scfastlib scdataextypeslib scdataexlib sclib scdataextypeslib_obj scdataexlib_obj -install(TARGETS sctypeslib scfastlib scdataextypeslib scdataexlib sclib EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/version/CMakeLists.txt b/modules/version/CMakeLists.txt index 34a7891b3e..935d8d2235 100644 --- a/modules/version/CMakeLists.txt +++ b/modules/version/CMakeLists.txt @@ -27,11 +27,13 @@ else() endif() add_definitions(-DGIT_VERSION_INFO="${GIT_DESCRIBE}") -add_library(versioninfolib src/VersionInfo.f90) -target_link_libraries(versioninfolib nwtclibs) +add_library(versioninfolib_obj OBJECT src/VersionInfo.f90) +target_link_libraries(versioninfolib_obj nwtclibs_obj) +add_library(versioninfolib $) +target_link_libraries(versioninfolib nwtclibs) -install(TARGETS versioninfolib +install(TARGETS versioninfolib versioninfolib_obj EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/wakedynamics/CMakeLists.txt b/modules/wakedynamics/CMakeLists.txt index 0fbfa59183..996b496660 100644 --- a/modules/wakedynamics/CMakeLists.txt +++ b/modules/wakedynamics/CMakeLists.txt @@ -25,6 +25,7 @@ set(WD_LIBS_SOURCES add_library(wdlib ${WD_LIBS_SOURCES}) target_link_libraries(wdlib nwtclibs) +add_dependencies(wdlib nwtclibs_obj)