Opened 17 months ago

Closed 5 months ago

#5157 closed defect (fixed)

Error when compiling 0ad on Arch & Slackware: stdlib.h: No such file or directory

Reported by: a36233 Owned by: s0600204
Priority: Must Have Milestone: Alpha 24
Component: Build & Packages Keywords:
Cc: Patch: phab:D1582 phab:D1611

Description (last modified by a36233)

==== Building scriptinterface (release) ====
precompiled.h
In file included from ../../../source/lib/sysdep/stl.h:32,
                 from ../../../source/lib/precompiled.h:68,
                 from ../../../source/pch/scriptinterface/precompiled.h:19:
/usr/include/c++/8.1.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>
               ^~~~~~~~~~
compilation terminated.
make[1]: *** [scriptinterface.make:121: obj/scriptinterface_Release/precompiled.h.gch] Error 1
make: *** [Makefile:105: scriptinterface] Error 2

Attachments (5)

mocks_real.make (4.8 KB) - added by Andy A. 14 months ago.
scriptinterface.make (6.7 KB) - added by Andy A. 14 months ago.
mocks_real_verbose_output_20180813.txt (5.5 KB) - added by Andy A. 14 months ago.
0ad.SlackBuild (4.5 KB) - added by Andy A. 14 months ago.
working, modded by ponce
slackware_pkgconfig_v1.patch (6.9 KB) - added by s0600204 14 months ago.
Prospective patch to resolve over-inclusion of contents of /usr/include

Download all attachments as: .zip

Change History (39)

comment:1 Changed 17 months ago by a36233

Description: modified (diff)

comment:2 Changed 17 months ago by elexis

wiki:ReportingErrors

I thought it was a bug with gcc 7.3.1, but you are using 8.1.0?

