Code Monkey home page Code Monkey logo

Comments (7)

snesrev avatar snesrev commented on September 25, 2024 2

Can you try now?

from zelda3.

krishean avatar krishean commented on September 25, 2024 1

Builds on 32-bit here as well, and cross compiles for 32-bit with MinGW on Linux, but I'd suggest using #ifndef __MINGW32__ instead of #if defined(_MSC_VER), since it does compile properly for native 64-bit Linux, as well as cross compiling for 64-bit, and MSYS2 64-bit.

from zelda3.

impeeza avatar impeeza commented on September 25, 2024

Did you try the e4febaf commit? works very well to me.

from zelda3.

krishean avatar krishean commented on September 25, 2024

To compile for 32-bit you need to use the "MSYS2 MinGW 32-bit" shortcut with the gray icon on the start menu and install a few additional packages with: pacman -S mingw-w64-i686-gcc mingw-w64-i686-SDL2 mingw-w64-i686-python-yaml mingw-w64-i686-python3-pillow

The e4febaf commit works for 64-bit, but still has the problem when compiling for 32-bit.

from zelda3.

impeeza avatar impeeza commented on September 25, 2024

you are completely right, I just remove all MSYS from my system, Install msys2-x86_64-20220904.exe, then run pacman -Syu several times until no new installations ocurr and receive there is nothing to do message.

then I run MINGW32 (grey one) and install the packages:

pacman -Sy --needed --noconfirm git make mingw-w64-x86_64-python mingw-w64-i686-python3-pillow mingw-w64-i686-python-yaml mingw-w64-i686-gcc mingw-w64-i686-SDL2 mingw-w64-x86_64-SDL2

then copy the ROM to ~/zelda3/tables/zelda3.sfc
Then on Zelda3 folder run make -j$(nproc)
and the result is:

Impeeza@Titan MINGW32 ~/zelda3
$ make clean ; make -j$(nproc)
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 ancilla.c -o ancilla.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 attract.c -o attract.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 audio.c -o audio.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 config.c -o config.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 dungeon.c -o dungeon.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 ending.c -o ending.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 glsl_shader.c -o glsl_shader.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 hud.c -o hud.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 load_gfx.c -o load_gfx.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 main.c -o main.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 messaging.c -o messaging.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 misc.c -o misc.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 nmi.c -o nmi.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 opengl.c -o opengl.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 overlord.c -o overlord.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 overworld.c -o overworld.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 player.c -o player.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 player_oam.c -o player_oam.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 poly.c -o poly.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 select_file.c -o select_file.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 spc_player.c -o spc_player.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 sprite.c -o sprite.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 sprite_main.c -o sprite_main.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 tagalong.c -o tagalong.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 tile_detect.c -o tile_detect.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 util.c -o util.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 zelda_cpu_infra.c -o zelda_cpu_infra.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 zelda_rtl.c -o zelda_rtl.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/apu.c -o snes/apu.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/cart.c -o snes/cart.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/cpu.c -o snes/cpu.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/dma.c -o snes/dma.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/dsp.c -o snes/dsp.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/input.c -o snes/input.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/ppu.c -o snes/ppu.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/snes.c -o snes/snes.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/snes_other.c -o snes/snes_other.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/spc.c -o snes/spc.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 snes/tracing.c -o snes/tracing.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 third_party/gl_core/gl_core_3_1.c -o third_party/gl_core/gl_core_3_1.o
cc -c -O2 -Werror -IC:/msys64/mingw32/include/SDL2 -Dmain=SDL_main -DSYSTEM_VOLUME_MIXER_AVAILABLE=0 third_party/opus-1.3.1-stripped/opus_decoder_amalgam.c -o third_party/opus-1.3.1-stripped/opus_decoder_amalgam.o
Generating Windows resources
In file included from third_party/opus-1.3.1-stripped/opus_decoder_amalgam.c:24:
third_party/opus-1.3.1-stripped/x86/pitch_sse.c: In function 'dual_inner_prod_sse':
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:86:10: error: SSE vector return without SSE enabled changes the ABI [-Werror=psabi]
   86 |    xsum1 = _mm_setzero_ps();
      |    ~~~~~~^~~~~~~~~~~~~~~~~~
