Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Install i686-pc-msdosdjgpp #45

Open
michaeljhkim opened this issue Mar 4, 2023 · 19 comments
Open

Install i686-pc-msdosdjgpp #45

michaeljhkim opened this issue Mar 4, 2023 · 19 comments

Comments

@michaeljhkim
Copy link

So I tried to install this like specified, but it only installs the i586 version. I need the i686 version, and there are no instructions on how to do that.
There is an arch pkg build, but I can't get access to it because I am on fedora. Is there anything I could do?

Thank you.

@lpsantil
Copy link

lpsantil commented Mar 4, 2023

@michaeljhkim
Copy link
Author

So I just need to change i586 to i686?

@lpsantil
Copy link

Pretty much. I'll run through this effort right now to validate it.

@lpsantil
Copy link

lpsantil commented Mar 24, 2023

On Fedora 36 using my 7 year old Dell Precision 3420, Xeon E3-1245 v5 3.5GHz, 64GB DDR4, Kingston 240GB M.2 SSD a full build takes about 30 minutes. Not quite finished though. The djlsr205 build is configured for an MTUNE of i586 and therefore expects a i586-pc-msdosdjgpp-* set of tools. I'll need to workaround it later this weekend. Probably need to look at patch/patch-djlsr205.txt or write a new patch/sed into script/12.1.0-i686.

Note, the build-djgpp script could be improved w.r.t. parallelism. It's currently set to be single threaded within build-djgpp while all the tools support multi-threaded compilation. Only the last step does a make j=4 (which I think should be -j=4).

build-djgpp also seems to build with debugging turned on, which is fair, tbh. Slower builds, larger binaries, potentially slower cross-compiler binaries is the result. I think you can remove -g from CFLAGS or set it to something other than -O2 -g. -Os or -O3 might be all you need. The resulting cross-compilers will run a bit faster. I like to wrap manual builds with the time utility (time -p below) to understand developer cycle latency. You can remove that from my instructions.

# sudo dnf install g++ gcc unzip bison flex make texinfo patch zlib-devel curl wget perl-File-Compare automake
# sed 's/i586/i686/g' script/12.1.0 >script/12.1.0-i686
# chmod -v 755 script/12.1.0-i686
# DJGPP_PREFIX=`pwd` time -p bash build-djgpp.sh 12.1.0-i686

I'll get back to this tonight or tomorrow evening.

@lpsantil
Copy link

lpsantil commented Mar 26, 2023

Alright.....got it. A bit of hacky sed patch to djlsr. djlsr is built with expectations of -mtune=i586/-mcpu=i586/-march=i386. I didn't feel like untangling that. There might be some reason to do it besides the widest possible compatibility. Look at patching djlsr205/src/{gcc-l.opt,gcc.opt,gpp.opt,makefile.cfg,dxe/makefile.dxe} if you really want to make it i686. Total build time on my old box is a bit over 33 minutes without patching in calls to nproc to scale out the make -j parameter.

Steps reproduce on Fedora 36.

# sudo dnf install g++ gcc unzip bison flex make texinfo patch zlib-devel curl wget perl-File-Compare automake
# sed -e 's/i586/i686/g' -e 's:"Building DXE tools.":"Building DXE tools." ; for Z in src/{makefile.def,dxe/makefile.dxe} ; do ( sed "s/i586/i686/g" $Z > $Z-i686 ; mv -v $Z{-i686,} ) ; done :g' script/12.1.0 >script/12.1.0-i686
# chmod -v 755 script/12.1.0-i686
# sed -e 's/i586/i686/g' setenv/setenv >setenv/setenv-i686 && mv -v setenv/setenv{-i686,}
# DJGPP_PREFIX=`pwd`/i686 time -p bash build-djgpp.sh 12.1.0-i686

Bottom of build log:

