haskell-numerics / hmatrix

Linear algebra and numerical computation
379 stars 105 forks source link

Build fails on DragonflyBSD; `struct random_data` not defined #355

Open falsifian opened 3 years ago

falsifian commented 3 years ago

Just tried to use HMatrix on current DragonflyBSD. Here's what I see. (My file nc.cabal lists hmatrix as a dependency.)

This seems similar to #125. I guess struct random_data is a Linux-only thing.

falsifian angel-dfly 425 $ cabal run -j3 nc
Build profile: -w ghc-8.10.4 -O1
In order, the following will be built (use -v for more details):
 - hmatrix-0.20.2 (lib) (requires build)
 - narrow-cat-0.0.0.0 (exe:nc) (configuration changed)
Starting     hmatrix-0.20.2 (lib)
Building     hmatrix-0.20.2 (lib)

Failed to build hmatrix-0.20.2.
Build log (
/home/falsifian/.cabal/logs/ghc-8.10.4/hmatrix-0.20.2-13494f88f3af7b29e049cca0a66b4fef8a08d7a860eda39d9872ccbe1a75c79b.log
):
Configuring library for hmatrix-0.20.2..
Preprocessing library for hmatrix-0.20.2..
Building library for hmatrix-0.20.2..
[ 1 of 27] Compiling Internal.Vector  ( src/Internal/Vector.hs, dist/build/Internal/Vector.o, dist/build/Internal/Vector.dyn_o )
[ 2 of 27] Compiling Internal.Devel   ( src/Internal/Devel.hs, dist/build/Internal/Devel.o, dist/build/Internal/Devel.dyn_o )
[ 3 of 27] Compiling Internal.Vectorized ( src/Internal/Vectorized.hs, dist/build/Internal/Vectorized.o, dist/build/Internal/Vectorized.dyn_o )
[ 4 of 27] Compiling Internal.Matrix  ( src/Internal/Matrix.hs, dist/build/Internal/Matrix.o, dist/build/Internal/Matrix.dyn_o )
[ 5 of 27] Compiling Internal.ST      ( src/Internal/ST.hs, dist/build/Internal/ST.o, dist/build/Internal/ST.dyn_o )
[ 6 of 27] Compiling Internal.IO      ( src/Internal/IO.hs, dist/build/Internal/IO.o, dist/build/Internal/IO.dyn_o )
[ 7 of 27] Compiling Internal.Element ( src/Internal/Element.hs, dist/build/Internal/Element.o, dist/build/Internal/Element.dyn_o )
[ 8 of 27] Compiling Internal.Conversion ( src/Internal/Conversion.hs, dist/build/Internal/Conversion.o, dist/build/Internal/Conversion.dyn_o )
[ 9 of 27] Compiling Internal.LAPACK  ( src/Internal/LAPACK.hs, dist/build/Internal/LAPACK.o, dist/build/Internal/LAPACK.dyn_o )
[10 of 27] Compiling Internal.Numeric ( src/Internal/Numeric.hs, dist/build/Internal/Numeric.o, dist/build/Internal/Numeric.dyn_o )
[11 of 27] Compiling Internal.Sparse  ( src/Internal/Sparse.hs, dist/build/Internal/Sparse.o, dist/build/Internal/Sparse.dyn_o )
[12 of 27] Compiling Internal.Chain   ( src/Internal/Chain.hs, dist/build/Internal/Chain.o, dist/build/Internal/Chain.dyn_o )
[13 of 27] Compiling Internal.Algorithms ( src/Internal/Algorithms.hs, dist/build/Internal/Algorithms.o, dist/build/Internal/Algorithms.dyn_o )
[14 of 27] Compiling Internal.Random  ( src/Internal/Random.hs, dist/build/Internal/Random.o, dist/build/Internal/Random.dyn_o )
[15 of 27] Compiling Internal.Container ( src/Internal/Container.hs, dist/build/Internal/Container.o, dist/build/Internal/Container.dyn_o )
[16 of 27] Compiling Internal.Convolution ( src/Internal/Convolution.hs, dist/build/Internal/Convolution.o, dist/build/Internal/Convolution.dyn_o )
[17 of 27] Compiling Numeric.LinearAlgebra.Devel ( src/Numeric/LinearAlgebra/Devel.hs, dist/build/Numeric/LinearAlgebra/Devel.o, dist/build/Numeric/LinearAlgebra/Devel.dyn_o )
[18 of 27] Compiling Numeric.Matrix   ( src/Numeric/Matrix.hs, dist/build/Numeric/Matrix.o, dist/build/Numeric/Matrix.dyn_o )
[19 of 27] Compiling Numeric.Vector   ( src/Numeric/Vector.hs, dist/build/Numeric/Vector.o, dist/build/Numeric/Vector.dyn_o )
[20 of 27] Compiling Internal.Util    ( src/Internal/Util.hs, dist/build/Internal/Util.o, dist/build/Internal/Util.dyn_o )
[21 of 27] Compiling Internal.Modular ( src/Internal/Modular.hs, dist/build/Internal/Modular.o, dist/build/Internal/Modular.dyn_o )
[22 of 27] Compiling Numeric.LinearAlgebra.Data ( src/Numeric/LinearAlgebra/Data.hs, dist/build/Numeric/LinearAlgebra/Data.o, dist/build/Numeric/LinearAlgebra/Data.dyn_o )
[23 of 27] Compiling Internal.CG      ( src/Internal/CG.hs, dist/build/Internal/CG.o, dist/build/Internal/CG.dyn_o )
[24 of 27] Compiling Numeric.LinearAlgebra ( src/Numeric/LinearAlgebra.hs, dist/build/Numeric/LinearAlgebra.o, dist/build/Numeric/LinearAlgebra.dyn_o )
[25 of 27] Compiling Numeric.LinearAlgebra.HMatrix ( src/Numeric/LinearAlgebra/HMatrix.hs, dist/build/Numeric/LinearAlgebra/HMatrix.o, dist/build/Numeric/LinearAlgebra/HMatrix.dyn_o )
[26 of 27] Compiling Internal.Static  ( src/Internal/Static.hs, dist/build/Internal/Static.o, dist/build/Internal/Static.dyn_o )
[27 of 27] Compiling Numeric.LinearAlgebra.Static ( src/Numeric/LinearAlgebra/Static.hs, dist/build/Numeric/LinearAlgebra/Static.o, dist/build/Numeric/LinearAlgebra/Static.dyn_o )