(I still can't reproduce with 7.3.0)

There is a different ticket with the same bug and forum thread.

comment:3 Changed 17 months ago by s0600204

(Duplicate of #5152. Relevant forum thread.)


What OS are you using?

I don't suppose I could get you to try this:

SDL2_CONFIG="pkg-config sdl2" update-workspaces.sh

then running make?

comment:4 Changed 17 months ago by a36233

I'm using Arch Linux with gcc version 8.1.0.

$ sh clean-workspaces.sh
$ export SDL2_CONFIG="pkg-config sdl2"
$ sh update-workspaces.sh
$ make

And at least it compiled.

Last edited 17 months ago by a36233 (previous) (diff)

comment:5 Changed 17 months ago by elexis

andy5995 reported on #0ad-dev today the same error and that it was fixed by running the clean-workspaces.sh script before compiling again.

comment:6 Changed 17 months ago by Andy A.

And this is how I was able to reproduce the problem.

With a clean workspace, I ran

./update-workspace.sh --disable-atlas -j5
cd gcc
make -j5

Then:

./update-workspace.sh (with no args)
cd gcc
make -j5

The second build fails.

The error is actually different from the one posted above

Linking ActorEditor
==== Building cxxtestroot (release) ====
Generating test root file
/home/andy/src/0ad_svn/libraries/source/cxxtest-4.4/bin/cxxtestgen --root  --include=precompiled.h --include=lib/external_libraries/libsdl.h --runner=ErrorPrinter -o /home/andy/src/0ad_svn/source/test_root.cpp
==== Building test (release) ====
Generating test_AtlasObjectXML.cpp
test_root.cpp
cc1plus: error: one or more PCH files were found, but they were invalid
cc1plus: error: use -Winvalid-pch for more information
cc1plus: fatal error: obj/test_Release/precompiled.h: No such file or directory
compilation terminated.
test.make:1600: recipe for target 'obj/test_Release/test_root.o' failed
make[1]: *** [obj/test_Release/test_root.o] Error 1
make[1]: *** Waiting for unfinished jobs....
Makefile:188: recipe for target 'test' failed
make: *** [test] Error 2

I'm on Debian 9 with g++ 6.3

I assume omitting the -j5 isn't relevant, but omitting the --disable-atlas is.

Last edited 17 months ago by Andy A. (previous) (diff)

comment:7 Changed 17 months ago by stanislas69

Owner: set to Andreas Nilsson

comment:8 Changed 17 months ago by Andy A.

In the case I mentioned above, I have since found that cleaning isn't necessary if the build fails. I can just re-run update-workspaces.sh with the same options as I did before (i.e. --disable atlas in that case) and then run make again.

Last edited 17 months ago by Andy A. (previous) (diff)

comment:9 Changed 17 months ago by elexis

Milestone: Alpha 24Alpha 23

Reminder to test if --disable-atlas is actually broken and fixable.

comment:10 Changed 17 months ago by elexis

Milestone: Alpha 23Alpha 24

Hm, I could compile without-atlas and confirm that atlas isn'T part of the binary. Not sure what's going on here then.

comment:11 Changed 17 months ago by elexis

Component: UI & SimulationCore engine
Milestone: Alpha 24

After successfully building with --disable-atlas, then running update-workspaces.sh again (without the argument) and make again, I got the error. After running clean-workspaces.sh the error went away. So this is likely a non-issue.

We should try this for the new release candidates, see also this guy who reported this issue for a release candidate #5152.

comment:12 Changed 17 months ago by elexis

Owner: Andreas Nilsson deleted

comment:13 Changed 17 months ago by elexis

Resolution: needsinfo
Status: newclosed

Has to be reopened if we know a reliable way to reproduce errors without user mistake.

If it can be reproduced, one could find the offending revision by testing specific commits (maybe it was r21789, r21788, r21759 or an atlas commit?), otherwise with binary search up to r18916.

comment:14 Changed 17 months ago by s0600204

Component: Core engineBuild & Packages
Milestone: Backlog
Resolution: needsinfo
Status: closedreopened

It has been observed that setting the environment variable SDL2_CONFIG to pkg-config sdl2 prior to running update-workspaces.sh clears the originally reported problem. It is what I suggested above, confirmed as working by the Original Poster, and it is the solution used by the maintainer of the official Arch package repos.

Instead of getting tangled up with the --disable-atlas argument (which is... most likely a completely different issue to the one originally reported and thus warrants its own ticket without hijacking this one) let's look into this.

Without the environment argument being set, when the SDL2 libraries are included, then the following command is run to fetch the determine the library dependencies: sdl2-config --cflags. On Arch Linux with gcc 8.1.0, this command returns the following:

-I/usr/include/SDL2 -I/usr/include -D_REENTRANT

With the environment variable set, we instead end up running pkg-config sdl2 --cflags to determine the library dependencies of SDL2. This results in the following output:

-D_REENTRANT -I/usr/include/SDL2.

And here's the entire line used when compiling the file precompiled.h in module scriptinterface (the first file to fail compiling as reported above), first without the environment argument set:

g++ -x c++-header -MMD -MP -DNDEBUG -DCONFIG_FINAL=1 -DLIB_STATIC_LINK -DUSING_PCH -I../../../source/pch/scriptinterface -I../../../source -isystem ../../../libraries/source/spidermonkey/include-unix-release -isystem ../../../libraries/source/valgrind/include -isystem /usr/include/SDL2 -isystem /usr/include -isystem /usr/X11R6/include/X11 -isystem /usr/X11R6/include -isystem /usr/local/include/X11 -isystem /usr/local/include -isystem /usr/include/X11 -O3 -g -Wall -Wextra -Wno-switch -Wno-reorder -Wno-invalid-offsetof -Wextra -Wno-missing-field-initializers -Wunused-parameter -Wredundant-decls -Wnon-virtual-dtor -Wundef -fstack-protector-all -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstrict-aliasing -fno-omit-frame-pointer -fpch-preprocess -fPIC -std=c++0x -fvisibility=hidden -D_REENTRANT -o "obj/scriptinterface_Release/precompiled.h.gch" -MF "obj/scriptinterface_Release/precompiled.h.d" -c "../../../source/pch/scriptinterface/precompiled.h"

...and now with it:

g++ -x c++-header -MMD -MP -DNDEBUG -DCONFIG_FINAL=1 -DLIB_STATIC_LINK -DUSING_PCH -I../../../source/pch/scriptinterface -I../../../source -isystem ../../../libraries/source/spidermonkey/include-unix-release -isystem ../../../libraries/source/valgrind/include -isystem /usr/include/SDL2 -isystem /usr/X11R6/include/X11 -isystem /usr/X11R6/include -isystem /usr/local/include/X11 -isystem /usr/local/include -isystem /usr/include/X11 -O3 -g -Wall -Wextra -Wno-switch -Wno-reorder -Wno-invalid-offsetof -Wextra -Wno-missing-field-initializers -Wunused-parameter -Wredundant-decls -Wnon-virtual-dtor -Wundef -fstack-protector-all -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstrict-aliasing -fno-omit-frame-pointer -fpch-preprocess -fPIC -std=c++0x -fvisibility=hidden -D_REENTRANT -o "obj/scriptinterface_Release/precompiled.h.gch" -MF "obj/scriptinterface_Release/precompiled.h.d" -c "../../../source/pch/scriptinterface/precompiled.h"

The only difference in both cases is that /usr/include is not included in the second of each set.

So, questions:

  1. Why does not including /usr/include permit compilation to work? (I suspect it has something to do with gcc's #include_next macro.)
  2. What do sdl2-config --cflags and pkg-config sdl2 --cflags return on other linux distros?
  3. How about the includes for scriptinterface?

(Apologies if the answer to 1 seems obvious to some, I'm not that familiar with compilation/linking, so... educate me.)

comment:15 Changed 17 months ago by stanislas69

Owner: set to Andreas Nilsson
Status: reopenednew

Bug was reported by ani here: https://bugs.archlinux.org/task/58859

comment:16 Changed 17 months ago by stanislas69

Milestone: BacklogWork In Progress

comment:17 Changed 16 months ago by s0600204

Owner: changed from Andreas Nilsson to s0600204
Patch: phab:D1582
Status: newassigned

Further links, for quick access:

comment:18 Changed 15 months ago by elexis

Milestone: Work In ProgressAlpha 23
Priority: Release BlockerMust Have

I guess this should be fixed on our side for the upcoming releae. Not sure if others agree that it's a RB, but certainly high priority and high urgency.

comment:19 Changed 15 months ago by elexis

Summary: Error when compiling 0adError when compiling 0ad on Arch: stdlib.h: No such file or directory

comment:20 Changed 15 months ago by stanislas69

I agree it's one. Anything we can fix ( As in we have a patch for) that is likely to create dozens of false positives or non obvious tickets should be fixed IMHo. Not to mention that since we are forcing package mainteners to recompile we could at least make their lives easier.

comment:21 Changed 14 months ago by Andy A.

On Slackware 64-current which comes with g++ 8.2.0.

I got the same error but it first happened when building "mocks_real".

I tested phab:D1582 but got the same result.

Generated ../workspaces/gcc/Collada.make...
Generated ../workspaces/gcc/cxxtestroot.make...
Generated ../workspaces/gcc/test.make...
Done (581ms).
==== Building mocks_real (release) ====
mocks_real.cpp
In file included from ../../../source/lib/sysdep/stl.h:32,
                 from ../../../source/lib/precompiled.h:68,
                 from ../../../source/mocks/mocks_real.cpp:26:
/usr/include/c++/8.2.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>
               ^~~~~~~~~~
compilation terminated.
make[1]: *** [mocks_real.make:123: obj/mocks_real_Release/mocks_real.o] Error 1
make: *** [Makefile:141: mocks_real] Error 2

andy@demeter:~/src/0ad/trunk/build/workspaces/gcc$ make scriptinterface
==== Building scriptinterface (release) ====
precompiled.h
In file included from ../../../source/lib/sysdep/stl.h:32,
                 from ../../../source/lib/precompiled.h:68,
                 from ../../../source/pch/scriptinterface/precompiled.h:19:
/usr/include/c++/8.2.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>
               ^~~~~~~~~~
compilation terminated.
make[1]: *** [scriptinterface.make:121: obj/scriptinterface_Release/precompiled.h.gch] Error 1
make: *** [Makefile:99: scriptinterface] Error 2

comment:22 Changed 14 months ago by s0600204

Hi Andy, sorry to hear you're having problems.

Just to cover the obvious, are you calling make clean before compiling?

And how have you been handing the different Slackware versions? Are you using different physical/virtual machines, or do you have all the libraries installed under one system?

I'm assuming that what you've written in #4789 is up-to-date.

With the patch applied, and update-workspaces.sh run, would you mind uploading the generated mocks_real.make and scripinterface.make files from ./workspaces/gcc/ please? I'd like to see how they differ from mine.

And finally, what are the outputs of the following commands?:

pkg-config sdl2 --cflags
cpp -v /dev/null -o /dev/null

Heh, gcc 5.3 to 8.2. That's quite a jump.

Last edited 14 months ago by s0600204 (previous) (diff)

comment:23 Changed 14 months ago by Andy A.

Just to cover the obvious, are you calling make clean before compiling?

After I applied the patch, I ran clean-workspaces.sh and then update-workspaces.sh --disable-atlas -j5 && cd gcc && make -j5

Are you using different physical/virtual machines, or do you have all the libraries installed under one system?

3 logical partitions, Slack 14.2-(32,64), and 64-current

I'm assuming that what you've written in #4789 is up-to-date.

Yes, that ticket and the new build instructions I added only pertain to 14.2.

I'll attach the 2 files you mentioned.

$ pkg-config sdl2 --cflags
-D_REENTRANT -I/usr/include/SDL2
$ cpp -v /dev/null -o /dev/null
Reading specs from /usr/lib64/gcc/x86_64-slackware-linux/8.2.0/specs
COLLECT_GCC=cpp
Target: x86_64-slackware-linux
Configured with: ../gcc-8.2.0/configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man --infodir=/usr/info --enable-shared --enable-bootstrap --enable-languages=ada,brig,c,c++,fortran,go,lto,objc --enable-threads=posix --enable-checking=release --enable-objc-gc --with-system-zlib --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=new --disable-libstdcxx-pch --disable-libunwind-exceptions --enable-__cxa_atexit --disable-libssp --enable-gnu-unique-object --enable-plugin --enable-lto --disable-install-libiberty --disable-werror --with-gnu-ld --verbose --with-arch-directory=amd64 --disable-gtktest --disable-multilib --target=x86_64-slackware-linux --build=x86_64-slackware-linux --host=x86_64-slackware-linux
Thread model: posix
gcc version 8.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-E' '-v' '-o' '/dev/null' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-slackware-linux/8.2.0/cc1 -E -quiet -v /dev/null -o /dev/null -mtune=generic -march=x86-64
ignoring nonexistent directory "/usr/lib64/gcc/x86_64-slackware-linux/8.2.0/../../../../x86_64-slackware-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib64/gcc/x86_64-slackware-linux/8.2.0/include
 /usr/local/include
 /usr/lib64/gcc/x86_64-slackware-linux/8.2.0/include-fixed
 /usr/include
End of search list.
COMPILER_PATH=/usr/libexec/gcc/x86_64-slackware-linux/8.2.0/:/usr/libexec/gcc/x86_64-slackware-linux/8.2.0/:/usr/libexec/gcc/x86_64-slackware-linux/:/usr/lib64/gcc/x86_64-slackware-linux/8.2.0/:/usr/lib64/gcc/x86_64-slackware-linux/:/usr/lib64/gcc/x86_64-slackware-linux/8.2.0/../../../../x86_64-slackware-linux/bin/
LIBRARY_PATH=/usr/lib64/gcc/x86_64-slackware-linux/8.2.0/:/usr/lib64/gcc/x86_64-slackware-linux/8.2.0/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib64/gcc/x86_64-slackware-linux/8.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-E' '-v' '-o' '/dev/null' '-mtune=generic' '-march=x86-64'

Heh, gcc 5.3 to 8.2. That's quite a jump.

Yeah. And the gcc version could change yet (and maybe decrease again) before Slack 15.0 is released. -current is pretty unstable.

Changed 14 months ago by Andy A.

Attachment: mocks_real.make added

Changed 14 months ago by Andy A.

Attachment: scriptinterface.make added

comment:24 Changed 14 months ago by Andy A.

I tried making 3 other targets: lobby, engine, and gui. None of them can find stdlib.h. Would you like those attached as well?

comment:26 Changed 14 months ago by s0600204

Thanks, Andy.

Would you like those attached as well?

No, I just wanted to see one that included the SDL2 header files (scriptinterface) and one that doesn't (mocks_real). They're textually identical to what I get, so that's good.

The output from pkg-config and the cpp [...] thing is close enough to what I get (obviously on my system it doesn't refer to slackware) so that's okay.

Hmm...

Do you have anything installed under /usr/local/include? (ie. is it an empty folder and if not, what is present?)

Also, would you mind opening up mocks_real.make and making a couple of small additions? If you could add a hash (#) to the start of line 8 (which comments the line out). Then add -v to the end of line 23 (which will make the build verbose).

Then re-run make mocks_real. You'll get a fair bit of output... but if you could copy-paste it to a text-file and upload it here. (Based on what you've provided so far I don't expect any anomalies, but I just want to make sure.)

comment:27 Changed 14 months ago by Andy A.

Do you have anything installed under /usr/local/include? (ie. is it an empty folder and if not, what is present?)

/usr/local/include is an empty folder.

Changed 14 months ago by Andy A.

comment:28 Changed 14 months ago by Andy A.

Thanks to ponce we can now build and RUN 0 A.D. on Slackware64-current.

ponce wrote:

this testing script for 0.0.23, beside not being extremely clean, works on current

http://ponce.cc/slackware/testing/0ad-data/

http://ponce.cc/slackware/testing/0ad/

I was inspired by a bug report and decided to change all the -isystem >with -I and make the build system point to proper headers.

on stable it still segfaults :/

I'm going to attach the Slackbuild script so we have it stored locally. We probably won't use the script as it is, because it's intended for release packages, but it shows the modifications made.

Changed 14 months ago by Andy A.

Attachment: 0ad.SlackBuild added

working, modded by ponce

Changed 14 months ago by s0600204

Prospective patch to resolve over-inclusion of contents of /usr/include

comment:29 Changed 14 months ago by s0600204

Yeah, hmm... no. We include system headers with -isystem for a reason. I mean, they're system headers - they kinda need to be included with -isystem.

Trying (and I do mean "trying") to include them with -I causes gcc to complain that you're trying to include

a non-system directory that duplicates a system directory

and to then ignore the attempt. Of course we don't see the complaint because we tell gcc to be silent.

Also, the approach given in the file uses a scattergun approach which will cause problems in the future.

Anyway...

Andy, could I ask you to try my attached patch? (Revert back to base state (so the phab:D1582 patch is not applied), apply the attached patch, then recompile (but not using ponce's approach).)


Also, why is /usr/lib64/qt/include being included in the search path in the verbose compile log of mocks_real? We don't use Qt at all, nor do any of our dependancies, yet according to that output it's being added to the includes search path twice.

comment:30 in reply to:  29 ; Changed 14 months ago by Andy A.

Replying to s0600204:

Andy, could I ask you to try my attached patch? (Revert back to base state (so the phab:D1582 patch is not applied), apply the attached patch, then recompile (but not using ponce's approach).)

Yeah, your patch works. Nice!


Also, why is /usr/lib64/qt/include being included in the search path in the verbose compile log of mocks_real? We don't use Qt at all, nor do any of our dependancies, yet according to that output it's being added to the includes search path twice.

Good question. I asked about it an LQ thread. The short answer:

$ set | grep qt
CPLUS_INCLUDE_PATH=/usr/lib64/qt/include:/usr/lib64/qt/include

But why it's being set like that is a mystery and maybe needs to be looked at before Patrick changes current to 15.0.

comment:31 in reply to:  30 Changed 14 months ago by s0600204

Patch: phab:D1582phab:D1582 phab:D1611
Summary: Error when compiling 0ad on Arch: stdlib.h: No such file or directoryError when compiling 0ad on Arch & Slackware: stdlib.h: No such file or directory

Replying to Andy A.:

Yeah, your patch works. Nice!

Excellent.

As this goes a little beyond the established scope of phab:D1582, I've uploaded it to a new revision: phab:D1611 (which depends on D1582). The patch at this new revision is a bit more extensive but contains the same basic logic changes as the above patch.


Also, why is /usr/lib64/qt/include being included [...]?

CPLUS_INCLUDE_PATH=/usr/lib64/qt/include:/usr/lib64/qt/include

Huh. That'd do it. Thanks!

comment:32 Changed 14 months ago by s0600204

In 21865:

Use pkg-config instead of sdl2-config

Resolves build issue on Arch Linux (and Arch-derivatives)

(Also forms part of a fix for Slackware-current builds)

Accepted By: echotangoecho (Arch)
Confirmed as functional by: Imarok (Ubuntu 16.04, gcc5.4), wes-fole-dog (Parabola)
Refs: #5157
Fixes: #5152
Differential Revision: https://code.wildfiregames.com/D1582

comment:33 Changed 10 months ago by Itms

Milestone: Alpha 23Alpha 24

This was mostly fixed, but leaving this ticket open until we include a larger-scope solution in A24 with Phab:D1611. This should happen very early in the development cycle.

comment:34 Changed 5 months ago by s0600204

Resolution: fixed
Status: assignedclosed

In 22302:

Use pkg-config where possible instead of hard-coding or library-specific programs

Accepted by: Itms, wraitii
Previously tested by: andy5995
Fixes: #5157
Refs: D1582
Differential Revision: https://code.wildfiregames.com/D1611

Note: See TracTickets for help on using tickets.