andrewwutw / build-djgpp

Build DJGPP cross compiler and binutils on Windows (MinGW/Cygwin), Mac OSX and Linux
GNU General Public License v3.0
258 stars 55 forks source link

Install i686-pc-msdosdjgpp #45

Open michaeljhkim opened 1 year ago

michaeljhkim commented 1 year ago

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 commented 1 year ago

You’ll need to modify https://github.com/andrewwutw/build-djgpp/blob/master/script/12.1.0

michaeljhkim commented 1 year ago

So I just need to change i586 to i686?

lpsantil commented 1 year ago

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

lpsantil commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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

jwt27 commented 1 year ago

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 commented 1 year ago

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

jwt27 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

@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 commented 1 year ago

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 commented 1 year ago

@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 commented 1 year ago

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 commented 1 year ago

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

lpsantil commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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

cblc commented 1 year ago

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