src/Internal/C/vector-aux.c:1077:30: error:
     warning: 'struct random_data' declared inside parameter list will not be visible outside of this definition or declaration
     inline double urandom(struct random_data * buffer) {
                                  ^~~~~~~~~~~
     |
1077 | inline double urandom(struct random_data * buffer) {
     |                              ^
src/Internal/C/vector-aux.c: In function 'urandom':

src/Internal/C/vector-aux.c:1079:5: error:
     warning: implicit declaration of function 'random_r'; did you mean 'random'? [-Wimplicit-function-declaration]
         random_r(buffer,&res);
         ^~~~~~~~
         random
     |
1079 |     random_r(buffer,&res);
     |     ^
src/Internal/C/vector-aux.c: At top level:

src/Internal/C/vector-aux.c:1085:25: error:
     warning: 'struct random_data' declared inside parameter list will not be visible outside of this definition or declaration
     double gaussrand(struct random_data *buffer,
                             ^~~~~~~~~~~
     |
1085 | double gaussrand(struct random_data *buffer,
     |                         ^
src/Internal/C/vector-aux.c: In function 'gaussrand':

src/Internal/C/vector-aux.c:1093:33: error:
     warning: passing argument 1 of 'urandom' from incompatible pointer type [-Wincompatible-pointer-types]
                 double U1 = urandom(buffer);
                                     ^~~~~~
     |
1093 |             double U1 = urandom(buffer);
     |                                 ^

src/Internal/C/vector-aux.c:1077:44: error:
     note: expected 'struct random_data *' but argument is of type 'struct random_data *'
     inline double urandom(struct random_data * buffer) {
                           ~~~~~~~~~~~~~~~~~~~~~^~~~~~
     |
1077 | inline double urandom(struct random_data * buffer) {
     |                                            ^

src/Internal/C/vector-aux.c:1094:24: error:
     warning: passing argument 1 of 'urandom' from incompatible pointer type [-Wincompatible-pointer-types]
        double U2 = urandom(buffer);
                            ^~~~~~
     |
1094 |                         double U2 = urandom(buffer);
     |                        ^

src/Internal/C/vector-aux.c:1077:44: error:
     note: expected 'struct random_data *' but argument is of type 'struct random_data *'
     inline double urandom(struct random_data * buffer) {
                           ~~~~~~~~~~~~~~~~~~~~~^~~~~~
     |
1077 | inline double urandom(struct random_data * buffer) {
     |                                            ^
src/Internal/C/vector-aux.c: In function 'random_vector':

src/Internal/C/vector-aux.c:1113:24: error:
     error: storage size of 'buffer' isn't known
         struct random_data buffer;
                            ^~~~~~
     |
1113 |     struct random_data buffer;
     |                        ^

src/Internal/C/vector-aux.c:1115:31: error:
     error: invalid application of 'sizeof' to incomplete type 'struct random_data'
         memset(&buffer, 0, sizeof(struct random_data));
                                   ^~~~~~
     |
1115 |     memset(&buffer, 0, sizeof(struct random_data));
     |                               ^

src/Internal/C/vector-aux.c:1118:5: error:
     warning: implicit declaration of function 'initstate_r'; did you mean 'initstate'? [-Wimplicit-function-declaration]
         initstate_r(seed,random_state,sizeof(random_state),&buffer);
         ^~~~~~~~~~~
         initstate
     |
1118 |     initstate_r(seed,random_state,sizeof(random_state),&buffer);
     |     ^

src/Internal/C/vector-aux.c:1113:24: error:
     warning: unused variable 'buffer' [-Wunused-variable]
         struct random_data buffer;
                            ^~~~~~
     |
1113 |     struct random_data buffer;
     |                        ^
`cc' failed in phase `C Compiler'. (Exit code: 1)
cabal: Failed to build hmatrix-0.20.2 (which is required by exe:nc from
narrow-cat-0.0.0.0). See the build log above for details.
falsifian commented 3 years ago

I'm able to run a very simple program (just prints a matrix) after doing two things:

HuwCampbell commented 3 years ago

I'd be happy to accept a patch adding support for DragonflyBSD.

The random conditional compilation bits need a bit of a clean up, but I believe that you should add dragonfly to the lists in vector-aux.c as well.