diff --git a/.github/workflows/test-build-cygwin.yml b/.github/workflows/test-build-cygwin.yml new file mode 100644 index 0000000000..8f70f10eb2 --- /dev/null +++ b/.github/workflows/test-build-cygwin.yml @@ -0,0 +1,74 @@ +name: Test on Cygwin +on: + workflow_dispatch: + release: + type: ["published"] + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +env: + SHELLOPTS: igncr + CYGWIN_NOWINPATH: 1 + CHERE_INVOKING: 1 + ESMF_DIR: /cygdrive/d/a/esmf/esmf + ESMF_BOPT: O + ESMF_OPTLEVEL: 2 + ESMF_COMM: mpiuni + ESMF_COMPILER: gfortran + ESMF_TESTSHAREDOBJ: ON + ESMF_RANLIB: ranlib + ESMF_LAPACK: system + ESMF_LAPACK_LIBPATH: /usr/lib + ESMF_LAPACK_LIBS: -llapack -lblas + NETCDF: /usr + ESMF_NETCDF: split + ESMF_NETCDF_INCLUDE: /usr/include + ESMF_NETCDF_LIBPATH: /usr/lib + ESMF_CXX: g++ + ESMF_CXXCOMPILEOPTS: "-g -O2" + ESMF_F90: gfortran + ESMF_F90COMPILEOPTS: "-g -O2" + ESMF_INSTALL_PREFIX: /tmp/fakeroot/usr + ESMF_INSTALL_DOCDIR: share/doc/esmf + +jobs: + cygwin_build_test: + runs-on: windows-latest + steps: + - run: git config --global core.autocrlf input + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: cygwin/cygwin-install-action@v4 + with: + platform: x86_64 + install-dir: 'C:\tools\cygwin' + packages: >- + openmpi gcc-core gcc-fortran gcc-g++ libnetcdf-devel libnetcdf-fortran-devel + texlive-collection-latex texlive-collection-latexextra perl make bash dash + liblapack-devel cmake + python39-devel python39-pip python39-numpy python39-pytest + - name: Set Windows PATH + uses: egor-tensin/cleanup-path@v3 + with: + dirs: 'C:\tools\cygwin\bin;C:\tools\cygwin\lib\lapack' + - name: Check location + run: | + C:\tools\cygwin\bin\dash.exe -c "echo PWD; pwd; echo ESMF_DIR=${ESMF_DIR}" + - name: Build ESMF + run: | + C:\tools\cygwin\bin\dash.exe -c "/usr/bin/make all" + - name: Build ESMPy + run: | + C:\tools\cygwin\bin\dash.exe -c "cd src/addon/esmpy; python -m pip install ." + - name: Check ESMF + run: | + C:\tools\cygwin\bin\dash.exe -c "/usr/bin/make check" diff --git a/build/common.mk b/build/common.mk index 01c98436cc..1d9510ae4c 100644 --- a/build/common.mk +++ b/build/common.mk @@ -4027,7 +4027,11 @@ $(ESMF_LOCOBJDIR)/%.o : %.cpp .F90.$(ESMF_SL_SUFFIX): $(ESMF_F90COMPILEFREECPP_CMD) $(ESMF_SO_F90COMPILEOPTS) $< - $(ESMF_F90LINKER) $(ESMF_SO_F90LINKOPTS) $(ESMF_F90LINKOPTS) $(ESMF_F90LINKPATHS) $(ESMF_F90LINKRPATHS) -o $@ $*.o $(ESMF_F90ESMFLINKLIBS) + if [ $(ESMF_SL_SUFFIX) != "dll.a" ] ; then \ + $(ESMF_F90LINKER) $(ESMF_SO_F90LINKOPTS) $(ESMF_F90LINKOPTS) $(ESMF_F90LINKPATHS) $(ESMF_F90LINKRPATHS) -o $@ $*.o $(ESMF_F90ESMFLINKLIBS); \ + else \ + $(ESMF_F90LINKER) $(ESMF_SO_F90LINKOPTS) $(ESMF_F90LINKOPTS) $(ESMF_F90LINKPATHS) -shared -o $(@:.dll.a=.dll) -Wl,--out-implib=$@ -Wl,--export-all-symbols -Wl,--whole-archive $*.o -Wl,--no-whole-archive $(ESMF_F90ESMFLINKLIBS); \ + fi; .F90.$(ESMF_LIB_SUFFIX): $(ESMF_F90COMPILEFREECPP_CMD) $< @@ -4127,12 +4131,17 @@ shared: echo Converting $$NEXTLIB.a to $$NEXTLIB.$(ESMF_SL_SUFFIX) ;\ mkdir tmp_$$NEXTLIB ;\ cd tmp_$$NEXTLIB ;\ - $(ESMF_AREXTRACT) ../$$NEXTLIB.$(ESMF_LIB_SUFFIX) ;\ - echo $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB.$(ESMF_SL_SUFFIX) *.o $(ESMF_SL_LIBLIBS) ;\ - $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB.$(ESMF_SL_SUFFIX) *.o $(ESMF_SL_LIBLIBS) ;\ - echo Converting $$NEXTLIB.$(ESMF_SL_SUFFIX) to $$NEXTLIB\_fullylinked.$(ESMF_SL_SUFFIX) ;\ - echo $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB\_fullylinked.$(ESMF_SL_SUFFIX) *.o $(ESMF_CXXLINKOPTS) $(ESMF_CXXLINKPATHS) $(ESMF_CXXLINKRPATHS) $(ESMF_CXXLINKLIBS) ;\ - $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB\_fullylinked.$(ESMF_SL_SUFFIX) *.o $(ESMF_CXXLINKOPTS) $(ESMF_CXXLINKPATHS) $(ESMF_CXXLINKRPATHS) $(ESMF_CXXLINKLIBS) ;\ + $(ESMF_AREXTRACT) ../$$NEXTLIB.$(ESMF_LIB_SUFFIX) ;\ + if [ $(ESMF_SL_SUFFIX) != "dll.a" ] ; then \ + echo $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB.$(ESMF_SL_SUFFIX) *.o $(ESMF_SL_LIBLIBS) ;\ + $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB.$(ESMF_SL_SUFFIX) *.o $(ESMF_SL_LIBLIBS) ;\ + echo Converting $$NEXTLIB.$(ESMF_SL_SUFFIX) to $$NEXTLIB\_fullylinked.$(ESMF_SL_SUFFIX) ;\ + echo $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB\_fullylinked.$(ESMF_SL_SUFFIX) *.o $(ESMF_CXXLINKOPTS) $(ESMF_CXXLINKPATHS) $(ESMF_CXXLINKRPATHS) $(ESMF_CXXLINKLIBS) ;\ + $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/$$NEXTLIB\_fullylinked.$(ESMF_SL_SUFFIX) *.o $(ESMF_CXXLINKOPTS) $(ESMF_CXXLINKPATHS) $(ESMF_CXXLINKRPATHS) $(ESMF_CXXLINKLIBS) ;\ + else \ + echo $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/cyg$${NEXTLIB#lib}\.dll -Wl,--out-implib=$(ESMF_LDIR)/$$NEXTLIB\.dll.a -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--whole-archive *.o -Wl,--no-whole-archive $(ESMF_CXXLINKOPTS) $(ESMF_CXXLINKPATHS) $(ESMF_CXXLINKRPATHS) $(ESMF_CXXLINKLIBS) ;\ + $(ESMF_SL_LIBLINKER) $(ESMF_SL_LIBOPTS) -o $(ESMF_LDIR)/cyg$${NEXTLIB#lib}\.dll -Wl,--out-implib=$(ESMF_LDIR)/$$NEXTLIB\.dll.a -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--whole-archive *.o -Wl,--no-whole-archive $(ESMF_CXXLINKOPTS) $(ESMF_CXXLINKPATHS) $(ESMF_CXXLINKRPATHS) $(ESMF_CXXLINKLIBS) ;\ + fi ;\ cd .. ;\ $(ESMF_RM) -r tmp_$$NEXTLIB ;\ fi ;\ diff --git a/build_config/Cygwin.gfortran.default/build_rules.mk b/build_config/Cygwin.gfortran.default/build_rules.mk index 7fad49a1eb..26805e3abe 100644 --- a/build_config/Cygwin.gfortran.default/build_rules.mk +++ b/build_config/Cygwin.gfortran.default/build_rules.mk @@ -9,6 +9,7 @@ ESMF_F90DEFAULT = gfortran ESMF_CXXDEFAULT = g++ ESMF_CDEFAULT = gcc +ESMF_CXXCOMPILECPPFLAGS+= -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L ############################################################ # Default MPI setting. @@ -115,8 +116,8 @@ ESMF_CXXOPTFLAG_G += -Wall -Wextra -Wno-unused ############################################################ # Cygwin 1.5.24 does not yet support POSIX IPC (memory mapped files) -# -ESMF_CXXCOMPILECPPFLAGS += -DESMF_NO_POSIXIPC +# Cygwin 3.4.9 might +# ESMF_CXXCOMPILECPPFLAGS += -DESMF_NO_POSIXIPC ############################################################ # Fortran symbol convention