Build fails on PowerPC (ppc32) almost immediately on encoded_s2shape_index.cc
barracuda156 opened this issue · 34 comments
Unfortunately, there is no meaningful error output, it just fails:
[ 3%] Building CXX object CMakeFiles/s2.dir/src/s2/encoded_s2shape_index.cc.o
/opt/local/bin/g++-mp-12 -DABSL_MIN_LOG_LEVEL=1 -Ds2_EXPORTS -I/opt/local/libexec/openssl11/include -I/opt/local/var/macports/build/_opt_PPCRosettaPorts_math_s2/s2/work/s2geometry-0.10.0/src -isystem /opt/local/include -pipe -I/opt/local/libexec/openssl11/include -Os -mone-byte-bool -DNDEBUG -I/opt/local/libexec/openssl11/include -isystem/opt/local/include -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14 -arch ppc -mmacosx-version-min=10.6 -fPIC -Wno-attributes -Wno-deprecated-declarations -MD -MT CMakeFiles/s2.dir/src/s2/encoded_s2shape_index.cc.o -MF CMakeFiles/s2.dir/src/s2/encoded_s2shape_index.cc.o.d -o CMakeFiles/s2.dir/src/s2/encoded_s2shape_index.cc.o -c /opt/local/var/macports/build/_opt_PPCRosettaPorts_math_s2/s2/work/s2geometry-0.10.0/src/s2/encoded_s2shape_index.cc
make[2]: *** [CMakeFiles/s2.dir/src/s2/encoded_s2shape_index.cc.o] Error 1
Here I use external abseil
, but same story when I tried to build R-s2
(with bundled abseil
), build immediately fails when begins compiling s2
: r-spatial/s2#235
Something is very wrong in some basic settings or assumptions. It should not fail this way, even if Big endian is not propertly supported down the road.
@jmr Any thoughts what may be failing?
P. S. -mone-byte-bool
is passed to bypass broken static asserts in endian.h
– they assume 1 byte bool, yet on Darwin ppc32 bool is 4 bytes.
This is a gcc bug, right? Does it work with gcc 13 or clang?
Also try make -k
to see which targets fail. (Probably most, since it only got 3% of the way through.)
Pick a small target and start commenting parts out until you have a minimal example. Then you can file a gcc bug report.
@jmr I will try. Clang is not an option, it is broken for Darwin ppc (never worked), but I can try an array of GCC versions.
At the moment I suspect it is rather either some wrong assumptions made implicitly which are wrong for the given arch, or wrong assembler insns creeping in from abseil
. If only I could get exact output on failure, it will probably be fixable.
But it is not impossible for GCC to have a bug either, of course.
Is the CMake-generated Makefile suppressing some output? Do you see more if you just run the gcc command yourself?
Is the CMake-generated Makefile suppressing some output? Do you see more if you just run the gcc command yourself?
GCC on its own literally gives zero output – as if command completes, but nothing is generated. Tried also gcc11, same result.
I can get a pre-processed source though, if that is helpful (with -v -save-temps
):
encoded_s2shape_index.cc.ii.zip
gcc should either produce the .o
file and return 0, or give a useful failure message and return non-0. Silently returning non-zero with no output and no diagnostic messages sounds like a gcc bug to me.
Here's what I would suggest:
- Use
make -k
to see which files fail and which succeed. Try to find a find a short failure, like maybes2debug.cc
ors1angle.cc
or something like that. - Compile with
g++ --verbose
to see if you can get more info about what step is failing. Compare a working target to a broken one. - Start deleting parts of the input file to narrow down the cause.
- When you have a minimal reproduction of the bug, report to gcc: https://gcc.gnu.org/bugs/
I can get a pre-processed source though, if that is helpful (with -v -save-temps):
encoded_s2shape_index.cc.ii.zip
@jmr Oh well, I should have tried running it on PPC natively. I got meaningful output there:
/opt/local/bin/g++-mp-12 -std=gnu++11 -I"/opt/local/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I../src -DSTRICT_R_HEADERS -I'/opt/local/Library/Frameworks/R.framework/Versions/4.3/Resources/library/Rcpp/include' -I'/opt/local/Library/Frameworks/R.framework/Versions/4.3/Resources/library/wk/include' -isystem/opt/local/include/LegacySupport -I/opt/local/include -DOPENSSL_SUPPRESS_DEPRECATED -DIS_BIG_ENDIAN -pthread -fPIC -pipe -Os -arch ppc -c s2-accessors.cpp -o s2-accessors.o
In file included from ../src/s2/s2cell_id.h:36,
from ../src/s2/mutable_s2shape_index.h:34,
from ../src/s2/s2loop.h:31,
from ../src/s2/s2convex_hull_query.h:27,
from s2geography/accessors-geog.h:4,
from s2geography.h:4,
from geography.h:7,
from geography-operator.h:7,
from s2-accessors.cpp:2:
../src/s2/util/bits/bits.h: In static member function 'static uint8 Bits::ReverseBits8(unsigned char)':
../src/s2/util/bits/bits.h:510:36: warning: overflow in conversion from 'long long int' to 'long int' changes value from '4557147201846524216' to '993671480' [-Woverflow]
510 | uint64 result = __builtin_bpermd(0x3f3e3d3c3b3a3938, temp);
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h: In static member function 'static uint32 Bits::ReverseBits32(uint32)':
../src/s2/util/bits/bits.h:527:38: warning: overflow in conversion from 'long long int' to 'long int' changes value from '4557147201846524216' to '993671480' [-Woverflow]
527 | uint64 result_0 = __builtin_bpermd(0x3f3e3d3c3b3a3938, temp) << 24;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:528:38: warning: overflow in conversion from 'long long int' to 'long int' changes value from '3978425819141910832' to '858927408' [-Woverflow]
528 | uint64 result_1 = __builtin_bpermd(0x3736353433323130, temp) << 16;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:529:38: warning: overflow in conversion from 'long long int' to 'long int' changes value from '3399704436437297448' to '724183336' [-Woverflow]
529 | uint64 result_2 = __builtin_bpermd(0x2f2e2d2c2b2a2928, temp) << 8;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:530:38: warning: overflow in conversion from 'long long int' to 'long int' changes value from '2820983053732684064' to '589439264' [-Woverflow]
530 | uint64 result_3 = __builtin_bpermd(0x2726252423222120, temp);
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h: In static member function 'static uint64 Bits::ReverseBits64(uint64)':
../src/s2/util/bits/bits.h:546:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '4557147201846524216' to '993671480' [-Woverflow]
546 | uint64 result_lo0 = __builtin_bpermd(0x3f3e3d3c3b3a3938, n) << 56;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:546:63: warning: left shift count >= width of type [-Wshift-count-overflow]
546 | uint64 result_lo0 = __builtin_bpermd(0x3f3e3d3c3b3a3938, n) << 56;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../src/s2/util/bits/bits.h:547:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '3978425819141910832' to '858927408' [-Woverflow]
547 | uint64 result_lo1 = __builtin_bpermd(0x3736353433323130, n) << 48;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:547:63: warning: left shift count >= width of type [-Wshift-count-overflow]
547 | uint64 result_lo1 = __builtin_bpermd(0x3736353433323130, n) << 48;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../src/s2/util/bits/bits.h:548:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '3399704436437297448' to '724183336' [-Woverflow]
548 | uint64 result_lo2 = __builtin_bpermd(0x2f2e2d2c2b2a2928, n) << 40;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:548:63: warning: left shift count >= width of type [-Wshift-count-overflow]
548 | uint64 result_lo2 = __builtin_bpermd(0x2f2e2d2c2b2a2928, n) << 40;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../src/s2/util/bits/bits.h:549:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '2820983053732684064' to '589439264' [-Woverflow]
549 | uint64 result_lo3 = __builtin_bpermd(0x2726252423222120, n) << 32;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:549:63: warning: left shift count >= width of type [-Wshift-count-overflow]
549 | uint64 result_lo3 = __builtin_bpermd(0x2726252423222120, n) << 32;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../src/s2/util/bits/bits.h:550:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '2242261671028070680' to '454695192' [-Woverflow]
550 | uint64 result_hi0 = __builtin_bpermd(0x1f1e1d1c1b1a1918, n) << 24;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:551:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '1663540288323457296' to '319951120' [-Woverflow]
551 | uint64 result_hi1 = __builtin_bpermd(0x1716151413121110, n) << 16;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:552:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '1084818905618843912' to '185207048' [-Woverflow]
552 | uint64 result_hi2 = __builtin_bpermd(0x0f0e0d0c0b0a0908, n) << 8;
| ^~~~~~~~~~~~~~~~~~
../src/s2/util/bits/bits.h:553:40: warning: overflow in conversion from 'long long int' to 'long int' changes value from '506097522914230528' to '50462976' [-Woverflow]
553 | uint64 result_hi3 = __builtin_bpermd(0x0706050403020100, n);
| ^~~~~~~~~~~~~~~~~~
In file included from ../src/s2/util/coding/coder.h:33,
from ../src/s2/s2cell_id.h:37:
../src/s2/util/endian/endian.h: In static member function 'static T LittleEndian::Load(const char*) [with T = bool]':
../src/s2/util/endian/endian.h:773:30: error: static assertion failed: Unexpected sizeof(bool)
773 | static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
| ~~~~~~~~~~~~~^~~~
../src/s2/util/endian/endian.h:773:30: note: the comparison reduces to '(4 == 1)'
../src/s2/util/endian/endian.h: In static member function 'static void LittleEndian::Store(T, char*) [with T = bool]':
../src/s2/util/endian/endian.h:779:30: error: static assertion failed: Unexpected sizeof(bool)
779 | static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
| ~~~~~~~~~~~~~^~~~
../src/s2/util/endian/endian.h:779:30: note: the comparison reduces to '(4 == 1)'
../src/s2/util/endian/endian.h: In static member function 'static T BigEndian::Load(const char*) [with T = bool]':
../src/s2/util/endian/endian.h:785:30: error: static assertion failed: Unexpected sizeof(bool)
785 | static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
| ~~~~~~~~~~~~~^~~~
../src/s2/util/endian/endian.h:785:30: note: the comparison reduces to '(4 == 1)'
../src/s2/util/endian/endian.h: In static member function 'static void BigEndian::Store(T, char*) [with T = bool]':
../src/s2/util/endian/endian.h:791:30: error: static assertion failed: Unexpected sizeof(bool)
791 | static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
| ~~~~~~~~~~~~~^~~~
../src/s2/util/endian/endian.h:791:30: note: the comparison reduces to '(4 == 1)'
make: *** [s2-accessors.o] Error 1
ERROR: compilation failed for package ‘s2’
So to begin with, wrong assumption about size of bool – this is where is fails.
@jmr UPD. Ah, this is my mistake with __builtin_bpermd
in fact, I accidentally added __ppc__
there without checking for ISA support.
../src/s2/util/bits/bits.h: In static member function 'static uint8 Bits::ReverseBits8(unsigned char)':
../src/s2/util/bits/bits.h:510:36: warning: overflow in conversion from 'long long int' to 'long int' changes value from '4557147201846524216' to '993671480' [-Woverflow]
510 | uint64 result = __builtin_bpermd(0x3f3e3d3c3b3a3938, temp);
| ^~~~~~~~~~~~~~~~~~
What version of s2geometry are you using? This code was deleted last year. Try HEAD
.
https://github.com/google/s2geometry/blob/master/src/s2/util/bits/bits.h
It looks like it's been a while since 0.10.0, so I should do another release soon.
Anyway, that's just a warning.
In file included from ../src/s2/util/coding/coder.h:33,
from ../src/s2/s2cell_id.h:37:
../src/s2/util/endian/endian.h: In static member function 'static T LittleEndian::Load(const char*) [with T = bool]':
../src/s2/util/endian/endian.h:773:30: error: static assertion failed: Unexpected sizeof(bool)
773 | static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
| ~~~~~~~~~~~~~^~~~
I thought you were compiling with -mone-byte-bool
. Can you try again using that?
@jmr I am building now the version which is used with R
– yes, I have seen it is quite outdated. I am not sure if API changed, so swapping a newer version into the R
package may not work correctly, I am afraid.
I can do a standalone build later on. After all, why not add s2geometry
port to Macports :)
P. S. Overflow warning are gone, that builtin was an unintended result of my own patch. I dropped it now and rebuilding. So far looks good, though it takes forever to build.
For -mone-byte-bool
, is it safe to use? GCC documentation has a warning that resulting code may not be compatible. We can just as well disable static asserts for Darwin PPC, I guess.
@jmr A quick update – the build just completed, linking failed, because -latomic
is not passed. I will add it now manually and run tests. Let’s see if it actually works and not just builds.
For
-mone-byte-bool
, is it safe to use? GCC documentation has a warning that resulting code may not be compatible.
It definitely is risky. If you call any other code with a bool argument that's compiled without the option, it won't work.
We can just as well disable static asserts for Darwin PPC, I guess.
Try wrapping all the functions with the static assert in #ifndef __PPC__
or whatever the right thing is. I don't think the bool versions are needed.
Oh well, I should have tried running it on PPC natively.
You were cross-compiling before? Please report this (no output, no useful error) upstream as a bug. It certainly wasted a bit of everyone's time.
Oh well, I should have tried running it on PPC natively.
You were cross-compiling before? Please report this (no output, no useful error) upstream as a bug. It certainly wasted a bit of everyone's time.
Not cross-, but in Rosetta (so OS emulates the arch, binaries run natively). But super-weird how it behaved there. I test numerous ports in Rosetta (because no G5 laptop, I cannot carry a PowerMac around, heh), GCC is normally sane there.
For
-mone-byte-bool
, is it safe to use? GCC documentation has a warning that resulting code may not be compatible.It definitely is risky. If you call any other code with a bool argument that's compiled without the option, it won't work.
We can just as well disable static asserts for Darwin PPC, I guess.
Try wrapping all the functions with the static assert in
#ifndef __PPC__
or whatever the right thing is. I don't think the bool versions are needed.
Yes, I already did that. Perhaps we can add a fix to the master? Correct macro with be:
#if !(defined(__MACH__) && defined(__ppc__))
Or __APPLE__
instead of __MACH__
.
4-byte bool is a specificity of Darwin 32-bit ABI, not PowerPC as such. So we do not need to disable it for Linux, for example.
@jmr Ran the tests (it is still an older version from R package), result are decent:
Running ‘testthat.R’
ERROR
Running the tests in ‘tests/testthat.R’ failed.
Last 13 lines of output:
1. └─s2:::expect_wkt_equal(...) at test-s2-transformers.R:180:2
2. └─testthat::expect_equal(...)
── Failure ('test-s2-transformers.R:476:3'): s2_buffer() works ─────────────────
abs(y - x) < epsilon is not TRUE
`actual`: FALSE
`expected`: TRUE
Backtrace:
▆
1. └─s2:::expect_near(s2_area(ply, radius = 1), 4 * pi/2, epsilon = 0.1) at test-s2-transformers.R:476:2
2. └─testthat::expect_true(abs(y - x) < epsilon)
[ FAIL 3 | WARN 0 | SKIP 0 | PASS 1072 ]
Perhaps precision threshold are too strict somewhere.
I don't know anything about the R package, so I can't help you there.
Does the s2geometry test suite pass?
I don't know anything about the R package, so I can't help you there.
Does the s2geometry test suite pass?
Let try building it.
(By the way, looking now at my portfile for s2geometry
which I used, seems that I tried passing -mone-byte-bool
and it did not help. Maybe something else also failed in Rosetta. Anyway, I will try building it on a PowerMac now.)
@jmr Could you advise me how to fix this?
[ 46%] Building CXX object CMakeFiles/s2.dir/src/s2/s2latlng.cc.o
/opt/local/bin/g++-mp-12 -DABSL_MIN_LOG_LEVEL=1 -Ds2_EXPORTS -I/opt/local/libexec/openssl11/include -I/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src -isystem /opt/local/include -pipe -I/opt/local/libexec/openssl11/include -Os -DNDEBUG -I/opt/local/libexec/openssl11/include -isystem/opt/local/include -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14 -arch ppc -mmacosx-version-min=10.6 -fPIC -Wno-attributes -Wno-deprecated-declarations -MD -MT CMakeFiles/s2.dir/src/s2/s2latlng.cc.o -MF CMakeFiles/s2.dir/src/s2/s2latlng.cc.o.d -o CMakeFiles/s2.dir/src/s2/s2latlng.cc.o -c /opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2latlng.cc
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2edge_crossings.cc: In instantiation of 'bool S2::internal::GetStableCrossProd(const Vector3<T>&, const Vector3<T>&, Vector3<T>*) [with T = long double]':
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2edge_crossings.cc:127:54: required from here
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2edge_crossings.cc:115:31: error: '(6.15348059642740421245081038903225e-15l / 5.40431955284459475358983848622456e+16l)' is not a constant expression
115 | (32 * kSqrt3 * DBL_ERR) /
| ~~~~~~~~~~~~~~~~~~~~~~~~^
116 | (kRobustCrossProdError.radians() / T_ERR - (1 + 2 * kSqrt3));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2edge_crossings.cc: In instantiation of 'bool S2::GetIntersectionSimple(const Vector3<T>&, const Vector3<T>&, const Vector3<T>&, const Vector3<T>&, Vector3<T>*) [with T = long double]':
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2edge_crossings.cc:485:28: required from here
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-0.10.0/src/s2/s2edge_crossings.cc:458:10: error: '(1.2e+1l / 7.20575940379279305358983848622456e+16l)' is not a constant expression
458 | 12 / (kIntersectionError.radians() / T_ERR - (2 + 2 * kSqrt3));
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [CMakeFiles/s2.dir/src/s2/s2edge_crossings.cc.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory `/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/build'
make[1]: *** [CMakeFiles/s2.dir/all] Error 2
@jmr Thank you.
UPD. Gtest
error fixed, unrelated of course to s2
, running the build with tests enabled now.
Change
constexpr
toconst
. #279
P. S. Only lines with square root? There are 3–4 instances. I need to make a correct patch for this.
Wherever you're getting an error. You may be able to look at what the Debian patches did.
@jmr Almost built, but failing on this:
[ 98%] Built target s2text_format_test
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/s2point.h: At global scope:
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/s2point.h:155:27: error: 'Hash' in namespace 'absl' does not name a template type
155 | using S2PointHash = absl::Hash<S2Point>;
| ^~~~
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc: In member function 'virtual void ValueLexicon_FloatEquality_Test::TestBody()':
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:65:25: error: 'S2PointHash' was not declared in this scope; did you mean 'S2Point'?
65 | ValueLexicon<S2Point, S2PointHash> lex;
| ^~~~~~~~~~~
| S2Point
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:65:36: error: template argument 2 is invalid
65 | ValueLexicon<S2Point, S2PointHash> lex;
| ^
In file included from /opt/local/src/googletest/include/gtest/gtest.h:67,
from /opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:27:
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:72:20: error: request for member 'Add' in 'lex', which is of non-class type 'int'
72 | EXPECT_EQ(0, lex.Add(a));
| ^~~
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:73:20: error: request for member 'Add' in 'lex', which is of non-class type 'int'
73 | EXPECT_EQ(0, lex.Add(b));
| ^~~
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:74:20: error: request for member 'Add' in 'lex', which is of non-class type 'int'
74 | EXPECT_EQ(0, lex.Add(c));
| ^~~
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:75:20: error: request for member 'size' in 'lex', which is of non-class type 'int'
75 | EXPECT_EQ(1, lex.size());
| ^~~~
/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/s2geometry-7773d518b1f29caa1c2045eb66ec519e025be108/src/s2/value_lexicon_test.cc:76:32: error: request for member 'value' in 'lex', which is of non-class type 'int'
76 | EXPECT_EQ(0, memcmp(&a, &lex.value(0), sizeof(a)));
| ^~~~~
make[2]: *** [CMakeFiles/value_lexicon_test.dir/src/s2/value_lexicon_test.cc.o] Error 1
make[2]: Leaving directory `/opt/local/var/macports/build/_opt_PPCSnowLeopardPorts_math_s2geometry/s2geometry/work/build'
make[1]: *** [CMakeFiles/value_lexicon_test.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 98%] Linking CXX executable s2wrapped_shape_test
What version of abseil-cpp are you using and what's in your absl/hash/hash.h
? There should be an absl::Hash
definition like https://github.com/abseil/abseil-cpp/blob/07e8b2a14d340984ff72fbea1181cc1469a4277a/absl/hash/hash.h#L250, but from the error message, it seems there's not.
Apparently recent: https://github.com/macports/macports-ports/blob/a2b420da3964faa396c1803290ade38b88b67a99/devel/abseil/Portfile#L12
The patch fixing PPC does not seem to throw anything away from that header or modify it: https://github.com/macports/macports-ports/blob/master/devel/abseil/files/patch-darwin-ppc.diff
But let me check what it has in result.
This should be it: https://github.com/abseil/abseil-cpp/blob/c2435f8342c2d0ed8101cb43adfd605fdc52dca2/absl/hash/hash.h
Can you link the output of gcc -E
?
Sorry, do you mean just like this? It wants inputs:
36-220% /opt/local/bin/gcc-mp-12 -E
gcc-mp-12: fatal error: no input files
compilation terminated.
Sorry, I meant find the full gcc
command that failed, and run it with -E
so I can look at the preprocessed output.
@jmr It seemed that -E
did nothing or I could not find a result, but I got preprocessed source with -v --save-temps
:
value_lexicon_test.cc.ii.zip
g++ -std=c++14 value_lexicon_test.cc.ii
gave me some more errors with a clue to what the real problem is. (Maybe the error is better since my g++ is actually clang++.)
Try deleting the absl::hash_internal::Hash
declaration from value_lexicon.h
. That looks like it shouldn't be there.
s2geometry/src/s2/value_lexicon.h
Lines 32 to 37 in 7773d51
@jmr So the build with test is fine now. Running tests still needs to be fixed on my end, since dylibs are not picked by tests’ binaries. Setting DYLD_LIBRARY_PATH path worked for s2 lib, but Gmock is a bit of a mess. Will return to this in a day. (We need either to fix tests with Macports Gtest/Gmock, or otherwise make it build its own version just to run tests, which won’t be a great choice, admittedly.)