Can check config/BuildSystem/config/packages/hypre.py petsc-3.19 (or release branch) is compatible with hypre 2.28.0, petsc 'main' branch with 2.29.0
Satish On Thu, 20 Jul 2023, Barry Smith via petsc-users wrote: > > You cannot use this version of PETSc, 3.19, with the version of hypre you > installed. In hypre they recently changed hypre_Error from an integer to a > struct which completely breaks compatibility with previous versions of hypre > (and hence previous versions of PETSc). You must use the main git branch of > PETSc with the version of hypre you installed. > > Barry > > > > On Jul 20, 2023, at 5:10 AM, Daniel Stone <daniel.st...@opengosim.com> > > wrote: > > > > Hi All, > > > > Many thanks for the detailed explainations and ideas! > > > > I tried skipping the test. When it came time to do the build itself (make > > $PETSC_DIR... all) I get some failures, unsurprisingly: > > > > -------------------------------- > > > > FC arch-mswin-c-opt/obj/dm/f90-mod/petscdmplexmod.o > > CC arch-mswin-c-opt/obj/ksp/pc/impls/hypre/ftn-custom/zhypref.o > > CC arch-mswin-c-opt/obj/ksp/pc/impls/hypre/ftn-auto/hypref.o > > CC arch-mswin-c-opt/obj/ksp/pc/impls/hypre/hypre.o > > C:\cygwin64\home\DANIEL~1\PETSC_~1.1\src\ksp\pc\impls\hypre\hypre.c(444,29): > > error: assigning to 'hypre_Error' from incompatible type 'int' > > hypre__global_error = 0; > > ^ ~ > > C:\cygwin64\home\DANIEL~1\PETSC_~1.1\include\petscerror.h(1752,7): note: > > expanded from macro 'PetscStackCallExternalVoid' > > __VA_ARGS__; \ > > ^~~~~~~~~~~ > > C:\cygwin64\home\DANIEL~1\PETSC_~1.1\src\ksp\pc\impls\hypre\hypre.c(634,29): > > error: assigning to 'hypre_Error' from incompatible type 'int' > > hypre__global_error = 0; > > ^ ~ > > C:\cygwin64\home\DANIEL~1\PETSC_~1.1\include\petscerror.h(1752,7): note: > > expanded from macro 'PetscStackCallExternalVoid' > > __VA_ARGS__; \ > > ^~~~~~~~~~~ > > 2 errors generated. > > make[3]: *** [gmakefile:195: > > arch-mswin-c-opt/obj/ksp/pc/impls/hypre/hypre.o] Error 1 > > make[3]: *** Waiting for unfinished jobs.... > > FC arch-mswin-c-opt/obj/ksp/f90-mod/petsckspdefmod.o > > CC arch-mswin-c-opt/obj/dm/impls/da/hypre/mhyp.o > > CC arch-mswin-c-opt/obj/mat/impls/hypre/mhypre.o > > make[3]: Leaving directory '/home/DanielOGS/petsc_ogs_3.19.1' > > make[2]: *** [/home/DanielOGS/petsc_ogs_3.19.1/lib/petsc/conf/rules.doc:28: > > libs] Error 2 > > make[2]: Leaving directory '/home/DanielOGS/petsc_ogs_3.19.1' > > **************************ERROR************************************* > > Error during compile, check arch-mswin-c-opt/lib/petsc/conf/make.log > > Send it and arch-mswin-c-opt/lib/petsc/conf/configure.log to > > petsc-ma...@mcs.anl.gov <mailto:petsc-ma...@mcs.anl.gov> > > ******************************************************************** > > Finishing make run at Wed, 19 Jul 2023 17:07:00 +0100 > > > > ---------------------------------------- > > > > But wait - isn't this the compile stage, not the linking stage? This seems > > to imply that I've made a hash of providing include file such that a > > definition of "hypre_Error" > > cannot be seen - unless I'm misinterpreting. Interesting note about Hypre > > and include files - if built using configure and make, all the include > > files are conviniently copied > > into hypre/src/hypre/include. This is not done for a cmake build - I had to > > do the copying myself. Maybe I missed one. > > > > > > On shared vs. static - if there a clear way of telling which I've ended up > > with? I've checked the cmakelists for hypre and this seems to imply that > > not-shared is the default, > > which I didn't change: > > > > # Configuration options > > option(HYPRE_ENABLE_SHARED "Build a shared library" OFF) > > option(HYPRE_ENABLE_BIGINT "Use long long int for HYPRE_Int" OFF) > > option(HYPRE_ENABLE_MIXEDINT "Use long long int for HYPRE_BigInt, > > int for HYPRE_INT" OFF) > > [....] > > > > > > checking again, I've noticed that the way that the stub-test fails is > > different depending on whether it's called from the config script or used > > in isolation - more details on that soon. > > > > > > > > Thanks again, > > > > Daniel > > > > > > > > On Wed, Jul 19, 2023 at 4:58 PM Satish Balay via petsc-users > > <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>> wrote: > >> I think it should work with static libraries and 64bit compilers. > >> > >> That's how I think --download-f2cblaslapack [etc] work. > >> > >> Also it works with MS-MPI - even-though its a dll install, the library > >> stub provides this symbol somehow.. > >> > >> balay@ps5 /cygdrive/c/Program Files (x86)/Microsoft SDKs/MPI/Lib/x64 > >> $ nm -Ao msmpi.lib |grep " MPI_Init" > >> msmpi.lib:msmpi.dll:0000000000000000 T MPI_Init > >> msmpi.lib:msmpi.dll:0000000000000000 T MPI_Init_thread > >> msmpi.lib:msmpi.dll:0000000000000000 T MPI_Initialized > >> > >> However - if the library symbol is somehow mangled - this configure mode > >> of checking library functions will fail. > >> > >> Checking PETSc dll build: > >> > >> balay@ps5 ~/petsc/arch-ci-mswin-uni/lib > >> $ nm -Ao libpetsc.lib |grep MatCreateSeqAIJWithArrays > >> libpetsc.lib:libpetsc.dll:0000000000000000 I > >> __imp_MatCreateSeqAIJWithArrays > >> libpetsc.lib:libpetsc.dll:0000000000000000 T MatCreateSeqAIJWithArrays > >> > >> It also has the unmangled symbol - so I guess this mode can work generally > >> with dlls. > >> > >> Satish > >> > >> > >> On Wed, 19 Jul 2023, Barry Smith wrote: > >> > >> > > >> > Satish, > >> > > >> > So it will always fail on Windows with Windows compilers (both with > >> > static and shared libraries)? Is this true for all PETSc external > >> > packages? If so, why does the installation documentation say that some > >> > external packages can work with Windows compilers? (Presumably PETSc > >> > cannot since the configure tests will fail). > >> > > >> > Barry > >> > > >> > > >> > > On Jul 19, 2023, at 11:40 AM, Satish Balay <ba...@mcs.anl.gov > >> > > <mailto:ba...@mcs.anl.gov>> wrote: > >> > > > >> > > BTW: Some explanation of configure: > >> > > > >> > > It attempts the following on linux: > >> > > > >> > >>>>>>> > >> > > Source: > >> > > #include "confdefs.h" > >> > > #include "conffix.h" > >> > > /* Override any gcc2 internal prototype to avoid an error. */ > >> > > char HYPRE_IJMatrixCreate(); > >> > > static void _check_HYPRE_IJMatrixCreate() { HYPRE_IJMatrixCreate(); } > >> > > > >> > > int main(void) { > >> > > _check_HYPRE_IJMatrixCreate(); > >> > > return 0; > >> > > } > >> > > <<<<<<< > >> > > > >> > > Note - it does not include 'HYPRE.h' here - but redefines the > >> > > prototype as 'char HYPRE_IJMatrixCreate(); > >> > > > >> > > Compiling it manually: > >> > > > >> > >>>>> > >> > > [balay@pj01 petsc]$ cat conftest.c > >> > > char HYPRE_IJMatrixCreate(); > >> > > static void _check_HYPRE_IJMatrixCreate() { HYPRE_IJMatrixCreate(); } > >> > > > >> > > int main(void) { > >> > > _check_HYPRE_IJMatrixCreate(); > >> > > return 0; > >> > > } > >> > > [balay@pj01 petsc]$ gcc -c conftest.c > >> > > [balay@pj01 petsc]$ nm -Ao conftest.o |grep HYPRE_IJMatrixCreate > >> > > conftest.o:0000000000000000 t _check_HYPRE_IJMatrixCreate > >> > > conftest.o: U HYPRE_IJMatrixCreate > >> > > [balay@pj01 petsc]$ nm -Ao arch-linux-c-debug/lib/libHYPRE.so |grep > >> > > HYPRE_IJMatrixCreate > >> > > arch-linux-c-debug/lib/libHYPRE.so:000000000007f2c2 T > >> > > HYPRE_IJMatrixCreate > >> > > [balay@pj01 petsc]$ > >> > > <<<< > >> > > > >> > > Here the "U HYPRE_IJMatrixCreate" in conftest.o matches "T > >> > > HYPRE_IJMatrixCreate" in libHYPRE.so - so the "link" test in configure > >> > > succeeds! > >> > > > >> > >>>>>>> > >> > > [balay@pj01 petsc]$ gcc -o conftest conftest.o > >> > > arch-linux-c-debug/lib/libHYPRE.so > >> > > [balay@pj01 petsc]$ echo $? > >> > > 0 > >> > > <<<<< > >> > > > >> > > On windows - [due to name mangling by cdecl/stdcall, (/MT vs /MD) > >> > > etc..] - this might not match - resulting in link failures. > >> > > > >> > > Satish > >> > > > >> > > > >> > > On Wed, 19 Jul 2023, Satish Balay via petsc-users wrote: > >> > > > >> > >> You could try skipping this test [and assume --with-hypre-include and > >> > >> --with-hypre-lib options are correct] - and see if this works. > >> > >> > >> > >> diff --git a/config/BuildSystem/config/packages/hypre.py > >> > >> b/config/BuildSystem/config/packages/hypre.py > >> > >> index 5bc88322aa2..2d6c7932e17 100644 > >> > >> --- a/config/BuildSystem/config/packages/hypre.py > >> > >> +++ b/config/BuildSystem/config/packages/hypre.py > >> > >> @@ -11,7 +11,7 @@ class Configure(config.package.GNUPackage): > >> > >> self.requiresversion = 1 > >> > >> self.gitcommit = 'v'+self.version > >> > >> self.download = > >> > >> ['git://https://github.com/hypre-space/hypre','https://github.com/hypre-space/hypre/archive/'+self.gitcommit+'.tar.gz'] > >> > >> - self.functions = ['HYPRE_IJMatrixCreate'] > >> > >> + self.functions = [] > >> > >> self.includes = ['HYPRE.h'] > >> > >> self.liblist = [['libHYPRE.a']] > >> > >> self.buildLanguages = ['C','Cxx'] > >> > >> > >> > >> > >> > >> Satish > >> > >> > >> > >> > >> > >> On Wed, 19 Jul 2023, Barry Smith wrote: > >> > >> > >> > >>> > >> > >>> You don't indicate what type of libraries you built hypre with; > >> > >>> static or shared. My guess is you ended up with shared > >> > >>> > >> > >>> I think the answer to your difficulty is hidden in __cdecl (Satish > >> > >>> will know much better than me). When you are looking for symbols in > >> > >>> Windows shared libraries you have to prepend something to the > >> > >>> function prototype to have it successfully found. For example the > >> > >>> PETSc include files have these things __declspec(dllimport) The > >> > >>> configure test fails because it does not provide the needed > >> > >>> prototype. Likely you built PTScotch with static libraries so no > >> > >>> problem. > >> > >>> > >> > >>> The simplest fix would be to build static hypre libraries. I think > >> > >>> it is a major project to get PETSc configure and macro system to > >> > >>> work properly with external packages that are in Windows shared > >> > >>> libraries since more use of __declspec would be needed. > >> > >>> > >> > >>> Barry > >> > >>> > >> > >>> The PETSc installation instructions should probably say something > >> > >>> about external packages with Windows shared libraries. > >> > >>> > >> > >>> > >> > >>> > >> > >>> > >> > >>> > >> > >>> > >> > >>> > >> > >>>> On Jul 19, 2023, at 10:52 AM, Daniel Stone > >> > >>>> <daniel.st...@opengosim.com <mailto:daniel.st...@opengosim.com>> > >> > >>>> wrote: > >> > >>>> > >> > >>>> Hello, > >> > >>>> > >> > >>>> I'm working on getting a petsc build running on windows. One > >> > >>>> necessary package to include is Hypre. I've been able to build > >> > >>>> Hypre seperately using cmake, and confirmed that the library works > >> > >>>> by setting up a VS project to run some of the example programs. > >> > >>>> > >> > >>>> My attempted petsc build is being done through cygwin. I've been > >> > >>>> able to (with varying degrees of difficulty), build a fairly plain > >> > >>>> petsc, and one that downloads and builds ptscotch (after some > >> > >>>> modifications > >> > >>>> to both ptscotch and the config script). I am now attempting to > >> > >>>> include Hypre (using the --hypre-iclude and --hypre-lib flags, > >> > >>>> etc). Note that the same compilers are being used for both Hypre > >> > >>>> and for petsc > >> > >>>> through cygwin - the new intel oneapi compilers (icx and ifx, after > >> > >>>> again varying amounts of pain to work around their awkwardness with > >> > >>>> the config script). > >> > >>>> > >> > >>>> I'm seeing a problem when the config script does some tests on the > >> > >>>> included hypre lib. The source code looks like: > >> > >>>> > >> > >>>> #include "confdefs.h" > >> > >>>> #include "conffix.h" > >> > >>>> /* Override any gcc2 internal prototype to avoid an error. */ > >> > >>>> > >> > >>>> #include "HYPRE.h" > >> > >>>> > >> > >>>> char HYPRE_IJMatrixCreate(); > >> > >>>> static void _check_HYPRE_IJMatrixCreate() { HYPRE_IJMatrixCreate(); > >> > >>>> } > >> > >>>> > >> > >>>> int main() { > >> > >>>> _check_HYPRE_IJMatrixCreate();; > >> > >>>> return 0; > >> > >>>> } > >> > >>>> > >> > >>>> > >> > >>>> As I understand this is a fairly standard type of stub program used > >> > >>>> by the config script to check that it is able to link to certain > >> > >>>> symbols in given libraries. Tests like this have succeeded in my > >> > >>>> builds that > >> > >>>> include PTScotch. > >> > >>>> > >> > >>>> I keep getting a linker error with the above test, including if I > >> > >>>> seperate it out and try to build it seperately: > >> > >>>> > >> > >>>> unresolved external symbol "char __cdel HYPRE_IJMatrixCreate(void)" > >> > >>>> .... > >> > >>>> > >> > >>>> Ok, it looks like a problem with either the library or linker > >> > >>>> commands. But here's the interesting thing - If I transplant this > >> > >>>> code into VS, with the same project setting that allows it to build > >> > >>>> the much more > >> > >>>> nontrivial Hypre example programs, I get the same error: > >> > >>>> > >> > >>>> Error LNK2001 unresolved external symbol "char __cdecl > >> > >>>> HYPRE_IJMatrixCreate(void)" (?HYPRE_IJMatrixCreate@@YADXZ) > >> > >>>> hypretry1 > >> > >>>> C:\Users\DanielOGS\source\repos\hypretry1\hypretry1\Source.obj 1 > >> > >>>> > >> > >>>> So it seems like there might be something about this type of stub > >> > >>>> program that is not working with my Hypre library. I don't fully > >> > >>>> understand this program - it's able to call the function with no > >> > >>>> arguments, but > >> > >>>> it also needs to be linked against a library containing the > >> > >>>> function, apparently by wrapping it in a static void function? Not > >> > >>>> something I've seen before. > >> > >>>> > >> > >>>> Does anyone have any insight into what might be going wrong - or > >> > >>>> really just any explaination of how the stub program works so I can > >> > >>>> figure out why it isn't in this case? > >> > >>>> > >> > >>>> Many thanks, > >> > >>>> > >> > >>>> Daniel > >> > >>> > >> > >>> > >> > >> > >> > > > >> > > >> > >