diff options
author | Janez Zemva | 2018-07-28 09:12:00 +0200 |
---|---|---|
committer | Janez Zemva | 2018-07-28 09:12:00 +0200 |
commit | efb381e466a9782c54ed47fdc3821cdccf952f3f (patch) | |
tree | 3315575e08fc4bdfe95c6886c1192abc0b4e27ec | |
parent | 014f051b10195a23c58b12b49939ca7abe3488b4 (diff) | |
download | aur-efb381e466a9782c54ed47fdc3821cdccf952f3f.tar.gz |
some fixes
-rw-r--r-- | .SRCINFO | 10 | ||||
-rw-r--r-- | PKGBUILD | 16 | ||||
-rw-r--r-- | gcc-djgpp.diff | 550 |
3 files changed, 567 insertions, 9 deletions
@@ -1,7 +1,7 @@ pkgbase = dosbox-gcc pkgdesc = djgpp cross-compiler for the dosbox environment pkgver = 8.2.0 - pkgrel = 1 + pkgrel = 2 url = http://gcc.gnu.org arch = i686 arch = x86_64 @@ -20,12 +20,13 @@ pkgbase = dosbox-gcc options = !strip options = staticlibs options = !emptydirs - source = https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-7.2.0.tar.xz + source = https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.xz source = http://isl.gforge.inria.fr/isl-0.18.tar.xz source = https://zlib.net/zlib-1.2.11.tar.gz" source = http://www.delorie.com/pub/djgpp/current/v2/djcrx205.zip - source = mkmake.bash - source = watt32.pc + source = mkmake.bash + source = watt32.pc + source = gcc-djgpp.diff source = lto.patch sha256sums = SKIP sha256sums = SKIP @@ -33,6 +34,7 @@ pkgbase = dosbox-gcc sha256sums = SKIP sha256sums = SKIP sha256sums = SKIP + sha256sums = SKIP sha256sums = c03dbd61274e1ce14f84366abf348d75779bbd6e0bc32b9f4fd74f1ce54a5ef0 pkgname = dosbox-gcc @@ -10,7 +10,7 @@ _djver=2.05 _pthver=3.14 _zlver=1.2.11 _wattver="2.2-dev.10" -pkgrel=1 +pkgrel=2 pkgdesc="djgpp cross-compiler for the dosbox environment" arch=('i686' 'x86_64') url="http://gcc.gnu.org" @@ -27,6 +27,7 @@ source=("https://ftp.gnu.org/gnu/gcc/gcc-${pkgver}/gcc-$pkgver.tar.xz" "http://www.watt-32.net/watt32s-${_wattver}.zip" "mkmake.bash" "watt32.pc" + "gcc-djgpp.diff" "lto.patch") sha256sums=('SKIP' 'SKIP' @@ -35,6 +36,7 @@ sha256sums=('SKIP' 'SKIP' 'SKIP' 'SKIP' + 'SKIP' 'c03dbd61274e1ce14f84366abf348d75779bbd6e0bc32b9f4fd74f1ce54a5ef0') noextract=("djcrx${_djver//./}.zip" "watt32s-${_wattver}.zip") @@ -97,6 +99,9 @@ prepare() { # build the lto plugin patch -Np0 < ../lto.patch + # Other DJGPP related changes + patch -Np1 < ../gcc-djgpp.diff + # extract bootstrap djcrx mkdir -p ../gcc-build-$_target/lib/gcc/$_target/$pkgver cd ../gcc-build-${_target}/lib/gcc/$_target/$pkgver @@ -106,9 +111,9 @@ prepare() { ln -fs /bin/true stubify # monkeypatch libc to prepare for building without an ldscript - echo '.comm __environ,16' > environ.s - i586-pc-msdosdjgpp-as environ.s -o environ.o - i586-pc-msdosdjgpp-ar q libc.a environ.o + # echo '.comm __environ,16' > environ.s + # i586-pc-msdosdjgpp-as environ.s -o environ.o + # i586-pc-msdosdjgpp-ar q libc.a environ.o } build() { @@ -124,7 +129,7 @@ build() { --disable-nls \ --enable-gold \ --enable-decimal-float \ - --enable-languages=c,c++,objc,obj-c++ \ + --enable-languages=c,c++ \ --enable-shared --enable-static \ --with-system-zlib \ --with-arch=i586 \ @@ -132,6 +137,7 @@ build() { --enable-threads \ --enable-libstdcxx-threads \ --enable-lto --disable-libgomp \ + --enable-libstdcxx-filesystem-ts \ --disable-multilib --enable-checking=release make all-gcc diff --git a/gcc-djgpp.diff b/gcc-djgpp.diff new file mode 100644 index 000000000000..961640c8dcf8 --- /dev/null +++ b/gcc-djgpp.diff @@ -0,0 +1,550 @@ +diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c +index 3b0aea92c05..02013b9f01a 100644 +--- a/gcc/ada/adaint.c ++++ b/gcc/ada/adaint.c +@@ -247,6 +247,12 @@ char __gnat_dir_separator = DIR_SEPARATOR; + + char __gnat_path_separator = PATH_SEPARATOR; + ++#ifdef __DJGPP__ ++int __gnat_is_djgpp = 1; ++#else ++int __gnat_is_djgpp = 0; ++#endif ++ + /* The GNAT_LIBRARY_TEMPLATE contains a list of expressions that define + the base filenames that libraries specified with -lsomelib options + may have. This is used by GNATMAKE to check whether an executable +@@ -553,7 +559,11 @@ __gnat_try_lock (char *dir, char *file) + int + __gnat_get_maximum_file_name_length (void) + { ++#if defined (__DJGPP__) ++ return (_use_lfn(".")) ? -1 : 8; ++#else + return -1; ++#endif + } + + /* Return nonzero if file names are case sensitive. */ +diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in +index d51d3973b4d..3381e23116a 100644 +--- a/gcc/ada/gcc-interface/Make-lang.in ++++ b/gcc/ada/gcc-interface/Make-lang.in +@@ -1066,7 +1066,7 @@ ada/generated/gnatvsn.ads: ada/gnatvsn.ads BASE-VER ada/GNAT_DATE + s=`cat $(srcdir)/BASE-VER | sed -e "s/\([0-9]*\)\.\([0-9]*\)\..*/-\1\2/g"`; \ + d=`if test -f $(srcdir)/ada/GNAT_DATE; then \ + cat $(srcdir)/ada/GNAT_DATE; else date +%Y%m%d; fi`; \ +- cat $< | sed -e "/Version/s/(\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*)/($$d$$s)/g" >$@ ++ cat $< | sed -e "/Version/s/(\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*)/($$d$$s)/g" | tr -d \\\015 >$@ + + ada/gnatvsn.o : ada/gnatvsn.adb ada/generated/gnatvsn.ads + $(CC) -c $(ALL_ADAFLAGS) -Iada/generated -I../ada/generated $(ADA_INCLUDES) $< $(ADA_OUTPUT_OPTION) +diff --git a/gcc/ada/libgnarl/s-taprop__dummy.adb b/gcc/ada/libgnarl/s-taprop__dummy.adb +index e1bea2955ef..240fccdae39 100644 +--- a/gcc/ada/libgnarl/s-taprop__dummy.adb ++++ b/gcc/ada/libgnarl/s-taprop__dummy.adb +@@ -41,7 +41,7 @@ pragma Polling (Off); + package body System.Task_Primitives.Operations is + + use System.Tasking; +- use System.Parameters; ++-- use System.Parameters; + + pragma Warnings (Off); + -- Turn off warnings since so many unreferenced parameters +diff --git a/gcc/ada/libgnat/s-os_lib.adb b/gcc/ada/libgnat/s-os_lib.adb +index b82bd3badb3..8e3d7bcacc1 100644 +--- a/gcc/ada/libgnat/s-os_lib.adb ++++ b/gcc/ada/libgnat/s-os_lib.adb +@@ -71,7 +71,7 @@ package body System.OS_Lib is + + -- The following are used by Create_Temp_File + +- First_Temp_File_Name : constant String := "GNAT-TEMP-000000.TMP"; ++ First_Temp_File_Name : constant String := "GA000000.TMP"; + -- Used to initialize Current_Temp_File_Name and Temp_File_Name_Last_Digit + + Current_Temp_File_Name : String := First_Temp_File_Name; +@@ -2262,10 +2262,10 @@ package body System.OS_Lib is + -- * Check the drive letter + -- * Remove all double-quotes + +- if On_Windows then +- ++ if On_Windows ++ and then Is_Djgpp = 0 ++ then + -- Replace all '/' by '\' +- + for Index in 1 .. End_Path loop + if Path_Buffer (Index) = '/' then + Path_Buffer (Index) := Directory_Separator; +diff --git a/gcc/ada/libgnat/s-os_lib.ads b/gcc/ada/libgnat/s-os_lib.ads +index 1e2ffa354a3..40d3b689bbd 100644 +--- a/gcc/ada/libgnat/s-os_lib.ads ++++ b/gcc/ada/libgnat/s-os_lib.ads +@@ -1082,9 +1082,12 @@ package System.OS_Lib is + Path_Separator : constant Character; + -- The character to separate paths in an environment variable value + ++ Is_Djgpp : constant Integer; ++ + private + pragma Import (C, Path_Separator, "__gnat_path_separator"); + pragma Import (C, Directory_Separator, "__gnat_dir_separator"); ++ pragma Import (C, Is_Djgpp, "__gnat_is_djgpp"); + pragma Import (C, Current_Time, "__gnat_current_time"); + pragma Import (C, Current_Process_Id, "__gnat_current_process_id"); + +diff --git a/gcc/config/i386/xm-djgpp.h b/gcc/config/i386/xm-djgpp.h +index 02096925a88..066417f1d50 100644 +--- a/gcc/config/i386/xm-djgpp.h ++++ b/gcc/config/i386/xm-djgpp.h +@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3. If not see + #undef NATIVE_SYSTEM_HEADER_DIR + #define NATIVE_SYSTEM_HEADER_DIR "/dev/env/DJDIR/include/" + ++//#undef PREFIX_INCLUDE_DIR ++ + /* Search for as.exe and ld.exe in DJGPP's binary directory. */ + #undef MD_EXEC_PREFIX + #define MD_EXEC_PREFIX "/dev/env/DJDIR/bin/" +@@ -107,6 +109,11 @@ along with GCC; see the file COPYING3. If not see + (PATH) = xstrdup (fixed_path); \ + } + ++/* Rename libstdc++ to libstdcxx as the first name is not valid for DOS */ ++#define LIBSTDCXX "stdcxx" ++#define LIBSTDCXX_PROFILE "stdcxx" ++#define LIBSTDCXX_STATIC "stdcxx" ++ + #undef MAX_OFILE_ALIGNMENT + #define MAX_OFILE_ALIGNMENT 128 + +diff --git a/gcc/gcov-tool.c b/gcc/gcov-tool.c +index 15fd710b18c..91d4c87b31b 100644 +--- a/gcc/gcov-tool.c ++++ b/gcc/gcov-tool.c +@@ -56,11 +56,18 @@ static bool verbose; + + /* Remove file NAME if it has a gcda suffix. */ + ++#ifdef __DJGPP__ ++static int ++unlink_gcda_file (const char *name, ++ struct stat *status ATTRIBUTE_UNUSED, ++ int type ATTRIBUTE_UNUSED) ++#else + static int + unlink_gcda_file (const char *name, + const struct stat *status ATTRIBUTE_UNUSED, + int type ATTRIBUTE_UNUSED, + struct FTW *ftwbuf ATTRIBUTE_UNUSED) ++#endif + { + int ret = 0; + int len = strlen (name); +@@ -82,7 +89,11 @@ static int + unlink_profile_dir (const char *path ATTRIBUTE_UNUSED) + { + #if HAVE_FTW_H ++#ifdef __DJGPP__ ++ return ftw(path, unlink_gcda_file, 64); ++#else + return nftw(path, unlink_gcda_file, 64, FTW_DEPTH | FTW_PHYS); ++#endif + #else + return -1; + #endif +diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h +index 96a360f305e..d24aa286421 100644 +--- a/gcc/ginclude/float.h ++++ b/gcc/ginclude/float.h +@@ -25,6 +25,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + * ISO C Standard: 5.2.4.2.2 Characteristics of floating types <float.h> + */ + ++#ifdef __DJGPP__ ++#include_next <float.h> ++#endif ++ + #ifndef _FLOAT_H___ + #define _FLOAT_H___ + +diff --git a/include/libiberty.h b/include/libiberty.h +index dc09e791e41..72e535f3456 100644 +--- a/include/libiberty.h ++++ b/include/libiberty.h +@@ -108,6 +108,7 @@ extern int countargv (char * const *); + #if defined (__GNU_LIBRARY__ ) || defined (__linux__) \ + || defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__) \ + || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) \ ++ || defined (__DJGPP__) \ + || defined (__DragonFly__) || defined (HAVE_DECL_BASENAME) + extern char *basename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1); + #else +diff --git a/libcpp/files.c b/libcpp/files.c +index e8d21b28e62..964f06e3bf4 100644 +--- a/libcpp/files.c ++++ b/libcpp/files.c +@@ -740,6 +740,10 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file, source_location loc) + cpp_error_at (pfile, CPP_DL_WARNING, loc, + "%s is shorter than expected", file->path); + ++/* For DOS we should handle DOS EOF character (0x1A, ^Z). It is ++ only done if it is really the last character of the file */ ++ if (total>0 && buf[total-1]==0x1A) total--; ++ + file->buffer = _cpp_convert_input (pfile, + CPP_OPTION (pfile, input_charset), + buf, size + 16, total, +diff --git a/libcpp/lex.c b/libcpp/lex.c +index 37c365a3560..bf1daed392e 100644 +--- a/libcpp/lex.c ++++ b/libcpp/lex.c +@@ -502,6 +502,13 @@ init_vectorized_lexer (void) + search_line_fast_type impl = search_line_acc_char; + int minimum = 0; + ++// [FIXME][DJGPP] Using SSE here causes preprocessor to randomly ++// [FIXME][DJGPP] fail when run under Windows 10 32 bit (and maybe ++// [FIXME][DJGPP] some other systems (I have observed similar ++// [FIXME][DJGPP] behavior earlier with DJGPP v2.03p2 under Windows ++// [FIXME][DJGPP] Vista ++#ifndef __DJGPP__ ++ + #if defined(__SSE4_2__) + minimum = 3; + #elif defined(__SSE2__) +@@ -528,6 +535,8 @@ init_vectorized_lexer (void) + impl = search_line_mmx; + } + ++#endif // __DJGPP__ ++ + search_line_fast = impl; + } + +diff --git a/libcpp/macro.c b/libcpp/macro.c +index 776af7bd00e..09217b472ae 100644 +--- a/libcpp/macro.c ++++ b/libcpp/macro.c +@@ -516,17 +516,22 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, + && pfile->cb.get_source_date_epoch != NULL) + pfile->source_date_epoch = pfile->cb.get_source_date_epoch (pfile); + +- if (pfile->source_date_epoch >= (time_t) 0) +- tb = gmtime (&pfile->source_date_epoch); +- else +- { +- /* (time_t) -1 is a legitimate value for "number of seconds +- since the Epoch", so we have to do a little dance to +- distinguish that from a genuine error. */ +- errno = 0; +- tt = time (NULL); +- if (tt != (time_t)-1 || errno == 0) +- tb = localtime (&tt); ++ switch (pfile->source_date_epoch) ++ { ++ default: ++ tb = gmtime (&pfile->source_date_epoch); ++ break; ++ ++ case (time_t) -1: ++ case (time_t) -2: ++ /* (time_t) -1 is a legitimate value for "number of seconds ++ since the Epoch", so we have to do a little dance to ++ distinguish that from a genuine error. */ ++ errno = 0; ++ tt = time (NULL); ++ if (tt != (time_t)-1 || errno == 0) ++ tb = localtime (&tt); ++ break; + } + + if (tb) +diff --git a/libffi/src/x86/sysv.S b/libffi/src/x86/sysv.S +index 78f245bda07..1ae18b248a7 100644 +--- a/libffi/src/x86/sysv.S ++++ b/libffi/src/x86/sysv.S +@@ -822,7 +822,7 @@ ENDF(C(__x86.get_pc_thunk.dx)) + #ifdef __APPLE__ + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support + EHFrame0: +-#elif defined(X86_WIN32) ++#elif defined(X86_WIN32) || defined(__DJGPP__) + .section .eh_frame,"r" + #elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) + .section .eh_frame,EH_FRAME_FLAGS,@unwind +diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c +index 9cf56a82859..f30c593d04b 100644 +--- a/libgcc/libgcov-util.c ++++ b/libgcc/libgcov-util.c +@@ -388,7 +388,11 @@ read_gcda_file (const char *filename) + + static int + ftw_read_file (const char *filename, ++#ifdef __DJGPP__ ++ struct stat *status ATTRIBUTE_UNUSED, ++#else + const struct stat *status ATTRIBUTE_UNUSED, ++#endif + int type) + { + int filename_len; +diff --git a/libgfortran/intrinsics/chmod.c b/libgfortran/intrinsics/chmod.c +index 1299159a7f1..e1bd7a1c633 100644 +--- a/libgfortran/intrinsics/chmod.c ++++ b/libgfortran/intrinsics/chmod.c +@@ -442,7 +442,7 @@ clause_done: + if ((ugo[2] || honor_umask) && !rwxXstugo[8]) + file_mode = (file_mode & ~(S_IROTH | S_IWOTH | S_IXOTH)) + | (new_mode & (S_IROTH | S_IWOTH | S_IXOTH)); +-#ifndef __VXWORKS__ ++#if !defined(__VXWORKS__) && !defined(__DJGPP__) + if (is_dir && rwxXstugo[5]) + file_mode |= S_ISVTX; + else if (!is_dir) +@@ -454,7 +454,7 @@ clause_done: + { + /* Clear '-'. */ + file_mode &= ~new_mode; +-#if !defined( __MINGW32__) && !defined (__VXWORKS__) ++#if !defined( __MINGW32__) && !defined (__VXWORKS__) && !defined(__DJGPP__) + if (rwxXstugo[5] || !is_dir) + file_mode &= ~S_ISVTX; + #endif +@@ -462,7 +462,7 @@ clause_done: + else if (set_mode == 3) + { + file_mode |= new_mode; +-#if !defined (__MINGW32__) && !defined (__VXWORKS__) ++#if !defined (__MINGW32__) && !defined (__VXWORKS__) && !defined(__DJGPP__) + if (rwxXstugo[5] && is_dir) + file_mode |= S_ISVTX; + else if (!is_dir) +diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c +index a8fd07a5f3b..385640ab903 100644 +--- a/libgfortran/io/unix.c ++++ b/libgfortran/io/unix.c +@@ -210,6 +210,9 @@ typedef struct + } + unix_stream; + ++#ifdef __DJGPP__ ++#include <io.h> ++#endif + + /* fix_fd()-- Given a file descriptor, make sure it is not one of the + standard descriptors, returning a non-standard descriptor. If the +@@ -1190,8 +1193,13 @@ tempfile_open (const char *tempdir, char **fname) + char *template = xmalloc (tempdirlen + 23); + + #ifdef HAVE_MKSTEMP ++#ifdef __DJGPP__ ++ /* Default filename is too long for DOS */ ++ snprintf (template, tempdirlen + 23, "%s/gfXXXXXX", tempdir); ++#else + snprintf (template, tempdirlen + 23, "%s%sgfortrantmpXXXXXX", + tempdir, slash); ++#endif + + #ifdef HAVE_UMASK + /* Temporarily set the umask such that the file has 0600 permissions. */ +@@ -1557,6 +1565,13 @@ open_external (st_parameter_open *opp, unit_flags *flags) + return NULL; + fd = fix_fd (fd); + ++#ifdef __DJGPP__ ++ if (flags->form == FORM_UNFORMATTED) ++ { ++ setmode (fd, O_BINARY); ++ } ++#endif ++ + if (open_share (opp, fd, flags) < 0) + return NULL; + +diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c +index eebcff9957e..a9d92ee2247 100644 +--- a/libiberty/make-relative-prefix.c ++++ b/libiberty/make-relative-prefix.c +@@ -65,6 +65,7 @@ relative prefix can be found, return @code{NULL}. + + #include "ansidecl.h" + #include "libiberty.h" ++#include "filenames.h" + + #ifndef R_OK + #define R_OK 4 +@@ -337,7 +338,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, + { + for (i = 0; i < bin_num; i++) + { +- if (strcmp (prog_dirs[i], bin_dirs[i]) != 0) ++ if (FILENAME_CMP (prog_dirs[i], bin_dirs[i]) != 0) + break; + } + +@@ -353,7 +354,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, + n = (prefix_num < bin_num) ? prefix_num : bin_num; + for (common = 0; common < n; common++) + { +- if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0) ++ if (FILENAME_CMP (bin_dirs[common], prefix_dirs[common]) != 0) + break; + } + +diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c +index 89faed7f09e..dd93cda1f03 100644 +--- a/libiberty/make-temp-file.c ++++ b/libiberty/make-temp-file.c +@@ -47,6 +47,7 @@ Boston, MA 02110-1301, USA. */ + #endif + + #include "libiberty.h" ++#include "filenames.h" + extern int mkstemps (char *, int); + + /* '/' works just fine on MS-DOS based systems. */ +@@ -142,7 +143,8 @@ choose_tmpdir (void) + len = strlen (base); + tmpdir = XNEWVEC (char, len + 2); + strcpy (tmpdir, base); +- tmpdir[len] = DIR_SEPARATOR; ++ if (len>0 && !IS_DIR_SEPARATOR(tmpdir[len-1])) ++ tmpdir[len] = DIR_SEPARATOR; + tmpdir[len+1] = '\0'; + memoized_tmpdir = tmpdir; + #else /* defined(_WIN32) && !defined(__CYGWIN__) */ +diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c +index 021ce488c16..601db43cdce 100644 +--- a/libiberty/simple-object-elf.c ++++ b/libiberty/simple-object-elf.c +@@ -1285,7 +1285,9 @@ simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj, + } + if (new_i - 1 >= SHN_LORESERVE) + { ++#ifdef ENOTSUP + *err = ENOTSUP; ++#endif + return "Too many copied sections"; + } + eow->shdrs = XNEWVEC (unsigned char, shdr_size * (new_i - 1)); +diff --git a/libquadmath/printf/quadmath-printf.h b/libquadmath/printf/quadmath-printf.h +index 32ebcec928c..96498b7c408 100644 +--- a/libquadmath/printf/quadmath-printf.h ++++ b/libquadmath/printf/quadmath-printf.h +@@ -29,7 +29,8 @@ Boston, MA 02110-1301, USA. */ + #ifdef HAVE_CTYPE_H + #include <ctype.h> + #endif +-#ifdef HAVE_WCHAR_H ++#if defined(HAVE_WCHAR_H) && !defined(__DJGPP__) ++/* DJGPP wchar.h is not good enough */ + #include <wchar.h> + #endif + #ifdef HAVE_WCTYPE_H +@@ -44,7 +45,7 @@ Boston, MA 02110-1301, USA. */ + #include "quadmath-imp.h" + #include "gmp-impl.h" + +-#ifdef HAVE_WCHAR_H ++#if defined(HAVE_WCHAR_H) && !defined(__DJGPP__) + #define L_(x) L##x + #else + #define L_(x) x +diff --git a/libstdc++-v3/config/os/djgpp/error_constants.h b/libstdc++-v3/config/os/djgpp/error_constants.h +index 4e5590f9160..f78405afa03 100644 +--- a/libstdc++-v3/config/os/djgpp/error_constants.h ++++ b/libstdc++-v3/config/os/djgpp/error_constants.h +@@ -33,6 +33,15 @@ + #include <bits/c++config.h> + #include <cerrno> + ++#ifndef EOPNOTSUPP ++// Use same value as in wat3222br6.zip file net/watt/sys/djgpp.err ++#define EOPNOTSUPP 52 ++#endif ++ ++#ifndef ENOTSUP ++#define ENOTSUP 101 ++#endif ++ + namespace std _GLIBCXX_VISIBILITY(default) + { + _GLIBCXX_BEGIN_NAMESPACE_VERSION +@@ -118,9 +127,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + // not_connected = ENOTCONN, + not_enough_memory = ENOMEM, + +-#ifdef _GLIBCXX_HAVE_ENOTSUP + not_supported = ENOTSUP, +-#endif + + #ifdef _GLIBCXX_HAVE_ECANCELED + operation_canceled = ECANCELED, +@@ -128,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + + // operation_in_progress = EINPROGRESS, + operation_not_permitted = EPERM, +-// operation_not_supported = EOPNOTSUPP, ++ operation_not_supported = EOPNOTSUPP, + // operation_would_block = EWOULDBLOCK, + + #ifdef _GLIBCXX_HAVE_EOWNERDEAD +diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h +index ada7c1791aa..1ec60b2ffc9 100644 +--- a/libstdc++-v3/include/experimental/bits/fs_path.h ++++ b/libstdc++-v3/include/experimental/bits/fs_path.h +@@ -53,6 +53,11 @@ + # include <algorithm> + #endif + ++#if defined(__DJGPP__) ++# define _GLIBCXX_FILESYSTEM_IS_DJGPP 1 ++# include <algorithm> ++#endif ++ + namespace std _GLIBCXX_VISIBILITY(default) + { + _GLIBCXX_BEGIN_NAMESPACE_VERSION +@@ -461,6 +466,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 + { + #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS + return __ch == L'/' || __ch == preferred_separator; ++#elif defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) ++ return __ch == '/' || __ch == '\\'; + #else + return __ch == '/'; + #endif +@@ -831,6 +838,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 + #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS + std::replace(_M_pathname.begin(), _M_pathname.end(), L'/', + preferred_separator); ++#elif defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) ++ std::replace(_M_pathname.begin(), _M_pathname.end(), '\\', ++ preferred_separator); + #endif + return *this; + } +diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc +index 899d94e0067..fdb0e9e071a 100644 +--- a/libstdc++-v3/src/filesystem/path.cc ++++ b/libstdc++-v3/src/filesystem/path.cc +@@ -371,8 +371,13 @@ path::_M_split_cmpts() + _M_add_root_dir(0); + ++pos; + } +-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS ++#if defined(_GLIBCXX_FILESYSTEM_IS_WINDOWS) \ ++ || defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) ++#ifdef __DJGPP__ ++ else if (len > 1 && _M_pathname[1] == ':') ++#else + else if (len > 1 && _M_pathname[1] == L':') ++#endif + { + // got disk designator + _M_add_root_name(2); |