Git Product home page Git Product logo

mussel's Introduction

mussel

mussel is the shortest and fastest script available today to build working cross compilers that target musl libc.

Features

  1. Up-to-date: uses latest available upstream sources for packages
  2. Fast: probably the fastest script around to build a cross compiler targeting musl libc, and runs fully under dash
  3. Short: has the least amount of steps (see below) required to build a cross compiler targeting musl libc (even less than musl-cross-make)
  4. Small: all installation steps use install-strip where applicable
  5. Simple: easy to read, modify and extend
  6. POSIX Compliant: the entire script is POSIX compliant
  7. Well Documented: the script comes with a DOCUMENTATION.md file that includes state of the art information explaining what is being done and why

Requirements:

To confirm you have all required packages, please execute ./check.

Usage

Building a Cross Compiler

./mussel (arch) (flags)

(arch): See Supported Architectures below

(flags):

  f | -f | --enable-fortran        Enable optional Fortran support
  k | -k | --enable-pkg-config     Enable optional pkg-config support
  l | -l | --enable-linux-headers  Enable optional Linux Headers support
  o | -o | --enable-openmp         Enable optional OpenMP support
  p | -p | --parallel              Use all available cores on the host system
  q | -q | --enable-quadmath       Enable optional libquadmath support (default for Fortran)
  x | -x | --disable-cxx           Disable optional C++ support

Other Commands

./mussel (command)

(command):

  c | -c | --clean                 Clean mussel's build environment
  h | -h | --help                  Display this help message

Sources will be preserved.

Supported Architectures

  • aarch64
  • armv4t
  • armv5te
  • armv6
  • armv6kz (Raspberry Pi 1 Models A, B, B+, the Compute Module, and the Raspberry Pi Zero)
  • armv7
  • i486
  • i586
  • i686
  • m68k
  • microblaze
  • microblazeel
  • mips64
  • mips64el
  • mipsisa64r6
  • mipsisa64r6el
  • or1k
  • powerpc
  • powerpcle
  • powerpc64
  • powerpc64le
  • riscv64
  • s390x
  • sh2
  • sh2be
  • sh2-fdpic
  • sh2be-fdpic
  • sh4
  • sh4be
  • x86-64

Packages

  1. binutils: 2.42
  2. gcc: 13.2.0
  3. gmp: 6.3.0
  4. isl: 0.26
  5. linux: 6.5.3 (Optional Linux Headers Support) (Disabled by default)
  6. mpc: 1.3.1
  7. mpfr: 4.2.1
  8. musl: 1.2.4
  9. pkgconf: 2.1.0 (Optional pkg-config Support) (Disabled by default)

How Is mussel Doing It?

  1. Install musl headers
  2. Configure, build and install cross binutils
  3. Configure, build and install cross gcc (with libgcc-static)
  4. Configure, build and install musl
  5. Build, and install libgcc-shared

Optional Steps

  • Build and install libstdc++-v3 (Optional C++ Support) (Enabled by default)
  • Build and install libgomp (Optional OpenMP Support) (Disabled by default)
  • Build and install libquadmath (Optional Quadruple-precision Support) (Disabled by default, Enabled for Fortran)
  • Build and install libgfortran (Optional Fortran Support) (Disabled by default)
  • Install linux-headers (Optional Linux Headers Support) (Disabled by default)
  • Configure, build and install pkgconf (Optional pkg-config Support) (Disabled by default)

Using mussel With Host's pkg-config or pkgconf

The reason we included pkgconf with mussel as an optional step is because we can easily configure the host's pkg-config or pkgconf to work with mussel without having to build our own version of pkg-config or pkgconf.

Here are the five magical environment variables that we need to set to configure the host's pkg-config or pkgconf to work with mussel:

export PKG_CONFIG_PATH=$MSYSROOT/usr/lib/pkgconfig:$MSYSROOT/usr/share/pkgconfig
export PKG_CONFIG_LIBDIR=$MSYSROOT/usr/lib/pkgconfig:$MSYSROOT/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=$MSYSROOT

export PKG_CONFIG_SYSTEM_INCLUDE_PATH=$MSYSROOT/usr/include
export PKG_CONFIG_SYSTEM_LIBRARY_PATH=$MSYSROOT/usr/lib

The last two I believe are pkgconf specific but setting them won't do any harm.

Using mussel With Host's meson

mussel now provides cross-compilation configuration files for meson that support all listed architectures, and a wrapper around host's meson (mussel-meson) in an effort to make dealing with meson a bit easier.

Projects Using mussel

Credits and Inspiration

mussel is possible thanks to the awesome work done by Aurelian, Rich Felker, qword, The Managarm Project, glaucus (where it's actually implemented) and musl-cross-make.

Author

Firas Khalil Khana (firasuke) <[email protected]>

Contributors

License

mussel is licensed under the Internet Systems Consortium (ISC) license.

Dedication

mussel is dedicated to all those that believe setting up a cross compiler targeting musl libc is a complicated process.

Community

Mirrors

mussel's People

Contributors

4y8 avatar awbtux avatar awlsomealex avatar firasuke avatar speclad avatar takusuman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mussel's Issues

Check.sh on ubuntu jammy doesn't find libc6.

Running on WLS2, check runs:

p@LT:~$ ~/mussel/check.sh 
bash:      5.1.16(1)-release
bc:        1.07.1
binutils:  Binutils for Ubuntu) 2.38
bison:     3.8.2
bzip2:     1.0.8
ccache:    4.5.1
coreutils: 8.32
diffutils: 3.8
findutils: 4.8.0
g++:       11.3.0-1ubuntu1~22.04)
gawk:      5.1.0
gcc:       11.3.0-1ubuntu1~22.04)
git:       2.34.1
glibc:     /home/pwills/mussel/check.sh: 52: /lib/libc.so.6: not found
grep:      3.7
gzip:      1.10
linux:     5.10.102.1-microsoft-standard-WSL2
lzip:      1.23
m4:        1.4.18
make:      4.3
perl:      5.34.0
rsync:     3.2.3
sed:       4.8
tar:       1.34
texinfo:   6.8
xz:        5.2.5
zstd:      v1.4.8

This happens because /lib/libc.so.6 doesn't exist on ubuntu jammy with an up to date apt install libc6.

I'm not sure if this is the cause of the mussel script completing yet having an empty toolchain/arm-linux-musleabihf/include directory. Here is the file for that run of mussel.sh.

In an attempted workaround, I symlinked /lib/x86_64-linux-gnu/libc.so.6 to /lib/libc.so.6

This sort of fixed the check, but got the same empty include dir for the target. The simple workaround for this is just to copy the files from sources/musl/musl-${version}/include into the toolchain/arm-linux-musleabihf/include directory.

Note: the target examples I'm using are for mussel.sh armv7.

No such file or directory error on verifying step

.. Fetching binutils-2.42.tar.xz...
##################### 100.0% binutils-2.42.tar.xz##O=-
.. Verifying binutils-2.42.tar.xz...
 binutils-2.42.tar.xz: No such file or directory
08AB67877F7F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( binutils-2.42.tar.xz, r)
08AB67877F7F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. binutils-2.42.tar.xz is corrupted, redownloading...
##################### 100.0% binutils-2.42.tar.xz##O=-
.. Unpacking binutils-2.42.tar.xz...
=> binutils-2.42.tar.xz prepared.

.. Fetching gcc-13.2.0.tar.xz...
##################### 100.0% gcc-13.2.0.tar.xz##O=-
.. Verifying gcc-13.2.0.tar.xz...
 gcc-13.2.0.tar.xz: No such file or directory
087B27B30C7F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( gcc-13.2.0.tar.xz, r)
087B27B30C7F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. gcc-13.2.0.tar.xz is corrupted, redownloading...
##################### 100.0% gcc-13.2.0.tar.xz##O=-
.. Unpacking gcc-13.2.0.tar.xz...
=> gcc-13.2.0.tar.xz prepared.

.. Fetching gmp-6.3.0.tar.xz...
##################### 100.0% gmp-6.3.0.tar.xz##O=-
.. Verifying gmp-6.3.0.tar.xz...
 gmp-6.3.0.tar.xz: No such file or directory
082B7A19F67F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( gmp-6.3.0.tar.xz, r)
082B7A19F67F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. gmp-6.3.0.tar.xz is corrupted, redownloading...
##################### 100.0% gmp-6.3.0.tar.xz##O=-
.. Unpacking gmp-6.3.0.tar.xz...
=> gmp-6.3.0.tar.xz prepared.

.. Fetching isl-0.26.tar.xz...
##################### 100.0% isl-0.26.tar.xz##O=-
.. Verifying isl-0.26.tar.xz...
 isl-0.26.tar.xz: No such file or directory
088BE9ED3F7F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( isl-0.26.tar.xz, r)
088BE9ED3F7F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. isl-0.26.tar.xz is corrupted, redownloading...
##################### 100.0% isl-0.26.tar.xz##O=-
.. Unpacking isl-0.26.tar.xz...
=> isl-0.26.tar.xz prepared.

.. Fetching mpc-1.3.1.tar.gz...
##################### 100.0% mpc-1.3.1.tar.gz##O=-
.. Verifying mpc-1.3.1.tar.gz...
 mpc-1.3.1.tar.gz: No such file or directory
085B8F3AC57F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( mpc-1.3.1.tar.gz, r)
085B8F3AC57F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. mpc-1.3.1.tar.gz is corrupted, redownloading...
##################### 100.0% mpc-1.3.1.tar.gz##O=-
.. Unpacking mpc-1.3.1.tar.gz...
=> mpc-1.3.1.tar.gz prepared.

.. Fetching mpfr-4.2.1.tar.xz...
##################### 100.0% mpfr-4.2.1.tar.xz##O=-
.. Verifying mpfr-4.2.1.tar.xz...
 mpfr-4.2.1.tar.xz: No such file or directory
08FBA474427F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( mpfr-4.2.1.tar.xz, r)
08FBA474427F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. mpfr-4.2.1.tar.xz is corrupted, redownloading...
##################### 100.0% mpfr-4.2.1.tar.xz##O=-
.. Unpacking mpfr-4.2.1.tar.xz...
=> mpfr-4.2.1.tar.xz prepared.

.. Fetching musl-1.2.4.tar.gz...
##################### 100.0% musl-1.2.4.tar.gz##O=-
.. Verifying musl-1.2.4.tar.gz...
 musl-1.2.4.tar.gz: No such file or directory
089B13EA667F0000:error:80000002:system library:file_ctrl:No such file or directory:crypto/bio/bss_file.c:297:calling fopen( musl-1.2.4.tar.gz, r)
089B13EA667F0000:error:10080002:BIO routines:file_ctrl:system lib:crypto/bio/bss_file.c:300:
!. musl-1.2.4.tar.gz is corrupted, redownloading...
##################### 100.0% musl-1.2.4.tar.gz##O=-
.. Unpacking musl-1.2.4.tar.gz...
=> musl-1.2.4.tar.gz prepared.

.. Applying 0001-pure64-for-x86-64.patch from glaucus for gcc...
=> gcc patched with 0001-pure64-for-x86-64!

Toolchains can't be moved, as some paths appear to be hardcoded

When testing a build for aarch64 I noticed that the paths seem to be hardcoded, so toolchains can't be moved to a directory other than where they were built at. As you can see, aarch64-linux-musl-gcc works when invoked at mussel's default path:

andy:~/code/mussel/toolchain/bin$ ./aarch64-linux-musl-gcc test.c -o test -s -static -v
Using built-in specs.
COLLECT_GCC=./aarch64-linux-musl-gcc
COLLECT_LTO_WRAPPER=/home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/lto-wrapper
Target: aarch64-linux-musl
Configured with: /home/andy/code/mussel/sources/gcc/gcc-13.2.0/configure --prefix=/home/andy/code/mussel/toolchain --target=aarch64-linux-musl --with-sysroot=/home/andy/code/mussel/sysroot --enable-languages=c,c++ --disable-multilib --disable-bootstrap --disable-libsanitizer --disable-werror --enable-initfini-array --with-arch=armv8-a --with-abi=lp64 --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 13.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-o' 'test' '-s' '-static' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64'
 /home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/cc1 -quiet -v test.c -quiet -dumpbase test.c -dumpbase-ext .c -march=armv8-a -mlittle-endian -mabi=lp64 -version -o /tmp/cc9VhAz8.s
GNU C17 (GCC) version 13.2.0 (aarch64-linux-musl)
	compiled by GNU C version 13.2.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/home/andy/code/mussel/sysroot/usr/local/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/include
 /home/andy/code/mussel/sysroot/usr/include
 /home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/include
End of search list.
Compiler executable checksum: c3f9714356a1cc7be1615938ff7e0062
COLLECT_GCC_OPTIONS='-o' 'test' '-s' '-static' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64'
 /home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/bin/as -v -EL -march=armv8-a -mabi=lp64 -o /tmp/ccft0xy7.o /tmp/cc9VhAz8.s
GNU assembler version 2.42 (aarch64-linux-musl) using BFD version (GNU Binutils) 2.42
COMPILER_PATH=/home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/:/home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/:/home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/:/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/:/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/:/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/bin/
LIBRARY_PATH=/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/:/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/lib/../lib/:/home/andy/code/mussel/sysroot/lib/../lib/:/home/andy/code/mussel/sysroot/usr/lib/../lib/:/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/lib/:/home/andy/code/mussel/sysroot/lib/:/home/andy/code/mussel/sysroot/usr/lib/
COLLECT_GCC_OPTIONS='-o' 'test' '-s' '-static' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64' '-dumpdir' 'test.'
 /home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/collect2 -plugin /home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/liblto_plugin.so -plugin-opt=/home/andy/code/mussel/toolchain/libexec/gcc/aarch64-linux-musl/13.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccrj2Upo.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lc --sysroot=/home/andy/code/mussel/sysroot -Bstatic -X -EL -maarch64linux --fix-cortex-a53-835769 --fix-cortex-a53-843419 -o test -s /home/andy/code/mussel/sysroot/usr/lib/../lib/crt1.o /home/andy/code/mussel/sysroot/usr/lib/../lib/crti.o /home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/crtbeginT.o -L/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0 -L/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/lib/../lib -L/home/andy/code/mussel/sysroot/lib/../lib -L/home/andy/code/mussel/sysroot/usr/lib/../lib -L/home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/lib -L/home/andy/code/mussel/sysroot/lib -L/home/andy/code/mussel/sysroot/usr/lib /tmp/ccft0xy7.o --start-group -lgcc -lgcc_eh -lc --end-group /home/andy/code/mussel/toolchain/lib/gcc/aarch64-linux-musl/13.2.0/crtend.o /home/andy/code/mussel/sysroot/usr/lib/../lib/crtn.o
COLLECT_GCC_OPTIONS='-o' 'test' '-s' '-static' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64' '-dumpdir' 'test.'
andy:~/code/mussel/toolchain/bin$ echo $?
0

Now let's try compiling test.c after moving the toolchain into a new directory.

andy:~/code/mussel/toolchain/bin$ cd ../..
andy:~/code/mussel$ mkdir -p test_dir
mkdir: created directory 'test_dir'
andy:~/code/mussel$ mv sysroot toolchain test_dir/
renamed 'sysroot' -> 'test_dir/sysroot'
renamed 'toolchain' -> 'test_dir/toolchain'
andy:~/code/mussel$ cd test_dir/toolchain/bin
andy:~/code/mussel/test_dir/toolchain/bin$ ./aarch64-linux-musl-gcc test.c -o test -s -static -v

Since toolchain and sysroot were moved, gcc can no longer find the headers and thus fails.

Using built-in specs.
COLLECT_GCC=./aarch64-linux-musl-gcc
COLLECT_LTO_WRAPPER=/home/andy/code/mussel/test_dir/toolchain/bin/../libexec/gcc/aarch64-linux-musl/13.2.0/lto-wrapper
Target: aarch64-linux-musl
Configured with: /home/andy/code/mussel/sources/gcc/gcc-13.2.0/configure --prefix=/home/andy/code/mussel/toolchain --target=aarch64-linux-musl --with-sysroot=/home/andy/code/mussel/sysroot --enable-languages=c,c++ --disable-multilib --disable-bootstrap --disable-libsanitizer --disable-werror --enable-initfini-array --with-arch=armv8-a --with-abi=lp64 --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 13.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-o' 'test' '-s' '-static' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64'
 /home/andy/code/mussel/test_dir/toolchain/bin/../libexec/gcc/aarch64-linux-musl/13.2.0/cc1 -quiet -v -iprefix /home/andy/code/mussel/test_dir/toolchain/bin/../lib/gcc/aarch64-linux-musl/13.2.0/ test.c -quiet -dumpbase test.c -dumpbase-ext .c -march=armv8-a -mlittle-endian -mabi=lp64 -version -o /tmp/ccHA1H0P.s
GNU C17 (GCC) version 13.2.0 (aarch64-linux-musl)
	compiled by GNU C version 13.2.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/home/andy/code/mussel/sysroot/usr/local/include"
ignoring duplicate directory "/home/andy/code/mussel/test_dir/toolchain/bin/../lib/gcc/../../lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/include"
ignoring nonexistent directory "/home/andy/code/mussel/sysroot/usr/include"
ignoring duplicate directory "/home/andy/code/mussel/test_dir/toolchain/bin/../lib/gcc/../../lib/gcc/aarch64-linux-musl/13.2.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/andy/code/mussel/test_dir/toolchain/bin/../lib/gcc/aarch64-linux-musl/13.2.0/../../../../aarch64-linux-musl/include
 /home/andy/code/mussel/test_dir/toolchain/bin/../lib/gcc/aarch64-linux-musl/13.2.0/include
End of search list.
Compiler executable checksum: c3f9714356a1cc7be1615938ff7e0062
test.c:1:10: fatal error: stdio.h: No such file or directory
    1 | #include <stdio.h>
      |          ^~~~~~~~~
compilation terminated.
andy:~/code/mussel/test_dir/toolchain/bin$ echo $?
1

I'll submit another PR when I get around to it as I believe I found a fix, but I figured I'd file this issue so it's accounted for.

Got an "configure: error: cannot compute suffix of object files: cannot compile"

While I was building mussel via the Copacabana build system, I decided to look at the logs and saw that, at some point, the G.C.C. build broke:
image

The main script apparently exited on error, but Copacabana'''s build script didn't stop there --- and I think that's my fault, so I will fix it as soon as possible.

image

I also noted some more errors, but they're on my front.

Build failure on Debian Bullseye

Error information in the log file:

g++ -DHAVE_CONFIG_H   -I. -I/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl -I/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include -Iinclude/ -I/home/cat/git/mussel/sources/gcc/gcc-12.2.0/gmp -I/home/cat/git/mussel/builds/cross-gcc/./gmp   -g -O2   -MT isl_test_cpp17.o -MD -MP -MF $depbase.Tpo -c -o isl_test_cpp17.o /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc &&\
mv -f $depbase.Tpo $depbase.Po
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:20:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc: In function ‘isl::id construct_id(isl::ctx, bool*)’:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:25:24: error: no matching function for call to ‘isl::id::id(isl::ctx&, const char [2], std::shared_ptr<S>&)’
   25 |  isl::id id(ctx, "S", s);
      |                        ^
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:7:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note: candidate: ‘isl::id::id(isl::ctx, const string&)’
10634 | id::id(isl::ctx ctx, const std::string &str)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note:   candidate expects 2 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note: candidate: ‘isl::id::id(const isl::id&)’
10622 | id::id(const id &obj)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note:   candidate expects 1 argument, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note: candidate: ‘isl::id::id()’
10619 | id::id()
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note:   candidate expects 0 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note: candidate: ‘isl::id::id(isl_id*)’
10616 | id::id(__isl_take isl_id *ptr)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note:   candidate expects 1 argument, 3 provided
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:20:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc: In function ‘void test_try_user(isl::ctx)’:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:39:27: error: no matching function for call to ‘isl::id::id(isl::ctx&, const char [5], int)’
   39 |  isl::id id(ctx, "test", 5);
      |                           ^
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:7:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note: candidate: ‘isl::id::id(isl::ctx, const string&)’
10634 | id::id(isl::ctx ctx, const std::string &str)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note:   candidate expects 2 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note: candidate: ‘isl::id::id(const isl::id&)’
10622 | id::id(const id &obj)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note:   candidate expects 1 argument, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note: candidate: ‘isl::id::id()’
10619 | id::id()
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note:   candidate expects 0 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note: candidate: ‘isl::id::id(isl_id*)’
10616 | id::id(__isl_take isl_id *ptr)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note:   candidate expects 1 argument, 3 provided
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:20:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:42:22: error: ‘class isl::id’ has no member named ‘try_user’
   42 |  auto maybe_int = id.try_user<int>();
      |                      ^~~~~~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:42:31: error: expected primary-expression before ‘int’
   42 |  auto maybe_int = id.try_user<int>();
      |                               ^~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:43:20: error: ‘class isl::id’ has no member named ‘try_user’
   43 |  auto maybe_s = id.try_user<std::shared_ptr<S>>();
      |                    ^~~~~~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:43:46: error: expected primary-expression before ‘>’ token
   43 |  auto maybe_s = id.try_user<std::shared_ptr<S>>();
      |                                              ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:43:49: error: expected primary-expression before ‘)’ token
   43 |  auto maybe_s = id.try_user<std::shared_ptr<S>>();
      |                                                 ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:44:24: error: ‘class isl::id’ has no member named ‘try_user’
   44 |  auto maybe_int2 = id2.try_user<int>();
      |                        ^~~~~~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:44:33: error: expected primary-expression before ‘int’
   44 |  auto maybe_int2 = id2.try_user<int>();
      |                                 ^~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:60:21: error: ‘class isl::id’ has no member named ‘try_user’
   60 |   auto maybe_s = id.try_user<std::shared_ptr<S>>();
      |                     ^~~~~~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:60:47: error: expected primary-expression before ‘>’ token
   60 |   auto maybe_s = id.try_user<std::shared_ptr<S>>();
      |                                               ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17-generic.cc:60:50: error: expected primary-expression before ‘)’ token
   60 |   auto maybe_s = id.try_user<std::shared_ptr<S>>();
      |                                                  ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc: In function ‘void test_user(isl::ctx)’:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:44:27: error: no matching function for call to ‘isl::id::id(isl::ctx&, const char [5], int)’
   44 |  isl::id id(ctx, "test", 5);
      |                           ^
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:7:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note: candidate: ‘isl::id::id(isl::ctx, const string&)’
10634 | id::id(isl::ctx ctx, const std::string &str)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note:   candidate expects 2 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note: candidate: ‘isl::id::id(const isl::id&)’
10622 | id::id(const id &obj)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note:   candidate expects 1 argument, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note: candidate: ‘isl::id::id()’
10619 | id::id()
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note:   candidate expects 0 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note: candidate: ‘isl::id::id(isl_id*)’
10616 | id::id(__isl_take isl_id *ptr)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note:   candidate expects 1 argument, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:46:44: error: no matching function for call to ‘isl::id::id(isl::ctx&, const char [6], std::string)’
   46 |  isl::id id3(ctx, "test3", std::string("s"));
      |                                            ^
In file included from /home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:7:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note: candidate: ‘isl::id::id(isl::ctx, const string&)’
10634 | id::id(isl::ctx ctx, const std::string &str)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10634:1: note:   candidate expects 2 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note: candidate: ‘isl::id::id(const isl::id&)’
10622 | id::id(const id &obj)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10622:1: note:   candidate expects 1 argument, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note: candidate: ‘isl::id::id()’
10619 | id::id()
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10619:1: note:   candidate expects 0 arguments, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note: candidate: ‘isl::id::id(isl_id*)’
10616 | id::id(__isl_take isl_id *ptr)
      | ^~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/include/isl/cpp.h:10616:1: note:   candidate expects 1 argument, 3 provided
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:48:21: error: ‘class isl::id’ has no member named ‘user’
   48 |  auto int_user = id.user<int>();
      |                     ^~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:48:26: error: expected primary-expression before ‘int’
   48 |  auto int_user = id.user<int>();
      |                          ^~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:51:20: error: ‘class isl::id’ has no member named ‘user’
   51 |  auto s_user = id3.user<std::string>();
      |                    ^~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:51:36: error: expected primary-expression before ‘>’ token
   51 |  auto s_user = id3.user<std::string>();
      |                                    ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:51:38: error: expected primary-expression before ‘)’ token
   51 |  auto s_user = id3.user<std::string>();
      |                                      ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc: In lambda function:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:54:30: error: ‘class isl::id’ has no member named ‘user’
   54 |  check_invalid([&id] () { id.user<std::string>(); });
      |                              ^~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:54:46: error: expected primary-expression before ‘>’ token
   54 |  check_invalid([&id] () { id.user<std::string>(); });
      |                                              ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:54:48: error: expected primary-expression before ‘)’ token
   54 |  check_invalid([&id] () { id.user<std::string>(); });
      |                                                ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc: In lambda function:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:55:32: error: ‘class isl::id’ has no member named ‘user’
   55 |  check_invalid([&id2] () { id2.user<int>(); });
      |                                ^~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:55:37: error: expected primary-expression before ‘int’
   55 |  check_invalid([&id2] () { id2.user<int>(); });
      |                                     ^~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc: In lambda function:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:56:32: error: ‘class isl::id’ has no member named ‘user’
   56 |  check_invalid([&id2] () { id2.user<std::string>(); });
      |                                ^~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:56:48: error: expected primary-expression before ‘>’ token
   56 |  check_invalid([&id2] () { id2.user<std::string>(); });
      |                                                ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:56:50: error: expected primary-expression before ‘)’ token
   56 |  check_invalid([&id2] () { id2.user<std::string>(); });
      |                                                  ^
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc: In lambda function:
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:57:32: error: ‘class isl::id’ has no member named ‘user’
   57 |  check_invalid([&id3] () { id3.user<int>(); });
      |                                ^~~~
/home/cat/git/mussel/sources/gcc/gcc-12.2.0/isl/isl_test_cpp17.cc:57:37: error: expected primary-expression before ‘int’
   57 |  check_invalid([&id3] () { id3.user<int>(); });
      |                                     ^~~
make[3]: *** [Makefile:1970: isl_test_cpp17.o] Error 1
make[3]: Leaving directory '/home/cat/git/mussel/builds/cross-gcc/isl'
make[2]: *** [Makefile:2101: all-recursive] Error 1
make[2]: Leaving directory '/home/cat/git/mussel/builds/cross-gcc/isl'
make[1]: *** [Makefile:1589: all] Error 2
make[1]: Leaving directory '/home/cat/git/mussel/builds/cross-gcc/isl'
make: *** [Makefile:6565: all-isl] Error 2

Unable to Validate Checksum

.. Verifying binutils-2.40.tar.lz...
b3sum: skipping invalid checksum line
!. binutils-2.40.tar.lz is corrupted, redownloading...

mussel script gets stuck in a loop of downloading, attempting to check against checksum and then downloading again [same file]

I use the C implementation of the b3sum tool since most implementations are rust, like b3sum-ng

Perhaps add an option to use m5sum? Or perhaps, what is a good C/C++ implementation of b3sum?

Mussel Fails to Compile If GCC and/or binutils is not installed in /usr

My CMLFS system has LLVM & elftoolchain as default compiler and binary tools [and system libc is musl]. From my experience, GCC has to be built with binutils and not elftoolchain. My CMLFS system was able to build GCC with LLVM and binutils. I have not tried compiling mussel without GCC yet. Perhaps this experience of mine may be useful for this repo.

I installed GCC, mpc, mpfr, and binutils in /opt/gnu. GMP is installed in /usr. CPU architecture is x86_64. I had to do the following to compile mussel without errors:

  • Patched mussel script to use 'vendored' tuples with my patch ... CMLFS needs 'vendored' tuples for LLVM.
  • Add /opt/gnu to PATH in mussel.sh
  • For CMLFS, I want the toolchain installed at /cgnutools, so I modified mussel script to set MPREFIX="/cgnutools"
  • Create symlinks for 'missing' binaries: x86_64-pc-linux-musl-ranlib, x86_64-pc-linux-musl-ar ... these are linked to x86_64-pc-linux-musl-gcc-ar and x86_64-pc-linux-musl-gcc-ranlib ... otherwise mussel fails to build musl libc due to 'missing' those two binaries.
  • Execute script: sudo -E CC=/opt/gnu/bin/gcc CXX=/opt/gnu/bin/g++ ./mussel.sh x86_64 -l -o -k -p
  • Mussel completes with built toolchain at /cgnutools

I am planning to release 3.0.0 of CMLFS that uses mussel to bootstrap the toolchain. I wanted to see if a completed CMLFS system can rebuild itself...

lzip and zstd dependencies seem gratuitous

As far as I can see, both of these are used to unpack a single package each (binutils and GMP, respectively). Both of those projects also publish .xz packages that are roughly of the same size. It would make it a bit easier to set up the build environment if you were to drop those dependencies and use the .xz packages instead.

Feature/Discus request regarding canadian-cross compiling the toolchain

Hello there,

Because discussions is not enabled for this repo, I place it here, as it's not an issue.

I wonder if someone every tried to do a canadian-cross compile with this?
What my main goal is.

  • Build everything on a x86_64-linux-gnu system
  • Which targets armv6-linux-musleabihf for example
  • But, the host architecture where all is running on would be aarch64-linux-gnu

This way it would be possible to build cross-compilers for all the provided targets but then are able to run on a arm64/aarch64 host/architecture.

Else something like QEMU needs to be used to emulate the aarch64 architecture, which is probably not going to provide the best performance.

Someone an idea, or tried this before either using mussel or something else? And if so, does someone have any pointers?

Thanks in advance!

btw. I already tried to install the aarch64-linux-gnu-g** cross compilers, use that as GCC/G++ and added the correct --host and --build arguments to the configure commands.

./mussel.sh stops at ".. Installing musl headers..."

While running ./mussel.sh x86-64 -k -l -o -p and having all the sources downloaded, the script just finishes on .. Installing musl headers... without giving any error.
More details:

+=======================================================+
| mussel.sh - The fastest musl libc Toolchain Generator |
+-------------------------------------------------------+
|      Copyright (c) 2020-2022, Firas Khalil Khana      |
|     Distributed under the terms of the ISC License    |
+=======================================================+

Target Architecture:            x86-64

Optional C++ Support:           yes
Optional Linux Headers Support: yes
Optional OpenMP Support:        yes
Optional Parallel Support:      yes
Optional pkg-config Support:    yes


!. binutils source directory already exists, skipping...
!. binutils-2.38.tar.lz already exists, skipping...
.. Verifying binutils-2.38.tar.lz...
binutils-2.38.tar.lz: OK
.. Unpacking binutils-2.38.tar.lz...
=> binutils-2.38.tar.lz prepared.

!. gcc source directory already exists, skipping...
!. gcc-11.2.0.tar.xz already exists, skipping...
.. Verifying gcc-11.2.0.tar.xz...
gcc-11.2.0.tar.xz: OK
.. Unpacking gcc-11.2.0.tar.xz...
=> gcc-11.2.0.tar.xz prepared.

!. gmp source directory already exists, skipping...
!. gmp-6.2.1.tar.zst already exists, skipping...
.. Verifying gmp-6.2.1.tar.zst...
gmp-6.2.1.tar.zst: OK
.. Unpacking gmp-6.2.1.tar.zst...
=> gmp-6.2.1.tar.zst prepared.

!. isl source directory already exists, skipping...
!. isl-0.24.tar.xz already exists, skipping...
.. Verifying isl-0.24.tar.xz...
isl-0.24.tar.xz: OK
.. Unpacking isl-0.24.tar.xz...
=> isl-0.24.tar.xz prepared.

!. linux source directory already exists, skipping...
!. linux-5.14.15.tar.xz already exists, skipping...
.. Verifying linux-5.14.15.tar.xz...
linux-5.14.15.tar.xz: OK
.. Unpacking linux-5.14.15.tar.xz...
=> linux-5.14.15.tar.xz prepared.

!. mpc source directory already exists, skipping...
!. mpc-1.2.1.tar.gz already exists, skipping...
.. Verifying mpc-1.2.1.tar.gz...
mpc-1.2.1.tar.gz: OK
.. Unpacking mpc-1.2.1.tar.gz...
=> mpc-1.2.1.tar.gz prepared.

!. mpfr source directory already exists, skipping...
!. mpfr-4.1.0.tar.xz already exists, skipping...
.. Verifying mpfr-4.1.0.tar.xz...
mpfr-4.1.0.tar.xz: OK
.. Unpacking mpfr-4.1.0.tar.xz...
=> mpfr-4.1.0.tar.xz prepared.

!. musl source directory already exists, skipping...
!. musl-1.2.2.tar.gz already exists, skipping...
.. Verifying musl-1.2.2.tar.gz...
musl-1.2.2.tar.gz: OK
.. Unpacking musl-1.2.2.tar.gz...
=> musl-1.2.2.tar.gz prepared.

!. pkgconf source directory already exists, skipping...
!. pkgconf-1.8.0.tar.xz already exists, skipping...
.. Verifying pkgconf-1.8.0.tar.xz...
pkgconf-1.8.0.tar.xz: OK
.. Unpacking pkgconf-1.8.0.tar.xz...
=> pkgconf-1.8.0.tar.xz prepared.

.. Applying 0001-pure64-for-x86-64.patch from glaucus for gcc...
=> gcc patched with 0001-pure64-for-x86-64!

.. Cleaning builds directory...
=> builds cleaned.
.. Cleaning sysroot directory...
=> sysroot cleaned.

.. Preparing musl headers...
.. Installing musl headers...

Patches for musl explicitly produce a broken libc

All three patches (-ffast-math, powerpc, and powerpc64) are removing checks for conditions that produce a broken libc. By removing the checks, you're getting yourself (and your users) a broken libc. It will produce seriously wrong results, especially for the strtod and printf families, and might even be able to produce exploitable buffer overflows in them. It will also produce powerpc toolchains with silently broken ABI.

All of these patches should be removed, and the conditions that caused you to add them investigated and fixed. (They're indicative of your cross toolchain procedure not actually working.)

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.