gcc -O2 -Wall -DDXE_LD=\"i686-pc-msdosdjgpp-ld\" -DDXE_CC=\"i686-pc-msdosdjgpp-gcc\" -DDXE_AR=\"i686-pc-msdosdjgpp-ar\" -DDXE_AS=\"i686-pc-msdosdjgpp-as\" dxe3gen.c -o dxe3gen
ln -s dxe3gen dxegen
gcc -O2 -Wall dxe3res.c -o dxe3res
#make -C mkdoc
#make -C libc
#make -C debug
#make -C djasm
#make -C stub
#make -C dxe
#make -C libemu
#make -C libm
#make -C utils
#make -C docs
#-make -C ../zoneinfo/src
make -f makempty
i686-pc-msdosdjgpp-gcc -pipe ... -c empty.s
i686-pc-msdosdjgpp-ar rv ../lib/libg.a empty.o
i686-pc-msdosdjgpp-ar: creating ../lib/libg.a
a - empty.o
i686-pc-msdosdjgpp-ar rv ../lib/libpc.a empty.o
i686-pc-msdosdjgpp-ar: creating ../lib/libpc.a
a - empty.o
Copy setenv script
Testing DJGPP.
Use DJGPP to build a test C program.
Use DJGPP to build a test C++ program.
build-djgpp.sh done.
real 1992.70
user 1730.22
sys 251.08

Cross compiler bits: (91M)

> ls -lak i686/bin/
total 92648
drwxr-xr-x. 1 lps lps     1382 Mar 25 23:18 .
drwxr-xr-x. 1 lps lps      350 Mar 25 22:45 ..
-rwxr-xr-x. 1 lps lps  3206496 Mar 25 22:47 i686-pc-msdosdjgpp-addr2line
-rwxr-xr-x. 2 lps lps  3364560 Mar 25 22:47 i686-pc-msdosdjgpp-ar
-rwxr-xr-x. 2 lps lps  5427152 Mar 25 22:47 i686-pc-msdosdjgpp-as
-rwxr-xr-x. 2 lps lps  1269280 Mar 25 23:18 i686-pc-msdosdjgpp-c++
-rwxr-xr-x. 1 lps lps  3162480 Mar 25 22:47 i686-pc-msdosdjgpp-c++filt
-rwxr-xr-x. 1 lps lps  1265184 Mar 25 23:18 i686-pc-msdosdjgpp-cpp
-rwxr-xr-x. 1 lps lps    97408 Mar 25 22:47 i686-pc-msdosdjgpp-elfedit
-rwxr-xr-x. 2 lps lps  1269280 Mar 25 23:18 i686-pc-msdosdjgpp-g++
-rwxr-xr-x. 2 lps lps  1265184 Mar 25 23:18 i686-pc-msdosdjgpp-gcc
-rwxr-xr-x. 2 lps lps  1265184 Mar 25 23:18 i686-pc-msdosdjgpp-gcc-12.1.0
-rwxr-xr-x. 1 lps lps    35888 Mar 25 23:18 i686-pc-msdosdjgpp-gcc-ar
-rwxr-xr-x. 1 lps lps    35888 Mar 25 23:18 i686-pc-msdosdjgpp-gcc-nm
-rwxr-xr-x. 1 lps lps    35888 Mar 25 23:18 i686-pc-msdosdjgpp-gcc-ranlib
-rwxr-xr-x. 1 lps lps   766728 Mar 25 23:18 i686-pc-msdosdjgpp-gcov
-rwxr-xr-x. 1 lps lps   578144 Mar 25 23:18 i686-pc-msdosdjgpp-gcov-dump
-rwxr-xr-x. 1 lps lps   602816 Mar 25 23:18 i686-pc-msdosdjgpp-gcov-tool
-rwxr-xr-x. 1 lps lps  3733216 Mar 25 22:47 i686-pc-msdosdjgpp-gprof
-rwxr-xr-x. 4 lps lps  4402600 Mar 25 22:47 i686-pc-msdosdjgpp-ld
-rwxr-xr-x. 4 lps lps  4402600 Mar 25 22:47 i686-pc-msdosdjgpp-ld.bfd
-rwxr-xr-x. 1 lps lps 29702904 Mar 25 23:18 i686-pc-msdosdjgpp-lto-dump
-rwxr-xr-x. 2 lps lps  3244200 Mar 25 22:47 i686-pc-msdosdjgpp-nm
-rwxr-xr-x. 2 lps lps  4175952 Mar 25 22:47 i686-pc-msdosdjgpp-objcopy
-rwxr-xr-x. 2 lps lps  5926496 Mar 25 22:47 i686-pc-msdosdjgpp-objdump
-rwxr-xr-x. 2 lps lps  3364552 Mar 25 22:47 i686-pc-msdosdjgpp-ranlib
-rwxr-xr-x. 2 lps lps  1659096 Mar 25 22:47 i686-pc-msdosdjgpp-readelf
-rwxr-xr-x. 1 lps lps  3196360 Mar 25 22:47 i686-pc-msdosdjgpp-size
-rwxr-xr-x. 1 lps lps  3192120 Mar 25 22:47 i686-pc-msdosdjgpp-strings
-rwxr-xr-x. 2 lps lps  4175984 Mar 25 22:47 i686-pc-msdosdjgpp-strip

