Closed time-killer-games closed 2 years ago
Can you build the same empty main program with -E
so it generates preprocessor output and either post it in a gist or somewhere I can read it? It looks like it simply failed to get the right basic datatypes set up for some reason.
Well, this time the output is so small i don't see much reason to put it in a gist, but I will anyway since you asked.
https://gist.github.com/time-killer-games/e416cf142a527e245484ccc7e4dfb86e
It did build, and the above gist is the error you were wanting to see in the output. Thank you!
Can you run the following command:
g++ -E main.cpp $(pkg-config --static --libs sdl2) >/tmp/preprocessed.txt 2>&1
And send us the file /tmp/preprocessed.txt
?
Alright, @madebr here you go.
https://gist.github.com/time-killer-games/4f0ede63f0a348b1020786f0b979198c
Thanks again!
Is the g++
version in use defining __STDC_VERSION__
despite being in C++ mode?
Strange, your compiler uses _Static_assert
(C-only) while you are compiling code in c++ mode.
Save the following file as main.c
#include <stdio.h>
int main() {
#if defined(__cplusplus)
printf("__cplusplus: %d\n", __cplusplus);
#else
printf("__cplusplus: not defined\n");
#endif
#if defined(__STDC_VERSION__)
printf("__STDC_VERSION__: %d\n", __STDC_VERSION__);
#else
printf("__STDC_VERSION__: not defined\n");
#endif
return 0;
}
and run the following commands:
gcc -xc main.c -o main_c
./main_c
gcc -xc++ main.c -o main_cpp
./main_cpp
Please provide us with the output.
Also, what version of SDL2 are you using?
On most Linux distributions, it can be found in /usr/include/SDL2/SDL_version.h
https://github.com/libsdl-org/SDL/blob/3bae2d57da6dd768040d3a8c4fb0f707bf26d665/include/SDL_version.h#L60-L62
#define SDL_MAJOR_VERSION 2
#define SDL_MINOR_VERSION 0
#define SDL_PATCHLEVEL 22
Addressing the other things as we speak. It's very nice to have such prompt support, I wasn't expecting that.
lol you guys really know your stuff! You were on to something.
__cplusplus: not defined
__STDC_VERSION__: 201710
__cplusplus: 201703
__STDC_VERSION__: 201112
so i guess that means i can #undef __STDC_VERSION__
or is there more to it?
Your build environment is not conform to what is described in the gcc documentation at https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros.
__STDC_VERSION__
This macro expands to the C Standard’s version number, a long integer constant of the form yyyymmL where yyyy and mm are the year and month of the Standard version. This signifies which version of the C Standard the compiler conforms to. Like STDC, this is not necessarily accurate for the entire implementation, unless GNU CPP is being used with GCC.
The value 199409L signifies the 1989 C standard as amended in 1994, which is the current default; the value 199901L signifies the 1999 revision of the C standard; the value 201112L signifies the 2011 revision of the C standard; the value 201710L signifies the 2017 revision of the C standard (which is otherwise identical to the 2011 version apart from correction of defects). An unspecified value larger than 201710L is used for the experimental -std=c2x and -std=gnu2x modes.
This macro is not defined if the -traditional-cpp option is used, nor when compiling C++ or Objective-C.
The last line is what makes me think your compiler is bugged/misconfigured.
It's a fresh install of OpenIndiana, didn't configure anything on my end at least. Just gcc-11 from the package manager. I'll file a bug with them and will switch to clang.
I think this should work, can you confirm?
That should work, although the case we have here points to a very broken setup.
g++-11.x versions on godbolt.org don't seem to define __STDC_VERSION__
. I don't
know how this is happening with the Illumos version of g++...
I think this should work, can you confirm?
I'll try that recent change and will let you know.
running cmake and then make on the build directory, it seems to think I'm on linux for some reason.
/export/home/openindiana/SDL/src/core/linux/SDL_ibus.c:36:10: fatal error: sys/inotify.h: No such file or directory
36 | #include <sys/inotify.h>
Unless the package with that header can also be installed on illumos. Though I already have ibus installed.
On non-apple unix systems, we detect the os using CMAKE_SYSTEM_NAME
here.
Can you run the following command in a terminal, and provide us with the output?
#!/bin/bash
cat >/tmp/CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.0)
project(test C)
message(STATUS "CMAKE_SYSTEM: \${CMAKE_SYSTEM}")
message(STATUS "CMAKE_SYSTEM_NAME: \${CMAKE_SYSTEM_NAME}")
message(STATUS "CMAKE_SYSTEM_PROCESSOR: \${CMAKE_SYSTEM_PROCESSOR}")
message(STATUS "CMAKE_SYSTEM_VERSION: \${CMAKE_SYSTEM_VERSION}")
message(STATUS "CMAKE_HOST_SYSTEM: \${CMAKE_HOST_SYSTEM}")
message(STATUS "CMAKE_HOST_SYSTEM_NAME: \${CMAKE_HOST_SYSTEM_NAME}")
message(STATUS "CMAKE_HOST_SYSTEM_PROCESSOR: \${CMAKE_HOST_SYSTEM_PROCESSOR}")
message(STATUS "CMAKE_HOST_SYSTEM_VERSION: \${CMAKE_HOST_SYSTEM_VERSION}")
EOF
rm -rf /tmp/tmp_build
cmake -S /tmp -B /tmp/tmp_build
For my Linux system, the relevant output is:
-- CMAKE_SYSTEM: Linux-5.18.16-200.fc36.x86_64
-- CMAKE_SYSTEM_NAME: Linux
-- CMAKE_SYSTEM_PROCESSOR: x86_64
-- CMAKE_SYSTEM_VERSION: 5.18.16-200.fc36.x86_64
-- CMAKE_HOST_SYSTEM: Linux-5.18.16-200.fc36.x86_64
-- CMAKE_HOST_SYSTEM_NAME: Linux
-- CMAKE_HOST_SYSTEM_PROCESSOR: x86_64
-- CMAKE_HOST_SYSTEM_VERSION: 5.18.16-200.fc36.x86_64
Normally, your distribution should provide a cmake package that sets CMAKE_SYSTEM_NAME to a name representing the build system.
Alrighty:
-- CMAKE_SYSTEM: SunOS-5.11
-- CMAKE_SYSTEM_NAME: SunOS
-- CMAKE_SYSTEM_PROCESSOR: i386
-- CMAKE_SYSTEM_VERSION: 5.11
-- CMAKE_HOST_SYSTEM: SunOS-5.11
-- CMAKE_HOST_SYSTEM_NAME: SunOS
-- CMAKE_HOST_SYSTEM_PROCESSOR: i386
-- CMAKE_HOST_SYSTEM_VERSION: 5.11
So perhaps it doesn't think I'm on Linux. I guess i made a false assumption based on the output I saw.
Another thing that strikes me odd is it thinks I'm on i386 when I should be on x86_64.
Even the output of uname -a
is giving the wrong architecture:
openindiana@openindiana:~$ uname -a
SunOS openindiana 5.11 illumos-b38ce9deeb i86pc i386 i86pc
Also, due the excellent unpaid support, i may be living with my parents still and have next to no money, I've made note of this if I ever get big in the software world and make fat cash; you guys I definitely want to donate to. SDL2 and FreeBSD are at the top of my list to donate. I honestly wish I was in the position to do so right now.
About __STDC_VERSION__
, I created an issue at https://www.illumos.org/issues/14920
I installed OpenIndiana in a VM and can reproduce your issue. I am able the get SDL to build after applying the following patch (but fail to link)
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -169,7 +169,7 @@ elseif(UNIX AND NOT APPLE)
set(FREEBSD TRUE)
elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*")
set(SYSV5 TRUE)
- elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*")
+ elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*|SunOS.*")
set(SOLARIS TRUE)
elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*")
set(HPUX TRUE)
@@ -1435,7 +1435,8 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
endif()
pkg_search_module(IBUS ibus-1.0 ibus)
- if(IBUS_FOUND)
+ find_path(HAVE_SYS_INOTIFY_H NAMES sys/inotify.h)
+ if(IBUS_FOUND AND HAVE_SYS_INOTIFY_H)
set(HAVE_IBUS_IBUS_H TRUE)
target_include_directories(sdl-build-options INTERFACE "${IBUS_INCLUDE_DIRS}")
endif()
I compiled it using the following command:
CFLAGS="-m64 -w" CXXFLAGS="-m64 -w" cmake .. -GNinja -DSDL_KMSDRM=OFF
cmake --build .
Linking then fails with the following error:
Undefined first referenced
symbol in file
dbus_message_unref CMakeFiles/SDL2.dir/src/SDL.c.o
dbus_server_unref CMakeFiles/SDL2.dir/src/SDL.c.o
dbus_pending_call_unref CMakeFiles/SDL2.dir/src/SDL.c.o
dbus_address_entries_free CMakeFiles/SDL2.dir/src/SDL.c.o
dbus_connection_unref CMakeFiles/SDL2.dir/src/SDL.c.o
ld: fatal: symbol referencing errors. No output written to libSDL2-2.0.so.0.2500.0
It's not clear to me where these dbus functions are referenced: dbus is dynamically loaded.
I disabled kmsdrm to avoid the following error:
/usr/include/xf86drm.h:40:10: fatal error: drm.h: No such file or directory
#include <drm.h>
^~~~~~~
compilation terminated.
I don't know whether this error is because I'm missing some packages or whether drm is unsupported on openindiana.
__STDC_VERSION__
is defined by the g++ compiler itself on Solaris & illumos - the OS can't change that - see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57025
I updated the issue so that the initial error is in a gist, i should've done that initially. Sorry about that. Thanks again for looking into this, this is above and beyond what I was expecting for such a niche platform. Very thankful.
About
__STDC_VERSION__
, I created an issue at https://www.illumos.org/issues/14920I installed OpenIndiana in a VM and can reproduce your issue. I am able the get SDL to build after applying the following patch (but fail to link)
--- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,7 +169,7 @@ elseif(UNIX AND NOT APPLE) set(FREEBSD TRUE) elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*") set(SYSV5 TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*") + elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*|SunOS.*") set(SOLARIS TRUE) elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*") set(HPUX TRUE) @@ -1435,7 +1435,8 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) endif() pkg_search_module(IBUS ibus-1.0 ibus) - if(IBUS_FOUND) + find_path(HAVE_SYS_INOTIFY_H NAMES sys/inotify.h) + if(IBUS_FOUND AND HAVE_SYS_INOTIFY_H) set(HAVE_IBUS_IBUS_H TRUE) target_include_directories(sdl-build-options INTERFACE "${IBUS_INCLUDE_DIRS}") endif()
I compiled it using the following command:
CFLAGS="-m64 -w" CXXFLAGS="-m64 -w" cmake .. -GNinja -DSDL_KMSDRM=OFF cmake --build .
Linking then fails with the following error:
Undefined first referenced symbol in file dbus_message_unref CMakeFiles/SDL2.dir/src/SDL.c.o dbus_server_unref CMakeFiles/SDL2.dir/src/SDL.c.o dbus_pending_call_unref CMakeFiles/SDL2.dir/src/SDL.c.o dbus_address_entries_free CMakeFiles/SDL2.dir/src/SDL.c.o dbus_connection_unref CMakeFiles/SDL2.dir/src/SDL.c.o ld: fatal: symbol referencing errors. No output written to libSDL2-2.0.so.0.2500.0
It's not clear to me where these dbus functions are referenced: dbus is dynamically loaded.
I disabled kmsdrm to avoid the following error:
/usr/include/xf86drm.h:40:10: fatal error: drm.h: No such file or directory #include <drm.h> ^~~~~~~ compilation terminated.
I don't know whether this error is because I'm missing some packages or whether drm is unsupported on openindiana.
I think you just need the libdrm and header-drm packages installed. Hopefully that should fix it.
I think you just need the libdrm and header-drm packages installed. Hopefully that should fix it.
Indeed, that fixes the drm.h
thingie (thanks!), now I'm only left with the link error.
I ran the preprocessor on SDL_dbus.c
and found out that the missing dbus_*_unref
functions are used in static
functions inside the dbus headers.
Is there a compile/link option to drop these unused symbols before doing the final link?
Not adding -Wl,-no-undefined
is not a solution because the resulting libSDL2.so will still contain these dbus_*
symbols as undefined entries.
Particular reason this was closed without it being fixed?
This wasn't intentionally closed, it was just automatically done as part of a merge commit.
The clang++ compiler is a bit broken on this platform, nothing on your end, but i thought it's worth mentioning. It doesn't find a lot of common C++ headers like iostream and algorithm, while others it finds without issue. Really weird.
It's recommended to use their CC (not cc, but with capital letters, for C++ in specific) on this platform. The package manager says I have it installed, but it isn't a part of my $PATH otherwise it'd find it without the path component in the terminal.
This might be why SDL is built ok on illumos, because they used the CC compiler I'm guessing. Any of you guys know where that compiler is location on Illumos? I've tried using find CC /
and locate CC
and neither came up with anything.
Also tried searching the lowercase variant, still nothing. Your library is written in C and not C++ so that's another possibility.
The clang++ compiler is a bit broken on this platform, nothing on your end, but i thought it's worth mentioning. It doesn't find a lot of common C++ headers like iostream and algorithm, while others it finds without issue. Really weird.
It's recommended to use their CC (not cc, but with capital letters, for C++ in specific) on this platform. The package manager says I have it installed, but it isn't a part of my $PATH otherwise it'd find it without the path component in the terminal.
This might be why SDL is built ok on illumos, because they used the CC compiler I'm guessing. Any of you guys know where that compiler is location on Illumos? I've tried using
find CC /
andlocate CC
and neither came up with anything.Also tried searching the lowercase variant, still nothing. Your library is written in C and not C++ so that's another possibility.
I'm curious what Clang release you're using. Clang definitely works and is supported on Solaris proper. AFAIK it is tested on at least 11.4 but I believe should work on 11.3 as well.
The compiler you're referring to is what was the Sun Studio compiler and is now called Oracle Developer Studio. From looking around it does not seem like that compiler is supported on Illumos derived OS's.
https://www.oracle.com/application-development/technologies/developerstudio.html https://www.oracle.com/tools/developerstudio/downloads/developer-studio-jsp.html
The package I have installed is in fact SunStudio, you can even see the package on their website:
https://pkg.openindiana.org/hipster/en/search.shtml?token=cc&action=Search
The only issue is I don't know where it's actually installed to.
Have you tried compiling a C++ project that includes the iostream or algorithm C++ headers with clang++? I would like to know whether what I experienced very specifically is at all reproducible for anyone besides me, last I checked Clang 11 is what I have installed, can't remember the minor version but I'll check sometime later tonight.
Edit:
It's not the SDL2 developers responsibility to test clang, so I can ask elsewhere if that is an issue.
I've opened https://github.com/libsdl-org/SDL/pull/6136. With those changes, I am able to build SDL2 on OpenIndiana, albeit with disabled dbus.
Have you tried compiling a C++ project that includes the iostream or algorithm C++ headers with clang++? I would like to know whether what I experienced very specifically is at all reproducible for anyone besides me, last I checked Clang 11 is what I have installed, can't remember the minor version but I'll check sometime later tonight.
The current maintainer runs Clang through the full test suite and almost the whole suite passes. Clang 11 is pretty old. The minor version should not matter for this. I get the feeling something else is missing from your system.
Have you tried compiling a C++ project that includes the iostream or algorithm C++ headers with clang++? I would like to know whether what I experienced very specifically is at all reproducible for anyone besides me, last I checked Clang 11 is what I have installed, can't remember the minor version but I'll check sometime later tonight.
The current maintainer runs Clang through the full test suite and almost the whole suite passes. Clang 11 is pretty old. The minor version should not matter for this. I get the feeling something else is missing from your system.
That sounds about right, I just wish i knew what was actually missing package-wise. Seems that installing clang by itself isn't sufficient to get all the headers I need.
Everything works now! Thank you so very much guys!
We're all happy you are able to keep working with your (undoubtedly) favorite library :smile:
I'll provide a smaller reproducible in an edit. But for now, this code of mine works on Windows, Mac, Linux, FreeBSD, DragonFly BSD, OpenBSD, and NetBSD. I wanted to support Illumos, and the only platform-specific code I needed to port over was the function I used to get the executable path, which is just a simple call to getexecname() on Illmuos. OpenIndiana is my test OS for this. The errors below.
https://gist.github.com/time-killer-games/0fadf100213c67ce58c5ea7ff578bbee
To reproduce with my personal project:
Judging from the nature of the errors, it looks like SDL2's headers were written wrong on Illumos. It should be as simple as building a cpp file including SDL2/SDL.h and an empty main() function, and I'm about to verify that immediately after posting this ticket.
Edit:
Yep, I was corrrect. Empty main() cpp file doesn't compile and throws the same errors.
Compiled with: