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

Should be able to build for Windows using mingw64.exe shell #40

Open
c0d3h4x0r opened this issue Mar 11, 2020 · 3 comments
Open

Should be able to build for Windows using mingw64.exe shell #40

c0d3h4x0r opened this issue Mar 11, 2020 · 3 comments

Comments

@c0d3h4x0r
Copy link

c0d3h4x0r commented Mar 11, 2020

I've been trying to get mame2016-libretro building under mingw64.exe (rather than the MSYS2-based win32env shell), which has required me to pull in the latest stable version (version 1115 (commit cd9b1a624810b166d11788d01c2aa4daf2ea42e6)) of GENie to resolve some build errors.

With that in place, I still get the following remaining build errors:

:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ../../../../gmake/libretro/debug/mame_mame/libsega.a(model1.o): in function `model1_state::model1_interrupt(timer_device&, void*, int)':
C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model1.cpp:745: undefined reference to `segam1audio_device::check_fifo_irq()'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ../../../../gmake/libretro/debug/mame_mame/libsega.a(model1.o): in function `model1_state::snd_68k_ready_r(address_space&, unsigned int, unsigned short)':
C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model1.cpp:848: undefined reference to `segam1audio_device::ready_r(address_space&, unsigned int, unsigned short)'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ../../../../gmake/libretro/debug/mame_mame/libsega.a(model1.o): in function `model1_state::snd_latch_to_68k_w(address_space&, unsigned int, unsigned short, unsigned short)':
C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model1.cpp:859: undefined reference to `segam1audio_device::write_fifo(unsigned char)'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ../../../../gmake/libretro/debug/mame_mame/libsega.a(model1.o):model1.cpp:(.rdata$.refptr.SEGAM1AUDIO[.refptr.SEGAM1AUDIO]+0x0): undefined reference to `SEGAM1AUDIO'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ../../../../gmake/libretro/debug/mame_mame/libsega.a(model2.o): in function `model2_state::model2o_serial_w(address_space&, unsigned int, unsigned int, unsigned int)':
C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model2.cpp:1186: undefined reference to `segam1audio_device::ready_r(address_space&, unsigned int, unsigned short)'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model2.cpp:1191: undefined reference to `segam1audio_device::write_fifo(unsigned char)'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ../../../../gmake/libretro/debug/mame_mame/libsega.a(model2.o): in function `model2_state::model2_serial_w(address_space&, unsigned int, unsigned int, unsigned int)':
C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model2.cpp:1210: undefined reference to `segam1audio_device::ready_r(address_space&, unsigned int, unsigned short)'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\src\mame2016-libretro\build\projects\retro\mame\gmake-mingw64-gcc/../../../../../src/mame/drivers/model2.cpp:1215: undefined reference to `segam1audio_device::write_fifo(unsigned char)'
collect2.exe: error: ld returned 1 exit status
make[3]: *** [mame2016.make:556: ../../../../../mame2016_libretro.dll] Error 1
make[2]: *** [Makefile:940: mame2016] Error 2
make[2]: Leaving directory '/src/mame2016-libretro/build/projects/retro/mame/gmake-mingw64-gcc'
make[1]: *** [makefile:931: windows_x64] Error 2
make[1]: Leaving directory '/src/mame2016-libretro'
make: *** [Makefile.libretro:198: build] Error 2

This is caused by incorrect library ordering in the generated mame2016.make. libshared.a needs to come before libsega.a in order for that function to be recognized by the linker when it reasons over libsega.a.

The LUA code responsible for this appears to reside in make_cpp.lua, inside the function cpp.linker(). It needs to somehow be adjusted to guarantee the correct relative static library ordering as needed by mame2016-libretro in order to successfully link.

@c0d3h4x0r
Copy link
Author

I am working on a fix for this.

@c0d3h4x0r c0d3h4x0r changed the title Building under mingw64.exe fails due to libsega.a undefined reference errors Building on Windows under mingw64.exe fails due to libsega.a undefined reference errors Mar 11, 2020
@c0d3h4x0r c0d3h4x0r changed the title Building on Windows under mingw64.exe fails due to libsega.a undefined reference errors Should be able to build for Windows using mingw64.exe shell Mar 12, 2020
@c0d3h4x0r
Copy link
Author

I've think I've finally got this working. I had to add a table-ordering hack to make_cpp.lua in GENie, then run genie embed to force scripts.c to get regenerated correctly, then rebuild mame2016-libretro with REGENIE=1.

@y0ush4
Copy link

y0ush4 commented Apr 17, 2024

can you please guide me whats wrong

Generating ../build/projects/windows/mame/gmake-mingw64-gcc/zenith.make...
Generating ../build/projects/windows/mame/gmake-mingw64-gcc/zpa.make...
Generating ../build/projects/windows/mame/gmake-mingw64-gcc/zvt.make...
Generating ../build/projects/windows/mame/gmake-mingw64-gcc/skeleton.make...
Generating ../build/projects/windows/mame/gmake-mingw64-gcc/mame2016.make...
Done.
Precompiling src/emu/emu.h...
In file included from ../../../../../src/emu/emu.h:60:
../../../../../src/emu/input.h: In copy constructor 'input_seq::input_seq(const input_seq&)':
../../../../../src/emu/input.h:451:49: error: 'void* memcpy(void*, const void*, size_t)' writing to an object of non-trivially copyable type 'class input_code'; use copy-assignment or copy-initialization instead [-Werror=class-memaccess]
451 | input_seq(const input_seq &rhs) { memcpy(m_code, rhs.m_code, sizeof(m_code)); }
| ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ../../../../../src/emu/emu.h:60:
../../../../../src/emu/input.h:400:7: note: 'class input_code' declared here
400 | class input_code
| ^~~~~~~~~~
cc1plus.exe: all warnings being treated as errors
precompile.make:455: recipe for target '../../../../mingw-gcc/obj/x64/Release/emu.h.gch' failed
make[2]: *** [../../../../mingw-gcc/obj/x64/Release/emu.h.gch] Error 1
makefile:70: recipe for target 'precompile' failed
make[1]: *** [precompile] Error 2
makefile:930: recipe for target 'windows_x64' failed
make: *** [windows_x64] Error 2

[MINGW64] C:\msys64\src\mame2016-libretro>cc1plus.exe: all warnings being treated as errors
'cc1plus.exe:' is not recognized as an internal or external command,
operable program or batch file.

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

2 participants