when build Druntime with msys2/mingw-w64 on Windows 10, it looks version (Windows) is not defined into the compiler. The trouble appears while building libdruntime EXAMPLE: libphobos\libdruntime\core\stdc\time.d error: undefined identifier 'time_t' error: undefined identifier 'tm' Manually add version (GNU) { alias c_long time_t; alias c_long clock_t; } into time.d then it compiles but it seems weird. The trouble is that there are many other similar errors with core\stdc\stddef.d, stdlib.d, stdint.d, etc ...
*** Bug 91666 has been marked as a duplicate of this bug. ***
*** Bug 91600 has been marked as a duplicate of this bug. ***
Created attachment 48078 [details] winnt-d support Attached patch, though the target is untested.
I tried to build gcc 10 snapshot 20210320 for Windows 64-bit with the proposed patch. First I got this error: make[2]: Entering directory '/R/winlibs64_stage/gcc-10-20210320/build_mingw/gcc'make[2]: *** No rule to make target 'config/winnt-d.c', needed by 'winnt-d.o'. Stop. After copying the file manually there like this: mkdir -p build_mingw/gcc/config cp -u gcc/config/i386/winnt-d.c build_mingw/gcc/config/ I got this error: d:/prog/winlibs64_stage/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.0.1/../../../../x86_64-w64-mingw32/bin/ld.exe: winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d.c:60: multiple definition of `targetdm'; winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d.c:60: first defined here collect2.exe: error: ld returned 1 exit status
(In reply to Brecht Sanders from comment #4) > I tried to build gcc 10 snapshot 20210320 for Windows 64-bit with the > proposed patch. > > First I got this error: > > make[2]: Entering directory > '/R/winlibs64_stage/gcc-10-20210320/build_mingw/gcc'make[2]: *** No rule to > make target 'config/winnt-d.c', needed by 'winnt-d.o'. > Stop. > That is because the build rule is not correct, it should be config/i386/winnt-d.c according to the location of the file in the patch. > After copying the file manually there like this: > > mkdir -p build_mingw/gcc/config > cp -u gcc/config/i386/winnt-d.c build_mingw/gcc/config/ > > I got this error: > > d:/prog/winlibs64_stage/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.0.1/../. > ./../../x86_64-w64-mingw32/bin/ld.exe: > winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d. > c:60: multiple definition of `targetdm'; > winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d. > c:60: first defined here > collect2.exe: error: ld returned 1 exit status Because I imagine it's now picked up the object file from two different locations.
The patch for gcc/config/i386/t-cygming added a line: winnt-d.o: config/winnt-d.c I changed it to: winnt-d.o: config/i386/winnt-d.c Then I got one step further. Output is now: libtool: compile: /R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/gdc -B/R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/ -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/lib -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/include -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/bin/ -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib/ -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/sys-include --sysroot=/R/winlibs64_stage/gcc-10-20210320/build_mingw/mingw-w64 -DDLL_EXPORT -Wall -frelease -O2 -g -nostdinc -I ../../../../libphobos/libdruntime -I . -c ../../../../libphobos/libdruntime/core/demangle.d -fversion=Shared -o core/.libs/demangle.o r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:134:5: error: undefined identifier 'FILE' 134 | int fwprintf(FILE* stream, in wchar_t* format, ...); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:136:5: error: undefined identifier 'FILE' 136 | int fwscanf(FILE* stream, in wchar_t* format, ...); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:139:5: error: undefined identifier 'FILE' 139 | int vfwprintf(FILE* stream, in wchar_t* format, va_list arg); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:141:5: error: undefined identifier 'FILE' 141 | int vfwscanf(FILE* stream, in wchar_t* format, va_list arg); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:177:12: error: undefined identifier 'FILE' 177 | wint_t fgetwc(FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:179:12: error: undefined identifier 'FILE' 179 | wint_t fputwc(wchar_t c, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:183:10: error: undefined identifier 'FILE' 183 | wchar_t* fgetws(wchar_t* s, int n, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:185:10: error: undefined identifier 'FILE' 185 | int fputws(in wchar_t* s, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:195:12: error: undefined identifier 'FILE' 195 | wint_t getwc(FILE* stream) { return fgetwc(stream); } | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:197:12: error: undefined identifier 'FILE' 197 | wint_t putwc(wchar_t c, FILE* stream) { return fputwc(c, stream); } | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:204:12: error: undefined identifier 'FILE' 204 | wint_t ungetwc(wint_t c, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:213:16: error: undefined identifier 'FILE' 213 | int fwide(FILE* stream, int mode); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1140:16: error: undefined identifier 'FILE' 1140 | @trusted FILE* tmpfile(); // No unsafe pointer manipulation. | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1145:7: error: undefined identifier 'FILE' 1145 | int fclose(FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1151:11: error: undefined identifier 'FILE' 1151 | int fflush(FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1155:7: error: undefined identifier 'FILE' 1155 | FILE* fopen(scope const char* filename, scope const char* mode); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1157:7: error: undefined identifier 'FILE' 1157 | FILE* freopen(scope const char* filename, scope const char* mode, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1157:7: error: undefined identifier 'FILE' 1157 | FILE* freopen(scope const char* filename, scope const char* mode, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1160:6: error: undefined identifier 'FILE' 1160 | void setbuf(FILE* stream, char* buf); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1162:6: error: undefined identifier 'FILE' 1162 | int setvbuf(FILE* stream, char* buf, int mode, size_t size); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1169:9: error: undefined identifier 'FILE' 1169 | int __mingw_fprintf(FILE* stream, scope const char* format, ...); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1174:9: error: undefined identifier 'FILE' 1174 | int __mingw_fscanf(FILE* stream, scope const char* format, ...); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1189:9: error: undefined identifier 'FILE' 1189 | int __mingw_vfprintf(FILE* stream, scope const char* format, va_list arg); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1194:9: error: undefined identifier 'FILE' 1194 | int __mingw_vfscanf(FILE* stream, scope const char* format, va_list arg); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1260:9: error: undefined identifier 'FILE' 1260 | int fgetc(FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1262:9: error: undefined identifier 'FILE' 1262 | int fputc(int c, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1266:7: error: undefined identifier 'FILE' 1266 | char* fgets(char* s, int n, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1268:7: error: undefined identifier 'FILE' 1268 | int fputs(scope const char* s, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1288:14: error: undefined identifier 'FILE' 1288 | @trusted int ungetc(int c, FILE* stream); // No unsafe pointer manipulation. | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1291:8: error: undefined identifier 'FILE' 1291 | size_t fread(scope void* ptr, size_t size, size_t nmemb, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1293:8: error: undefined identifier 'FILE' 1293 | size_t fwrite(scope const void* ptr, size_t size, size_t nmemb, FILE* stream); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1299:9: error: undefined identifier 'FILE' 1299 | int fgetpos(FILE* stream, scope fpos_t * pos); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1299:9: error: undefined identifier 'fpos_t' 1299 | int fgetpos(FILE* stream, scope fpos_t * pos); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1301:9: error: undefined identifier 'FILE' 1301 | int fsetpos(FILE* stream, scope const fpos_t* pos); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1301:9: error: undefined identifier 'fpos_t' 1301 | int fsetpos(FILE* stream, scope const fpos_t* pos); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1304:12: error: undefined identifier 'FILE' 1304 | int fseek(FILE* stream, c_long offset, int whence); | ^ r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1306:12: error: undefined identifier 'FILE' 1306 | c_long ftell(FILE* stream); | ^ ../../../../libphobos/libdruntime/core/demangle.d:2622:16: error: module core.stdc.stdio import 'snprintf' not found, did you mean alias 'sprintf'? 2622 | import core.stdc.stdio : snprintf; | ^ make[4]: *** [Makefile:2280: core/demangle.lo] Error 1
(In reply to Brecht Sanders from comment #6) > The patch for gcc/config/i386/t-cygming added a line: > winnt-d.o: config/winnt-d.c > I changed it to: > winnt-d.o: config/i386/winnt-d.c > > Then I got one step further. > > Output is now: > libtool: compile: /R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/gdc > -B/R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/ > -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib > -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/lib -isystem > /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include > -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/include > -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/bin/ > -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib/ > -isystem > /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include > -isystem > /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/sys- > include --sysroot=/R/winlibs64_stage/gcc-10-20210320/build_mingw/mingw-w64 > -DDLL_EXPORT -Wall -frelease -O2 -g -nostdinc -I > ../../../../libphobos/libdruntime -I . -c > ../../../../libphobos/libdruntime/core/demangle.d -fversion=Shared -o > core/.libs/demangle.o > r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d: > 134:5: error: undefined identifier 'FILE' > 134 | int fwprintf(FILE* stream, in wchar_t* format, ...); > | ^ What predefined versions are added by the compiler? ./gcc/d21 -v 2>&1 | grep predefs
predefs GNU D_Version2 LittleEndian GNU_SEH_Exceptions GNU_EMUTLS GNU_StackGrowsDown GNU_InlineAsm D_LP64 D_PIC assert D_ModuleInfo D_Exceptions D_TypeInfo all X86_64 D_HardFloat Windows MinGW Win64 CppRuntime_Gcc
(In reply to Brecht Sanders from comment #8) > predefs GNU D_Version2 LittleEndian GNU_SEH_Exceptions GNU_EMUTLS > GNU_StackGrowsDown GNU_InlineAsm D_LP64 D_PIC assert D_ModuleInfo > D_Exceptions D_TypeInfo all X86_64 D_HardFloat Windows MinGW Win64 > CppRuntime_Gcc So there's no predefined CRuntime_* version condition, which is where all the missing definitions are hidden behind. Would MinGW be a CRuntime_Glibc target, a CRuntime_Microsoft target, or using it's own C library that has little commonality with neither glibc nor msvc?
I thought MinGW-w64 is it's own C library. It is found by GCC build process because the folder mingw exists in the location specified with --with-build-sysroot CppRuntime_Gcc is mentioned in the predefs, why would CRuntime_Gcc not be defined then?
(In reply to Brecht Sanders from comment #10) > I thought MinGW-w64 is it's own C library. > It is found by GCC build process because the folder mingw exists in the > location specified with --with-build-sysroot > Right, so there will need to be some porting done to add `version (MinGW)` blocks to druntime in order to define all bindings that are tied to a specific C library - such as core/stdc/stdio.d. > CppRuntime_Gcc is mentioned in the predefs, why would CRuntime_Gcc not be > defined then? CppRuntime_Gcc is for libstdc++, the other C++ runtime library is MSVC++, which GCC is not compatible with. There is no C runtime library included with GCC.
The master branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>: https://gcc.gnu.org/g:2892e2f70287f961e3bac990b926232cc2a5b123 commit r11-7847-g2892e2f70287f961e3bac990b926232cc2a5b123 Author: Iain Buclaw <ibuclaw@gdcproject.org> Date: Sun Mar 22 01:18:42 2020 +0100 d: Add windows support for D compiler [PR91595] gcc/ChangeLog: PR d/91595 * config.gcc (*-*-cygwin*): Add winnt-d.o (*-*-mingw*): Likewise. * config/i386/cygwin.h (EXTRA_TARGET_D_OS_VERSIONS): New macro. * config/i386/mingw32.h (EXTRA_TARGET_D_OS_VERSIONS): Likewise. * config/i386/t-cygming: Add winnt-d.o. * config/i386/winnt-d.c: New file.
Necessary versions have been committed to mainline. I've created a new PR for tracking library fixes in pr99794.