E3MKZ


Clang
-----

    "... - гонада - гнать - хна - хана..."

    Кстати, отрывок сверху называется "clanging". Очень показательный (и нехороший прогностически) симптом [1].


Clang -- альтернатива gcc при компиляции с таких языков программирования, как C, C++, Objective-C, Objective-C++. Название последнего языка в списке завораживает -- дело в том, что Objective-C был создан как альтернатива C++, (в основном доказывая его ненужность и бессмысленную сложность).

Идея замены проекта gcc, как главного построителя Unix систем и приложений зреет достаточно давно, поскольку ветвь gcc считается переусложненной и плохо управляемой. Среди других альтернатив можно назвать Intel C, PCC* и другие. Clang привлекает прежде всего своим LLVM backend'ом с выходом на Emscripten [2][3], и поддержкой проекта программистами Apple.

*) 20110405. Thanks to funding by BSD Fund,  Anders Magnusson has released the first stable release of PCC 1.0.0 (Portable C Compiler) for i386 and amd64. PCC was developed in order to create an alternative C compiler to GCC, but licensed under BSD.[4].


asm.js
------

    "If you make people think they're thinking, they'll love you; but if you really make them think, they'll hate you.
    
    Harlan Ellison"


Есть неплохой Tutorial по освоению emscripten [5], которым мы сейчас и воспользуемся. Все действия по установке и применению будем производить на виртуальной машине Ubuntu, что дает следующие преимущества:

  a) Результат работы легко законсервировать и отдать коллегам, друзьям, всем, кому Вам захочется отдать.
  
  b) В хосте не будут делаться ошибочные установки ПО и другие операции, которые смогут нарушить его нормальную работу.
  
  c) Наконец, это хороший повод применить полученные знания по ОС Unix на практике.

Итак,

  # apt-get install clang-3.2 llvm-3.2 nodejs emscripten
  
-- Проверим, что все в порядке

  $ which clang
  
  /usr/bin/clang
  
  $ sudo ldconfig -p | grep LLVM
  
  libLLVM-3.3.so.1 (libc6) => /usr/lib/i386-linux-gnu/libLLVM-3.3.so.1
  libLLVM-3.2.so.1 (libc6) => /usr/lib/i386-linux-gnu/libLLVM-3.2.so.1
  libLLVM-3.2.so (libc6) => /usr/lib/i386-linux-gnu/libLLVM-3.2.so

-- Тест примера

  $ cd ..
  $ mkdir hello
  $ cd hello
  $ vi hello.c

  #include <stdio.h>

  int main(void)
  {
       printf("Hello World from LLVM!\n");
       return 0;
  }

  $ clang --version

  clang version 3.2-1ubuntu7 (tags/RELEASE_32/final) (based on LLVM 3.2)
  Target: i386-pc-linux-gnu
  Thread model: posix
  
  $ clang hello.c -o hello
  $ ./hello
  
  Hello World from LLVM!


Nodejs
------

  # apt-get install nodejs
  # ln -s /usr/bin/nodejs /usr/sbin/node

Установка вручную с сайта http://nodejs.org/ описана в разделе "загрузка".
        
Проверка:

  $ node --version
  
  v0.10.15


Oracle Java
-----------

Файл ~/.emscripten содержит упоминания о Яве. Также в честь старта ветки 1.8.0

  # to meat future dependencies
  sudo apt-get install openjdk-7-jre-headless
  sudo apt-get purge openjdk-\*
  
  sudo mkdir -p /usr/local/java
  sudo mv Downloads/jdk-8-linux-i586.tar.gz /usr/local/java/
  cd /usr/local/java
  tar xf jdk-8-linux-i586.tar.gz

  update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0/jre/bin/java" 1
  update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0/bin/javac" 1
  update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0/jre/bin/javaws" 1

добавить в конец файла /etc/profile

  JAVA_HOME=/usr/local/java/jdk1.8.0
  PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
  JRE_HOME=/usr/local/java/jdk1.8.0/jre
  PATH=$PATH:$HOME/bin:$JRE_HOME/bin
  export JAVA_HOME
  export JRE_HOME
  export PATH