DOS cross-built binaries: (56M)

> ls -lak i686-pc-msdosdjgpp/bin/
total 56844
drwxr-xr-x. 1 lps lps     256 Mar 25 23:18 .
drwxr-xr-x. 1 lps lps      34 Mar 25 22:08 ..
-rwxr-xr-x. 1 lps lps 3206496 Mar 25 23:18 addr2line
-rwxr-xr-x. 2 lps lps 3364560 Mar 25 22:47 ar
-rwxr-xr-x. 2 lps lps 5427152 Mar 25 22:47 as
-rwxr-xr-x. 1 lps lps 1269280 Mar 25 23:18 c++
-rwxr-xr-x. 1 lps lps 3162480 Mar 25 23:18 c++filt
-rwxr-xr-x. 1 lps lps 1265184 Mar 25 23:18 cpp
-rwxr-xr-x. 1 lps lps   43104 Mar 25 23:18 dxe3gen
-rwxr-xr-x. 1 lps lps   26096 Mar 25 23:18 dxe3res
-rwxr-xr-x. 1 lps lps   43104 Mar 25 23:18 dxegen
-rwxr-xr-x. 1 lps lps   25520 Mar 25 23:18 exe2coff
-rwxr-xr-x. 1 lps lps 1269280 Mar 25 23:18 g++
-rwxr-xr-x. 1 lps lps 1265184 Mar 25 23:18 gcc
-rwxr-xr-x. 4 lps lps 4402600 Mar 25 22:47 ld
-rwxr-xr-x. 4 lps lps 4402600 Mar 25 22:47 ld.bfd
-rwxr-xr-x. 2 lps lps 3244200 Mar 25 22:47 nm
-rwxr-xr-x. 2 lps lps 4175952 Mar 25 22:47 objcopy
-rwxr-xr-x. 2 lps lps 5926496 Mar 25 22:47 objdump
-rwxr-xr-x. 2 lps lps 3364552 Mar 25 22:47 ranlib
-rwxr-xr-x. 2 lps lps 1659096 Mar 25 22:47 readelf
-rwxr-xr-x. 1 lps lps 3196360 Mar 25 23:18 size
-rwxr-xr-x. 1 lps lps 3192120 Mar 25 23:18 strings
-rwxr-xr-x. 2 lps lps 4175984 Mar 25 22:47 strip
-rwxr-xr-x. 1 lps lps   26712 Mar 25 22:47 stubedit
-rwxr-xr-x. 1 lps lps   30504 Mar 25 22:47 stubify

DOS cross-built libc: (1.4M)

> ls -lak i686/i686-pc-msdosdjgpp/lib/
total 1356
drwxr-xr-x. 1 lps lps    156 Mar 25 22:47 .
drwxr-xr-x. 1 lps lps     34 Mar 25 22:08 ..
-rw-r--r--. 1 lps lps   4516 Oct 17  2015 crt0.o
-rw-r--r--. 1 lps lps   2720 May 10  2015 djgpp.djl
-rw-r--r--. 1 lps lps    628 Mar 25 22:47 dxe.ld
-rw-r--r--. 1 lps lps   4558 Oct 17  2015 gcrt0.o
drwxr-xr-x. 1 lps lps    132 Mar 25 22:47 ldscripts
-rw-r--r--. 1 lps lps 999320 Oct 18  2015 libc.a
-rw-r--r--. 1 lps lps  45298 Oct 18  2015 libdbg.a
-rw-r--r--. 1 lps lps  58804 Oct 18  2015 libemu.a
-rw-r--r--. 1 lps lps    482 Oct 18  2015 libg.a
-rw-r--r--. 1 lps lps 245346 Oct 18  2015 libm.a
-rw-r--r--. 1 lps lps    482 Oct 18  2015 libpc.a

@hughobrien
Copy link

hughobrien commented Jun 11, 2023

@lpsantil thank you for the patch! I'm trying to add it to Nixpkgs now

@jwt27
Copy link