In file included from Extracting game resources
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:40:
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:118:1: error: inlining failed in call to 'always_inline' '_mm_setzero_ps': target specific option mismatch
  118 | _mm_setzero_ps (void)
      | ^~~~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:87:12: note: called from here
   87 |    xsum2 = _mm_setzero_ps();
      |            ^~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:118:1: error: inlining failed in call to 'always_inline' '_mm_setzero_ps': target specific option mismatch
  118 | _mm_setzero_ps (void)
      | ^~~~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:86:12: note: called from here
   86 |    xsum1 = _mm_setzero_ps();
      |            ^~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:184:1: error: inlining failed in call to 'always_inline' '_mm_add_ps': target specific option mismatch
  184 | _mm_add_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:94:15: note: called from here
   94 |       xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(xi, y2i));
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:196:1: error: inlining failed in call to 'always_inline' '_mm_mul_ps': target specific option mismatch
  196 | _mm_mul_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:94:15: note: called from here
   94 |       xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(xi, y2i));
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:184:1: error: inlining failed in call to 'always_inline' '_mm_add_ps': target specific option mismatch
  184 | _mm_add_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:93:15: note: called from here
   93 |       xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(xi, y1i));
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:196:1: error: inlining failed in call to 'always_inline' '_mm_mul_ps': target specific option mismatch
  196 | _mm_mul_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:93:15: note: called from here
   93 |       xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(xi, y1i));
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:932:1: error: inlining failed in call to 'always_inline' '_mm_loadu_ps': target specific option mismatch
  932 | _mm_loadu_ps (float const *__P)
      | ^~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:92:20: note: called from here
   92 |       __m128 y2i = _mm_loadu_ps(y02+i);
      |                    ^~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:932:1: error: inlining failed in call to 'always_inline' '_mm_loadu_ps': target specific option mismatch
  932 | _mm_loadu_ps (float const *__P)
      | ^~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:91:20: note: called from here
   91 |       __m128 y1i = _mm_loadu_ps(y01+i);
      |                    ^~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:932:1: error: inlining failed in call to 'always_inline' '_mm_loadu_ps': target specific option mismatch
  932 | _mm_loadu_ps (float const *__P)
      | ^~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:90:19: note: called from here
   90 |       __m128 xi = _mm_loadu_ps(x+i);
      |                   ^~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:961:1: error: inlining failed in call to 'always_inline' '_mm_store_ss': target specific option mismatch
  961 | _mm_store_ss (float *__P, __m128 __A)
      | ^~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:102:4: note: called from here
  102 |    _mm_store_ss(xy2, xsum2);
      |    ^~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:128:1: error: inlining failed in call to 'always_inline' '_mm_add_ss': target specific option mismatch
  128 | _mm_add_ss (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:101:12: note: called from here
  101 |    xsum2 = _mm_add_ss(xsum2, _mm_shuffle_ps(xsum2, xsum2, 0x55));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:744:1: error: inlining failed in call to 'always_inline' '_mm_shuffle_ps': target specific option mismatch
  744 | _mm_shuffle_ps (__m128 __A, __m128 __B, int const __mask)
      | ^~~~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:101:12: note: called from here
  101 |    xsum2 = _mm_add_ss(xsum2, _mm_shuffle_ps(xsum2, xsum2, 0x55));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:184:1: error: inlining failed in call to 'always_inline' '_mm_add_ps': target specific option mismatch
  184 | _mm_add_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:100:12: note: called from here
  100 |    xsum2 = _mm_add_ps(xsum2, _mm_movehl_ps(xsum2, xsum2));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:785:1: error: inlining failed in call to 'always_inline' '_mm_movehl_ps': target specific option mismatch
  785 | _mm_movehl_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:100:12: note: called from here
  100 |    xsum2 = _mm_add_ps(xsum2, _mm_movehl_ps(xsum2, xsum2));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:961:1: error: inlining failed in call to 'always_inline' '_mm_store_ss': target specific option mismatch
  961 | _mm_store_ss (float *__P, __m128 __A)
      | ^~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:99:4: note: called from here
   99 |    _mm_store_ss(xy1, xsum1);
      |    ^~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:128:1: error: inlining failed in call to 'always_inline' '_mm_add_ss': target specific option mismatch
  128 | _mm_add_ss (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:98:12: note: called from here
   98 |    xsum1 = _mm_add_ss(xsum1, _mm_shuffle_ps(xsum1, xsum1, 0x55));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:744:1: error: inlining failed in call to 'always_inline' '_mm_shuffle_ps': target specific option mismatch
  744 | _mm_shuffle_ps (__m128 __A, __m128 __B, int const __mask)
      | ^~~~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:98:12: note: called from here
   98 |    xsum1 = _mm_add_ss(xsum1, _mm_shuffle_ps(xsum1, xsum1, 0x55));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:184:1: error: inlining failed in call to 'always_inline' '_mm_add_ps': target specific option mismatch
  184 | _mm_add_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:97:12: note: called from here
   97 |    xsum1 = _mm_add_ps(xsum1, _mm_movehl_ps(xsum1, xsum1));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/msys64/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/include/xmmintrin.h:785:1: error: inlining failed in call to 'always_inline' '_mm_movehl_ps': target specific option mismatch
  785 | _mm_movehl_ps (__m128 __A, __m128 __B)
      | ^~~~~~~~~~~~~
third_party/opus-1.3.1-stripped/x86/pitch_sse.c:97:12: note: called from here
   97 |    xsum1 = _mm_add_ps(xsum1, _mm_movehl_ps(xsum1, xsum1));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1.exe: all warnings being treated as errors
make: *** [Makefile:23: third_party/opus-1.3.1-stripped/opus_decoder_amalgam.o] Error 1
make: *** Waiting for unfinished jobs....

Impeeza@Titan MINGW32 ~/zelda3

image

Thanks for your effort.

from zelda3.

impeeza avatar impeeza commented on September 25, 2024

Perfect! I just got a full functional Zelda3.exe 32 bits with no dependencies

from zelda3.

snesrev avatar snesrev commented on September 25, 2024

On 64-bit platforms _M_X64 will be true, so then it will already set OPUS_X86_PRESUME_SSE etc

from zelda3.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.