Emscripten -- все (everybody) в WEB!
------------------------------------

    "Сaptcha для людей или Ответ роботов:

       http://vesna.nologin.ru/Were+clanging+shut" 


Сотрем старые настройки и кеш emscripten:

  rm  ~/.emscripten
  rm -rf ~/.emscripten_cache

Скачаем emscripten (нужен для исходных файлов тестов):

  $ cd ~
  $ git clone https://github.com/kripken/emscripten.git

  -- Первый запуск создаст необходимые конфигурационные файлы:

  $ cd ~/emscripten
  $ emcc --help

  -- Для проверки работоспособности скомпилируем простейший тест:

  $ cd ~/emscripten
  $ em++ tests/hello_world.cpp
  
  INFO     root: (Emscripten: Running sanity checks)
  clang: warning: argument unused during compilation: '-nostdinc++'

  $ node a.out.js

  hello, world!
  
  -- Проверим генерацию .html с поддержкой GLES2/WebGL:

  $ cd ~/emscripten
  $ emcc tests/hello_world_gles.c -o hello_world_gles.html

На виртуальной машине имеет смысл поднять WEB сервер, наблюдая сгенерированные файлы HTML через браузер более быстрого хоста.

  # apt-get install apache2
  # service apache2 start
  # cp /home/virtu/emscripten/hello_world_gles.html .
  
В хосте файл виден как через Firefox так и через Chrome (необходимо добавить проброс 80 порта в Saucy -> Network Adapter 1 -> Port Forwarding -> Rule 2: TCP HostPort:80 GuestPort:80).


Как скомпилировать пример hello..gles
на более свежей версии emscripten/LLVM/clang?
---------------------------------------------

As root:

  #fastcomp prerequisites for Ubuntu 13.10 Saucy

  # Install the PPA for libsdl2
  sudo apt-get install python-software-properties
  sudo add-apt-repository ppa:zoogie/sdl2-snapshots
  sudo apt-get update
   
  # OpenGL
  sudo apt-get install libgl1-mesa-dev
  sudo apt-get install libglu1-mesa-dev
  sudo apt-get install libglew-dev
  sudo apt-get install libsdl2-dev
   
  # HTTP
  sudo apt-get install libcurl4-openssl-dev
   
  # Oculus
  sudo apt-get install libudev-dev
  sudo apt-get install libxinerama-dev

  #emscripten

  sudo apt-get install clang-3.2
  sudo apt-get install nodejs
  export EMSCRIPTEN=/opt/emscripten
  sudo mkdir -m 777 ${EMSCRIPTEN}
  git clone https://github.com/kripken/emscripten ${EMSCRIPTEN}
  cd ${EMSCRIPTEN} && git checkout 1.13.0 # Above versions are broken.
  echo "EMSCRIPTEN=${EMSCRIPTEN}" >> ~/.profile
  PATH=$PATH:/opt/emscripten
  export PATH

  #nodejs

  sudo apt-get update
  sudo apt-get install -y software-properties-common python-software-properties
  sudo add-apt-repository ppa:chris-lea/node.js
  sudo apt-get update


As user:

  cd ~
  git clone https://github.com/kripken/emscripten-fastcomp
  cd ~/emscripten-fastcomp
  git checkout incoming
  git clone https://github.com/kripken/emscripten-fastcomp-clang clang
  cd ~/emscripten-fastcomp/tools/clang
  git checkout incoming
  cd ~
  git clone https://github.com/aerys/minko.git
  cd ~/emscripten-fastcomp
  mkdir build
  cd build
  ../configure --enable-optimized --disable-assertions --enable-targets=host,js
  time make

sudo vi /etc/profile

  PATH=$PATH:/opt/emscripten
  export PATH

vi .profile

  EMSCRIPTEN=/opt/emscripten
  LLVM=~/emscripten-fastcomp/build/Release/bin
  export EMSCRIPTEN
  export LLVM


As root:

  apt-get remove clang-3.2 llvm-3.2
  apt-get autoremove
  apt-get install apache2
  service apache2 start


As user:

  emcc /opt/emscripten/tests/hello_world_gles.c -o hello_world_gles.html

  sudo cp hello_world_gles.html /var/www
  sudo cp hello_world_gles.html.map /var/www
  sudo cp hello_world_gles.js /var/www


Приложение А. Clang и LLVM из исходных кодов
--------------------------------------------

Установить пакеты, предваряющие установку LLVM+CLANG:

  # apt-get install git subversion cmake build-essential default-jre*
  
*) привожу ответ на просьбу установить build-essential в debian-wheezy (от gcc так просто не убежишь):

  root@debian:~# apt-get install build-essential
  Reading package lists... Done
  Building dependency tree
  Reading state information... Done
  The following extra packages will be installed:
    g++ g++-4.7 gcc libstdc++6-4.7-dev
  Suggested packages:
    g++-multilib g++-4.7-multilib gcc-4.7-doc libstdc++6-4.7-dbg gcc-multilib autoconf automake1.9 libtool flex bison gdb
    gcc-doc libstdc++6-4.7-doc
  The following NEW packages will be installed:
    build-essential g++ g++-4.7 gcc libstdc++6-4.7-dev
  0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
  Need to get 9,511 kB of archives.
  After this operation, 26.4 MB of additional disk space will be used.
  Do you want to continue [Y/n]?


2. Построить LLVM+Clang 3.4:

-- Создать папку для LLVM

  $ mkdir ~/llvm
  $ cd ~/llvm

-- Скачать с http://llvm.org/releases/download.html и распаковать

  $ wget -c http://llvm.org/releases/3.4/llvm-3.4.src.tar.gz
  $ wget -c http://llvm.org/releases/3.4/clang-3.4.src.tar.gz
  $ wget -c http://llvm.org/releases/3.4/compiler-rt-3.4.src.tar.gz

  $ tar zxvf ./llvm-3.4.src.tar.gz
  $ tar zxvf ./clang-3.4.src.tar.gz
  $ tar zxvf ./compiler-rt-3.4.src.tar.gz

-- Упорядочить расположение папок

  $ mv ./llvm-3.4.src ./llvm-3.4
  $ mv ./clang-3.4.src ./clang
  $ mv ./clang ./llvm-3.4/tools/
  $ mv ./compiler-rt-3.4.src ./compiler-rt
  $ mv ./compiler-rt ./llvm-3.4/projects/

-- Создать папку для результатов

  $ mkdir ./build
  $ cd ./build

Требуемое дерево папок

  llvm
  |-- build (мы здесь)
  |-- llvm-3.2
  |   |-- projects
  |   |   |-- compiler-rt
  |   |-- tools
  |   |   |-- clang
  |-- clang-3.4.src.tar.gz
  |-- compiler-rt-3.4.src.tar.gz
  |-- llvm-3.4.src.tar.gz

-- находясь в папке build, начинаем строительство. Теперь строительный мусор не перемешается с исходными файлами.

  $ ../llvm-3.4/configure --enable-shared
  $ time make -j 3
  
На виртуальной машине у нас есть пара -- тройка часов свободного времени. Затем тестируем построенное (на виртуальной машине это еще часок. В этом месте обычно начинает душить джаба на тему a) ).

  $ make check-all

добавить к пути:

  $ vi ~/.bashrc

В конец файла пишем
  
  export PATH=$PATH:~/llvm/build/Release+Asserts/bin

  $ sudo vi /etc/ld.so.conf.d/llvm.conf

Добавить строку (скорее всего она единственная, так как файл создан строкой выше)

  /home/virtu/llvm/build/Release+Asserts/lib

Активируем изменения

  $ source ~/.bashrc
  $ sudo ldconfig


Ссылки
------

[1]. http://lebed.com/gbarch/gb20100301.htm
[2]. http://minko.io
[3]. http://doc.v3.minko.io/wiki/Main_Page
[4]. http://www.freebsdnews.net
          /2011/04/05/released-portable-c-compiler-pcc-1-0/
[5]. https://github.com/kripken/emscripten/wiki/Tutorial
[6]. https://github.com/kripken/emscripten/wiki
           /Getting-Started-on-Ubuntu-12.10
[7]. http://linuxdeveloper.blogspot.co.uk
          /2012/12/building-llvm-32-from-source.html
          
          