jwt27 commented Jun 11, 2023

Why i686? All it does is set the default value for -march=, and then the target libraries are built with that. I would suggest using i386 instead for improved compatibility.

@hughobrien
Copy link

hughobrien commented Jun 11, 2023

I'm trying to replicate a tricky project that requires it

@jwt27
Copy link

jwt27 commented Jun 12, 2023

I'm not seeing anything that requires i686-compiled target libraries - only hardcoded compiler names, which is just bad practice. If you want to avoid patching the makefiles, symlinks would work too.

@hughobrien
Copy link

I think there's some benefit to MMX (which means i586 over i386) but agreed I don't see a strong i686 need. Once I have a working build I'll be able to experiment / benchmark removing it (and other odd choices in this project).

@graphixillusion
Copy link

graphixillusion commented Jul 7, 2023

@lpsantil i'm using your method to compile under msys2 but it always block at this error:

../../gnu/gcc-12.20/gcc/system.h:782:30: error: expected identifier before string constant
  782 | #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
      |                              ^~~~~~~~
../../gnu/gcc-12.20/gcc/system.h:782:30: error: expected ',' or '...' before string constant
../../gnu/gcc-12.20/gcc/system.h:782:30: error: expected identifier before string constant
  782 | #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
      |                              ^~~~~~~~
../../gnu/gcc-12.20/gcc/system.h:782:30: error: expected ',' or '...' before string constant
make[2]: *** [Makefile:1143: diagnostic-color.o] Error 1

under WSL2 (Ubuntu) it works fine but the problem is that under ubuntu it makes the binaries for linux and i need binaries for windows instead. How to solve this? Thank you!

@lpsantil
Copy link

lpsantil commented Jul 7, 2023

I just happened to have stood up a Windows box last night. So I might be able to help.

Just to be clear. All of the build-djgpp scripts will build cross compilers toolchain from the the native system to i586-pc-msdosdjgpp. So if you use WSL, you'll get a Linux toolchain (which will also work under WSL). If you use mingw/msys2, you'll get a Windows toolchain.

That said, there's already pre-built Windows i586-pc-msdosdjgpp toolchain at (https://github.com/andrewwutw/build-djgpp/releases) built with mingw. If you need an i686 version, then my steps should work with mingw or msys2. I'll test that out a little later today.

@graphixillusion
Copy link

@lpsantil yes i already testing your steps. Now i'm trying something, maybe i've found a similar issue in this code:

https://github.com/yosshin4004/xdev68k/blob/3d0f3d8bb935f9467f1320fc04d863e67a1b55a3/build_m68k-toolchain.sh#L202

i've adapted the build script with this modification: let's see if it will build correctly. I will report back

@lpsantil
Copy link

lpsantil commented Jul 7, 2023

I notice you're also using a new gcc version, 12.20 vs. 12.1.0 I used earlier this year. That might require other tweaks.

@graphixillusion
Copy link

I can confirm that with that modification i successfully built version 12.20 under msys2 mingw32

@lpsantil
Copy link

lpsantil commented Jul 8, 2023

That's great to hear. And if you're opposed to invoking perl, sed should be able to do the job as well. Something like

# sed -e 's/^#define abort/\/\/#define abort/'  `pwd`/gnu/gcc-12.*/system.h > `pwd`/gnu/gcc-12.*/system.h.tmp && mv -v `pwd`/gnu/gcc-12.*/system.h{.tmp,}

before build-djgpp.sh (though my paths will be wrong here).

@cblc
Copy link

cblc commented Jul 10, 2023

I also don't understand why the toolchain is called i586-pc-... . IMHO it should be i386-pc-.... The fact that it can build for i586 or i686 is just a minor variation of the executable, which should be specified via -march= flags, not hardcoded into the toolchain. If somebody really needs the toolchain to be called after the -march= setting, just write scripts with the wished name which call the i386-pc-... toolchain with the proper flags.

@lpsantil
Copy link

lpsantil commented Jul 10, 2023

At least w/arch x86 (<amd64), the gcc convention seems to be to identify the highest ISA supported by the toolchain.

@cblc
Copy link

cblc commented Jul 10, 2023

Oops, my mistake, I thought mingw-w64 was i386- for 32bit, but it's i686- ...you are right, sorry!

zimsneexh added a commit to revive9x/build-djgpp that referenced this issue Nov 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants