xref: /llvm-project/libc/docs/getting_started.rst (revision 692c77f2af133874f18942fe8c32f0f072bfc02b)
1*692c77f2SNick DesaulniersGetting Started
2*692c77f2SNick Desaulniers===============
3*692c77f2SNick Desaulniers
4*692c77f2SNick DesaulniersLet's fetch the llvm-libc sources and build them.
5*692c77f2SNick Desaulniers
6*692c77f2SNick DesaulniersInstall dependencies first:
7*692c77f2SNick Desaulniers
8*692c77f2SNick Desaulniers.. code-block:: sh
9*692c77f2SNick Desaulniers
10*692c77f2SNick Desaulniers  $ sudo apt update
11*692c77f2SNick Desaulniers  $ sudo apt install git cmake ninja-build clang gcc-multilib
12*692c77f2SNick Desaulniers
13*692c77f2SNick Desaulniers.. code-block:: sh
14*692c77f2SNick Desaulniers
15*692c77f2SNick Desaulniers  $ git clone --depth=1 git@github.com:llvm/llvm-project.git /tmp/llvm-project
16*692c77f2SNick Desaulniers  $ mkdir /tmp/llvm-project/build
17*692c77f2SNick Desaulniers  $ cd /tmp/llvm-project/build
18*692c77f2SNick Desaulniers  $ cmake ../runtimes -GNinja \
19*692c77f2SNick Desaulniers    -DLLVM_ENABLE_RUNTIMES="libc;compiler-rt" \
20*692c77f2SNick Desaulniers    -DCMAKE_BUILD_TYPE=Debug \
21*692c77f2SNick Desaulniers    -DCMAKE_CXX_COMPILER=clang++ \
22*692c77f2SNick Desaulniers    -DCMAKE_C_COMPILER=clang \
23*692c77f2SNick Desaulniers    -DLLVM_LIBC_FULL_BUILD=ON \
24*692c77f2SNick Desaulniers    -DLLVM_LIBC_INCLUDE_SCUDO=ON \
25*692c77f2SNick Desaulniers    -DCOMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC=ON \
26*692c77f2SNick Desaulniers    -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \
27*692c77f2SNick Desaulniers    -DCOMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED=OFF
28*692c77f2SNick Desaulniers  $ ninja libc libm
29*692c77f2SNick Desaulniers
30*692c77f2SNick DesaulniersThis will produce the following artifacts:
31*692c77f2SNick Desaulniers
32*692c77f2SNick Desaulniers.. code-block::
33*692c77f2SNick Desaulniers
34*692c77f2SNick Desaulniers  llvm-project/build/libc/lib/libc.a
35*692c77f2SNick Desaulniers  llvm-project/build/libc/lib/libm.a
36*692c77f2SNick Desaulniers  llvm-project/build/libc/startup/linux/crt1.o
37*692c77f2SNick Desaulniers  llvm-project/build/libc/include/**.h
38*692c77f2SNick Desaulniers
39*692c77f2SNick DesaulniersWe can then compile and run hello world via:
40*692c77f2SNick Desaulniers
41*692c77f2SNick Desaulniers.. code-block:: c++
42*692c77f2SNick Desaulniers
43*692c77f2SNick Desaulniers  // hello.c
44*692c77f2SNick Desaulniers  #include <stdio.h>
45*692c77f2SNick Desaulniers  int main () { puts("hello world"); }
46*692c77f2SNick Desaulniers
47*692c77f2SNick Desaulniers.. code-block:: sh
48*692c77f2SNick Desaulniers
49*692c77f2SNick Desaulniers   $ clang -nostdinc -nostdlib hello.c -I libc/include \
50*692c77f2SNick Desaulniers     -I $(clang -print-resource-dir)/include libc/startup/linux/crt1.o \
51*692c77f2SNick Desaulniers     libc/lib/libc.a
52*692c77f2SNick Desaulniers   $ ./a.out
53*692c77f2SNick Desaulniers   hello world
54*692c77f2SNick Desaulniers
55*692c77f2SNick DesaulniersThis was what we call a "full build" of llvm-libc. From here, you can visit
56*692c77f2SNick Desaulniers:ref:`full_host_build` for more info, :ref:`full_cross_build` for cross
57*692c77f2SNick Desaulnierscompiling, :ref:`overlay_mode` for mixing llvm-libc with another libc, or
58*692c77f2SNick Desaulniers:ref:`libc_gpu` for targeting GPUs.
59