From efac83819b870be344318860b16dad2c729a64a5 Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Wed, 31 Jul 2019 11:44:57 -0600 Subject: [PATCH 01/12] Increment version number to 7.1 --- README.md | 2 +- src/core_atmosphere/Registry.xml | 2 +- src/core_init_atmosphere/Registry.xml | 2 +- src/core_landice/Registry.xml | 2 +- src/core_ocean/Registry.xml | 2 +- src/core_seaice/Registry.xml | 2 +- src/core_sw/Registry.xml | 2 +- src/core_test/Registry.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c29fec6914..1d28ea2a6d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -MPAS-v7.0 +MPAS-v7.1 ==== The Model for Prediction Across Scales (MPAS) is a collaborative project for diff --git a/src/core_atmosphere/Registry.xml b/src/core_atmosphere/Registry.xml index e4cf270af4..bf15747eda 100644 --- a/src/core_atmosphere/Registry.xml +++ b/src/core_atmosphere/Registry.xml @@ -1,5 +1,5 @@ - + diff --git a/src/core_init_atmosphere/Registry.xml b/src/core_init_atmosphere/Registry.xml index 515b881d01..815804d8b9 100644 --- a/src/core_init_atmosphere/Registry.xml +++ b/src/core_init_atmosphere/Registry.xml @@ -1,5 +1,5 @@ - + diff --git a/src/core_landice/Registry.xml b/src/core_landice/Registry.xml index 1e31339959..8e7911e231 100644 --- a/src/core_landice/Registry.xml +++ b/src/core_landice/Registry.xml @@ -1,5 +1,5 @@ - + diff --git a/src/core_ocean/Registry.xml b/src/core_ocean/Registry.xml index fc0649047f..4a9710e10f 100644 --- a/src/core_ocean/Registry.xml +++ b/src/core_ocean/Registry.xml @@ -1,5 +1,5 @@ - + - + - + diff --git a/src/core_test/Registry.xml b/src/core_test/Registry.xml index 481f15d4bd..9f889b4dd9 100644 --- a/src/core_test/Registry.xml +++ b/src/core_test/Registry.xml @@ -1,5 +1,5 @@ - + From 0c984660715191fa0e6cd51035df2e00065ac399 Mon Sep 17 00:00:00 2001 From: Miles A Curry Date: Tue, 23 Jul 2019 17:22:52 +0000 Subject: [PATCH 02/12] SST input and output interval check This commit checks to see that `config_fg_interval` in the namelist.init_atmosphere and the output interval for the `surface` stream are the same for init_case 8. --- src/core_init_atmosphere/mpas_init_atm_cases.F | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/core_init_atmosphere/mpas_init_atm_cases.F b/src/core_init_atmosphere/mpas_init_atm_cases.F index e08d55e48e..3b959158ef 100644 --- a/src/core_init_atmosphere/mpas_init_atm_cases.F +++ b/src/core_init_atmosphere/mpas_init_atm_cases.F @@ -74,7 +74,7 @@ subroutine init_atm_setup_case(domain, stream_manager) character(len=StrKIND), pointer :: xtime type (MPAS_Time_type) :: curr_time, stop_time - type (MPAS_TimeInterval_type) :: clock_interval, lbc_stream_interval + type (MPAS_TimeInterval_type) :: clock_interval, lbc_stream_interval, surface_stream_interval character(len=StrKIND) :: timeString integer, pointer :: nCells @@ -264,6 +264,21 @@ subroutine init_atm_setup_case(domain, stream_manager) else if (config_init_case == 8 ) then call mpas_log_write('real-data surface (SST) update test case ') + + ! + ! Check that config_fg_interval matches the output_interval of the surface stream + ! + clock_interval = mpas_get_clock_timestep(domain % clock, ierr=ierr) + surface_stream_interval = MPAS_stream_mgr_get_stream_interval(stream_manager, 'surface', MPAS_STREAM_OUTPUT, ierr) + if (clock_interval /= surface_stream_interval) then + call mpas_log_write('****************************************************************', messageType=MPAS_LOG_ERR) + call mpas_log_write('The intermediate SST file interval specified by ''config_fg_interval''', messageType=MPAS_LOG_ERR) + call mpas_log_write('does not match the output_interval for the ''surface'' stream.', messageType=MPAS_LOG_ERR) + call mpas_log_write('Please correct the namelist.init_atmosphere and/or', messageType=MPAS_LOG_ERR) + call mpas_log_write('streams.init_atmosphere files.', messageType=MPAS_LOG_ERR) + call mpas_log_write('****************************************************************', messageType=MPAS_LOG_CRIT) + end if + block_ptr => domain % blocklist do while (associated(block_ptr)) call mpas_pool_get_subpool(block_ptr % structs, 'mesh', mesh) From 3317b428a37f9091c64f0229bc1bdbb4b56cce7e Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Tue, 12 Nov 2019 14:57:36 -0700 Subject: [PATCH 03/12] Fix out-of-bounds array access when GWDO scheme was run with multiple threads When MPAS-Atmosphere was compiled with OpenMP and run with multiple threads, an out-of-bounds array access was generated in the GWDO scheme when an array of size (ims:ime) was assigned to an array of size (its:ite): cleff(its:ite) = dxmeter The simple fix is to copy only the elements (its:ite) of the dxmeter array: cleff(its:ite) = dxmeter(its:ite) When the GWDO scheme is run with just one thread, ims = its and ime = ite, so there was no out-of-bounds access. --- src/core_atmosphere/physics/physics_wrf/module_bl_gwdo.F | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core_atmosphere/physics/physics_wrf/module_bl_gwdo.F b/src/core_atmosphere/physics/physics_wrf/module_bl_gwdo.F index beaa2955f2..58dcc15853 100644 --- a/src/core_atmosphere/physics/physics_wrf/module_bl_gwdo.F +++ b/src/core_atmosphere/physics/physics_wrf/module_bl_gwdo.F @@ -365,7 +365,7 @@ subroutine gwdo2d(dudt, dvdt, dtaux2d, dtauy2d, & dxy4p(its:ite,3) = dxy4(its:ite,4) dxy4p(its:ite,4) = dxy4(its:ite,3) ! - cleff(its:ite) = dxmeter + cleff(its:ite) = dxmeter(its:ite) ! ! initialize arrays ! From 40c14b644ff223542a2e2b7b231b6345d365d749 Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Wed, 8 Jan 2020 17:31:46 -0700 Subject: [PATCH 04/12] Correct misspelling of 'coefficients' and 'fields' in atmosphere Registry.xml The adv_coefs and adv_coefs_3rd fields had typographical errors in their descriptions, which have been corrected. --- src/core_atmosphere/Registry.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core_atmosphere/Registry.xml b/src/core_atmosphere/Registry.xml index e4cf270af4..ef9336a076 100644 --- a/src/core_atmosphere/Registry.xml +++ b/src/core_atmosphere/Registry.xml @@ -1352,10 +1352,10 @@ description="weights for cell-centered second derivative, normal to edge, for transport scheme"/> + description="Weighting coefficients used for reconstructing cell-based fields at edges"/> + description="Weighting coefficients used for reconstructing cell-based fields at edges"/> From 75d83b0e02c7e8505fbd6370f7ccf4d235ac0081 Mon Sep 17 00:00:00 2001 From: "Miles A. Curry" Date: Mon, 13 Jan 2020 11:42:49 -0700 Subject: [PATCH 05/12] Correct misspelling of 'surface' in atmosphere Registry.xml The description for the albedo12m field incorrectly spelled 'surface' as 'aurface'. This commit corrects the misspelling. --- src/core_atmosphere/Registry.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core_atmosphere/Registry.xml b/src/core_atmosphere/Registry.xml index e4cf270af4..9d43a9b7d3 100644 --- a/src/core_atmosphere/Registry.xml +++ b/src/core_atmosphere/Registry.xml @@ -3009,7 +3009,7 @@ description="terrain height"/> + description="monthly-mean climatological surface albedo"/> From 593cef3b526ae04d62c780d7fb665b3ab5eae861 Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Mon, 24 Feb 2020 19:14:08 -0700 Subject: [PATCH 06/12] Fix race condition for ezxml library in parallel builds Under the right conditions, a race condition in the compilation of the ezxml library could lead to a failed build. The race condition occurs when the MPAS build tools (input_gen, parse) try to build the ezxml library for use on login nodes, while the MPAS framework tries to build the ezxml library for use on batch nodes. The fix in this commit resolves this issue by modifying the Makefile for the ezxml library to compile an object file with a specified name. The MPAS tools specify an object file name of ezxml_tools.o, while the framework specifies an object file name of ezxml.o. --- src/external/Makefile | 2 +- src/external/ezxml/Makefile | 13 ++----------- src/tools/input_gen/Makefile | 4 ++-- src/tools/registry/Makefile | 4 ++-- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/external/Makefile b/src/external/Makefile index 4409d9c704..d2f9e86f2e 100644 --- a/src/external/Makefile +++ b/src/external/Makefile @@ -6,7 +6,7 @@ esmf_time: ( cd esmf_time_f90; $(MAKE) FC="$(FC) $(FFLAGS)" CPP="$(CPP)" CPPFLAGS="$(CPPFLAGS) -DHIDE_MPI" GEN_F90=$(GEN_F90) ) ezxml-lib: - ( cd ezxml; $(MAKE) ) + ( cd ezxml; $(MAKE) OBJFILE="ezxml.o" ) clean: ( cd esmf_time_f90; $(MAKE) clean ) diff --git a/src/external/ezxml/Makefile b/src/external/ezxml/Makefile index b7d1633363..93c192920c 100644 --- a/src/external/ezxml/Makefile +++ b/src/external/ezxml/Makefile @@ -1,14 +1,5 @@ -.SUFFIXES: .c .o - -OBJS = ezxml.o - -all: clean - $(MAKE) -j 1 library - -library: $(OBJS) +$(OBJFILE): ezxml.c + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $(OBJFILE) clean: $(RM) *.o *.i - -.c.o: - $(CC) $(CFLAGS) $(CPPFLAGS) -c $< diff --git a/src/tools/input_gen/Makefile b/src/tools/input_gen/Makefile index 29c47a242d..4204692c67 100644 --- a/src/tools/input_gen/Makefile +++ b/src/tools/input_gen/Makefile @@ -4,14 +4,14 @@ EZXML_PATH= ../../external/ezxml NL_OBJS = namelist_gen.o test_functions.o ST_OBJS = streams_gen.o test_functions.o -XML_OBJS = $(EZXML_PATH)/ezxml.o +XML_OBJS = $(EZXML_PATH)/ezxml_tools.o all: ezxml ($(MAKE) -j 1 namelist_gen CPPFLAGS="$(CPPFLAGS)" CPPINCLUDES="$(CPPINCLUDES)") ($(MAKE) -j 1 streams_gen CPPFLAGS="$(CPPFLAGS)" CPPINCLUDES="$(CPPINCLUDES)") ezxml: - (cd $(EZXML_PATH); $(MAKE) CFLAGS="$(CFLAGS) $(TOOL_TARGET_ARCH)") + (cd $(EZXML_PATH); $(MAKE) CFLAGS="$(CFLAGS) $(TOOL_TARGET_ARCH)" OBJFILE="ezxml_tools.o") namelist_gen: ezxml $(NL_OBJS) $(XML_OBJS) $(CC) $(CPPFLAGS) $(CFLAGS) -I$(EZXML_PATH) -o $@ $(NL_OBJS) $(XML_OBJS) diff --git a/src/tools/registry/Makefile b/src/tools/registry/Makefile index 46d9d56394..1b1900d6a6 100644 --- a/src/tools/registry/Makefile +++ b/src/tools/registry/Makefile @@ -9,10 +9,10 @@ all: ezxml ($(MAKE) parse CPPFLAGS="$(CPPFLAGS)" CPPINCLUDES="$(CPPINCLUDES)") ezxml: - (cd $(EZXML_PATH); $(MAKE) CFLAGS="$(CFLAGS) $(TOOL_TARGET_ARCH)") + (cd $(EZXML_PATH); $(MAKE) CFLAGS="$(CFLAGS) $(TOOL_TARGET_ARCH)" OBJFILE="ezxml_tools.o") parse: $(OBJS) - $(CC) $(CPPFLAGS) $(CFLAGS) $(EZXML_PATH)/ezxml.o -I$(EZXML_PATH) -o $@ $(OBJS) + $(CC) $(CPPFLAGS) $(CFLAGS) $(EZXML_PATH)/ezxml_tools.o -I$(EZXML_PATH) -o $@ $(OBJS) parse.o: From 08f8a8c5fb6df3a3ebed5e65de503b7663da7022 Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Wed, 28 Oct 2020 22:11:15 -0600 Subject: [PATCH 07/12] Fix non-standard BOZ-literal integer constant in module_ra_cam_support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The GNU 10.1.0 compiler identified a non-standard BOZ-literal constant in module_ra_cam_support.F, failing to compile this file with the following error: module_ra_cam_support.F:11:35: 11 | integer, parameter:: bigint = O'17777777777' ! largest possible 32-bit integer | 1 Error: BOZ literal constant at (1) is neither a data-stmt-constant nor an actual argument to INT, REAL, DBLE, or CMPLX intrinsic function [see ‘-fno-allow-invalid-boz’] As per the Fortran 2003 standard, this constant should be typed with the INT intrinsic (or be used in a data statement): 4.4.1 Integer type C410 (R411) A boz-literal-constant shall appear only as a data-stmt-constant in a DATA statement, as the actual argument associated with the dummy argument A of the numeric intrinsic functions DBLE, REAL or INT, or as the actual argument associated with the X or Y dummy argument of the intrinsic function CMPLX. This commit uses the INT intrinsic with an argument of O'17777777777' to initialize the bigint parameter. --- src/core_atmosphere/physics/physics_wrf/module_ra_cam_support.F | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core_atmosphere/physics/physics_wrf/module_ra_cam_support.F b/src/core_atmosphere/physics/physics_wrf/module_ra_cam_support.F index 37fd487e07..fb9481c9d8 100644 --- a/src/core_atmosphere/physics/physics_wrf/module_ra_cam_support.F +++ b/src/core_atmosphere/physics/physics_wrf/module_ra_cam_support.F @@ -8,7 +8,7 @@ MODULE module_ra_cam_support implicit none integer, parameter :: r8 = 8 real(r8), parameter:: inf = 1.e20 ! CAM sets this differently in infnan.F90 - integer, parameter:: bigint = O'17777777777' ! largest possible 32-bit integer + integer, parameter:: bigint = int(O'17777777777') ! largest possible 32-bit integer integer :: ixcldliq integer :: ixcldice From e3242db7d252b46038ab07228db0d3be69ce0e4d Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Tue, 2 Feb 2021 14:45:12 -0700 Subject: [PATCH 08/12] Change -O3 to -g in CXXFLAGS_DEBUG for gfortran build target The definition of CXXFLAGS_DEBUG in the gfortran build target previously included the -O3 optimization flag that is more typical of non-debug flags, and it lacked the -g flag. This commit simply replaces -O3 with -g in the definition of CXXFLAGS_DEBUG for the gfortran build target. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index baceb05cb7..fd66e2ed7e 100644 --- a/Makefile +++ b/Makefile @@ -225,7 +225,7 @@ gfortran: "LDFLAGS_OPT = -O3 -m64" \ "FFLAGS_DEBUG = -g -m64 -ffree-line-length-none -fconvert=big-endian -ffree-form -fbounds-check -fbacktrace -ffpe-trap=invalid,zero,overflow" \ "CFLAGS_DEBUG = -g -m64" \ - "CXXFLAGS_DEBUG = -O3 -m64" \ + "CXXFLAGS_DEBUG = -g -m64" \ "LDFLAGS_DEBUG = -g -m64" \ "FFLAGS_OMP = -fopenmp" \ "CFLAGS_OMP = -fopenmp" \ From c0ddd4dc2819e4884e8855dc3b967fc97614ac7f Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Tue, 2 Feb 2021 14:49:14 -0700 Subject: [PATCH 09/12] Remove -m64 from all compiler flag sets in gfortran build target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The -m64 option is an architecture-specific option, available for the PowerPC and x68 architectures, but not for the AArch64 architecture. Building with the 'gfortran' target on AArch64 systems results in the following error: gcc: error: unrecognized command line option ‘-m64’ In principle, the -m64 option may be needed on some older PowerPC or x86 machines, though no current examples of systems with this requirement are known. An alternative to modifying the existing 'gfortran' target would be to create a new target, 'gfortran-arm' or 'gfortran-aarch64'; however, having a single 'gfortran' target that is architecture-agnostic seems like a cleaner solution. Note: the 'gfortran-clang' and 'gnu-nersc' targets have not been modified to remove the -m64 flag. These build targets are assumed to have been added for specific platforms (e.g., NERSC machines and macOS machines with the clang C/C++ compilers). --- Makefile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index fd66e2ed7e..472917bb21 100644 --- a/Makefile +++ b/Makefile @@ -219,14 +219,14 @@ gfortran: "CC_SERIAL = gcc" \ "CXX_SERIAL = g++" \ "FFLAGS_PROMOTION = -fdefault-real-8 -fdefault-double-8" \ - "FFLAGS_OPT = -O3 -m64 -ffree-line-length-none -fconvert=big-endian -ffree-form" \ - "CFLAGS_OPT = -O3 -m64" \ - "CXXFLAGS_OPT = -O3 -m64" \ - "LDFLAGS_OPT = -O3 -m64" \ - "FFLAGS_DEBUG = -g -m64 -ffree-line-length-none -fconvert=big-endian -ffree-form -fbounds-check -fbacktrace -ffpe-trap=invalid,zero,overflow" \ - "CFLAGS_DEBUG = -g -m64" \ - "CXXFLAGS_DEBUG = -g -m64" \ - "LDFLAGS_DEBUG = -g -m64" \ + "FFLAGS_OPT = -O3 -ffree-line-length-none -fconvert=big-endian -ffree-form" \ + "CFLAGS_OPT = -O3" \ + "CXXFLAGS_OPT = -O3" \ + "LDFLAGS_OPT = -O3" \ + "FFLAGS_DEBUG = -g -ffree-line-length-none -fconvert=big-endian -ffree-form -fbounds-check -fbacktrace -ffpe-trap=invalid,zero,overflow" \ + "CFLAGS_DEBUG = -g" \ + "CXXFLAGS_DEBUG = -g" \ + "LDFLAGS_DEBUG = -g" \ "FFLAGS_OMP = -fopenmp" \ "CFLAGS_OMP = -fopenmp" \ "CORE = $(CORE)" \ From f14f0ce2813cc8baaad4a0b4cd024ad704ebe0b4 Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Tue, 2 Feb 2021 15:33:53 -0700 Subject: [PATCH 10/12] Enable all runtime checks when DEBUG=true in gfortran build target The gfortran build target previously included just the -fbounds-check flag for debug builds. This commit replaces -fbounds-check with -fcheck=all, which enables various other runtime checks, including checks for pointers, array temporaries, and recursion in routines not marked as recursive. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 472917bb21..8556f34755 100644 --- a/Makefile +++ b/Makefile @@ -223,7 +223,7 @@ gfortran: "CFLAGS_OPT = -O3" \ "CXXFLAGS_OPT = -O3" \ "LDFLAGS_OPT = -O3" \ - "FFLAGS_DEBUG = -g -ffree-line-length-none -fconvert=big-endian -ffree-form -fbounds-check -fbacktrace -ffpe-trap=invalid,zero,overflow" \ + "FFLAGS_DEBUG = -g -ffree-line-length-none -fconvert=big-endian -ffree-form -fcheck=all -fbacktrace -ffpe-trap=invalid,zero,overflow" \ "CFLAGS_DEBUG = -g" \ "CXXFLAGS_DEBUG = -g" \ "LDFLAGS_DEBUG = -g" \ From 6e1401b36deacd9cdaf7cabc2039b18d8a44a74a Mon Sep 17 00:00:00 2001 From: liujake Date: Wed, 21 Apr 2021 13:29:30 -0600 Subject: [PATCH 11/12] When calculating mosit air density, should use virtual T instead of T modified: src/core_init_atmosphere/mpas_init_atm_cases.F --- src/core_init_atmosphere/mpas_init_atm_cases.F | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core_init_atmosphere/mpas_init_atm_cases.F b/src/core_init_atmosphere/mpas_init_atm_cases.F index e08d55e48e..b96f3956f3 100644 --- a/src/core_init_atmosphere/mpas_init_atm_cases.F +++ b/src/core_init_atmosphere/mpas_init_atm_cases.F @@ -4758,7 +4758,8 @@ subroutine init_atm_case_gfs(block, mesh, nCells, nEdges, nVertLevels, fg, state t(k,iCell) = t(k,iCell) * (p0 / pressure(k,iCell)) ** (rgas / cp) ! RHO_ZZ - rho_zz(k,iCell) = pressure(k,iCell) / rgas / (p(k,iCell) * t(k,iCell)) + rho_zz(k,iCell) = pressure(k,iCell) / rgas / (p(k,iCell) * t(k,iCell) & + * (1.0 + (rvord - 1.0) * scalars(index_qv,k,iCell))) rho_zz(k,iCell) = rho_zz(k,iCell) / (1.0 + scalars(index_qv,k,iCell)) end do end do From 5c1c925e8b8620c7042a44b8479067229b9a0ad8 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Sat, 26 Sep 2020 16:45:13 +0200 Subject: [PATCH 12/12] Update test for libpio to skip libpio.settings The latest PIO2 (2.5.2) includes a file libpio.settings that was giving our Makefile trouble becasue it matches the wildcard libpio.*, -lpio will fail. --- Makefile | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 5fbaeca357..f8b019686b 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -MODEL_FORMULATION = +MODEL_FORMULATION = dummy: @@ -421,9 +421,9 @@ llvm: "OPENMP = $(OPENMP)" \ "CPPFLAGS = $(MODEL_FORMULATION) -D_MPI" ) -CPPINCLUDES = -FCINCLUDES = -LIBS = +CPPINCLUDES = +FCINCLUDES = +LIBS = # # If user has indicated a PIO2 library, define USE_PIO2 pre-processor macro @@ -458,9 +458,15 @@ endif # Depending on PIO version, libraries may be libpio.a, or libpiof.a and libpioc.a # Keep open the possibility of shared libraries in future with, e.g., .so suffix # +# Check if libpio.* exists and link -lpio if so, but we make an exception for +# libpio.settings (a file added in PIO2), which is not a library to link ifneq ($(wildcard $(PIO_LIB)/libpio\.*), ) - LIBS += -lpio + # Makefiles don't support "and" operators so we have nested "if" instead + ifneq "$(wildcard $(PIO_LIB)/libpio\.*)" "$(PIO_LIB)/libpio.settings" + LIBS += -lpio + endif endif + ifneq ($(wildcard $(PIO_LIB)/libpiof\.*), ) LIBS += -lpiof endif