Ural penguins - Сообщения с тегом mingw
http://uralbash.ru/blog/tag/mingw/atom.xml
2017-08-10T19:50:00Z
ABlog
Сборка libprotobuf под Windows
http://uralbash.ru/articles/2017/protobuf-mingw/
2017-08-10T19:50:00Z
2017-08-10T19:50:00Z
Uralbash
<div class="section" id="libprotobuf-windows">
<p>Сборка сей библиотеки из исходников под Windows не такая уж простая задача, как
может показаться на первый взгляд. Ее можно осуществлять при помощи Visual
Studio (cl.exe) или компилятора mingw.</p>
<div class="admonition seealso">
<p class="first admonition-title">См.также</p>
<p class="last"><a class="reference external" href="https://developers.google.com/protocol-buffers/">Protobuf</a></p>
</div>
<p>Вариант с mingw мне показался более родной и простой, поэтому начнем с установки MSYS2.</p>
<div class="admonition note">
<p class="first admonition-title">Примечание</p>
<p class="last">Скачать MSYS2 можно по адресу <a class="reference external" href="http://msys2.org">http://msys2.org</a></p>
</div>
<p>После установки в открывшейся консоле устанавливаем все необходимое. Protobuf
из пакетов нужен потому, что при сборке из исходных кодов будет использоваться
утилита <code class="docutils literal"><span class="pre">protoc.exe</span></code>.</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ pacman -S vim binutils base-devel unzip
$ pacman -S mingw-w64-i686-toolchain mingw-w64-i686-protobuf
</pre></div>
</div>
<p>Пропишем компилятор в окружение и симлинк на <code class="docutils literal"><span class="pre">protoc.exe</span></code>.</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nv">PATH</span><span class="o">=</span>/mingw32/bin/:<span class="nv">$PATH</span>
$ ln -s /mingw32/bin/protoc.exe /usr/bin/protoc.exe
</pre></div>
</div>
<p>Готовый пакет для pacman’а позаимствуем у ArchLinux из AUR
(<a class="reference external" href="https://aur.archlinux.org/packages/mingw-w64-protobuf/">https://aur.archlinux.org/packages/mingw-w64-protobuf/</a>).</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/mingw-w64-protobuf.tar.gz
$ tar -zxf mingw-w64-protobuf.tar.gz
$ <span class="nb">cd</span> mingw-w64-protobuf
$ vim PKGBUILD
</pre></div>
</div>
<p>Закомментим зависимости из файла сборки PKGBUILD и переименуем
<code class="docutils literal"><span class="pre">${_arch}-strip</span></code> в <code class="docutils literal"><span class="pre">strip</span></code>.</p>
<div class="literal-block-wrapper docutils container" id="id1">
<div class="code-block-caption"><span class="caption-text">PKGBUILD</span></div>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="c1"># Contributor: Benoit Favre <benoit.favre@gmail.com></span>
<span class="nv">pkgname</span><span class="o">=(</span><span class="s1">'mingw-w64-protobuf'</span><span class="o">)</span>
<span class="nv">_pkgname</span><span class="o">=</span>protobuf
<span class="nv">pkgver</span><span class="o">=</span><span class="m">3</span>.3.1
<span class="nv">pkgrel</span><span class="o">=</span><span class="m">1</span>
<span class="nv">pkgdesc</span><span class="o">=</span><span class="s2">"Protocol Buffers - Google's data interchange format (mingw-w64)"</span>
<span class="nv">arch</span><span class="o">=(</span><span class="s1">'any'</span><span class="o">)</span>
<span class="nv">url</span><span class="o">=</span><span class="s1">'https://developers.google.com/protocol-buffers/'</span>
<span class="nv">license</span><span class="o">=(</span><span class="s1">'BSD'</span><span class="o">)</span>
<span class="hll"><span class="c1">#depends=('mingw-w64-crt' 'mingw-w64-zlib')</span>
</span><span class="hll"><span class="c1">#makedepends=('mingw-w64-configure' 'protobuf')</span>
</span><span class="nv">options</span><span class="o">=(</span>!strip !buildflags staticlibs<span class="o">)</span>
<span class="nv">source</span><span class="o">=(</span><span class="s2">"https://github.com/google/protobuf/archive/v</span><span class="si">${</span><span class="nv">pkgver</span><span class="si">}</span><span class="s2">.tar.gz"</span><span class="o">)</span>
<span class="nv">md5sums</span><span class="o">=(</span><span class="s1">'20c685147753b515ce380421442044b5'</span><span class="o">)</span>
<span class="nv">_architectures</span><span class="o">=</span><span class="s2">"i686-w64-mingw32 x86_64-w64-mingw32"</span>
build<span class="o">()</span> <span class="o">{</span>
<span class="nb">cd</span> <span class="si">${</span><span class="nv">srcdir</span><span class="si">}</span>/<span class="si">${</span><span class="nv">_pkgname</span><span class="si">}</span>-<span class="si">${</span><span class="nv">pkgver</span><span class="si">}</span>
./autogen.sh
<span class="k">for</span> _arch in <span class="si">${</span><span class="nv">_architectures</span><span class="si">}</span><span class="p">;</span> <span class="k">do</span>
mkdir -p build-<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span> <span class="o">&&</span> <span class="nb">pushd</span> build-<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>
<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>-configure --with-protoc<span class="o">=</span>/usr/bin/protoc ..
make
<span class="nb">popd</span>
<span class="k">done</span>
<span class="o">}</span>
package<span class="o">()</span> <span class="o">{</span>
<span class="k">for</span> _arch in <span class="si">${</span><span class="nv">_architectures</span><span class="si">}</span><span class="p">;</span> <span class="k">do</span>
<span class="nb">cd</span> <span class="s2">"</span><span class="si">${</span><span class="nv">srcdir</span><span class="si">}</span><span class="s2">"</span>/<span class="si">${</span><span class="nv">_pkgname</span><span class="si">}</span>-<span class="si">${</span><span class="nv">pkgver</span><span class="si">}</span>/build-<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>
make <span class="nv">DESTDIR</span><span class="o">=</span><span class="s2">"</span><span class="nv">$pkgdir</span><span class="s2">"</span> install
rm <span class="s2">"</span><span class="si">${</span><span class="nv">pkgdir</span><span class="si">}</span><span class="s2">"</span>/usr/<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>/bin/*.exe
<span class="hll"> strip --strip-unneeded <span class="s2">"</span><span class="nv">$pkgdir</span><span class="s2">"</span>/usr/<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>/bin/*.dll
</span><span class="hll"> strip -g <span class="s2">"</span><span class="nv">$pkgdir</span><span class="s2">"</span>/usr/<span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>/lib/*.a
</span> <span class="k">done</span>
<span class="o">}</span>
</pre></div>
</div>
</div>
<p>Собираем пакет утилитой <a class="reference external" href="https://www.archlinux.org/pacman/makepkg.8.html">makepkg</a>.</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nv">CARCH</span><span class="o">=</span>i686 makepkg -Acs
<span class="o">==</span>> Сборка пакета mingw-w64-protobuf <span class="m">3</span>.3.1-1 <span class="o">(</span><span class="m">10</span> авг <span class="m">2017</span> г. <span class="m">19</span>:03:34<span class="o">)</span>
<span class="o">==</span>> Проверка зависимостей для запуска...
<span class="o">==</span>> Проверка зависимостей для сборки...
<span class="o">==</span>> Получение исходных файлов...
-> Найден v3.3.1.tar.gz
<span class="o">==</span>> Проверка файлов <span class="nb">source</span> с использованием md5sums...
v3.3.1.tar.gz ... <span class="nv">Готово</span>
<span class="o">==</span>> Распаковка исходных файлов...
-> Распаковка <span class="s1">'v3.3.1.tar.gz'</span> с помощью <span class="nv">bsdtar</span>
<span class="o">==</span>> Удаление директории <span class="s1">'$pkgdir/'</span>...
<span class="o">==</span>> Запускается build<span class="o">()</span>...
Google Mock not present. Fetching gmock-1.7.0 from the web...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
<span class="m">100</span> <span class="m">129</span> <span class="m">0</span> <span class="m">129</span> <span class="m">0</span> <span class="m">0</span> <span class="m">153</span> <span class="m">0</span> --:--:-- --:--:-- --:--:-- <span class="m">163</span>
<span class="m">100</span> 362k <span class="m">100</span> 362k <span class="m">0</span> <span class="m">0</span> 160k <span class="m">0</span> <span class="m">0</span>:00:02 <span class="m">0</span>:00:02 --:--:-- 603k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
<span class="m">100</span> <span class="m">129</span> <span class="m">0</span> <span class="m">129</span> <span class="m">0</span> <span class="m">0</span> <span class="m">145</span> <span class="m">0</span> --:--:-- --:--:-- --:--:-- <span class="m">145</span>
<span class="m">100</span> 618k <span class="m">100</span> 618k <span class="m">0</span> <span class="m">0</span> 195k <span class="m">0</span> <span class="m">0</span>:00:03 <span class="m">0</span>:00:03 --:--:-- 355k
+ autoreconf -f -i -Wall,no-obsolete
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, <span class="s1">'build-aux'</span>.
libtoolize: copying file <span class="s1">'build-aux/ltmain.sh'</span>
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, <span class="s1">'m4'</span>.
libtoolize: copying file <span class="s1">'m4/libtool.m4'</span>
libtoolize: copying file <span class="s1">'m4/ltoptions.m4'</span>
libtoolize: copying file <span class="s1">'m4/ltsugar.m4'</span>
libtoolize: copying file <span class="s1">'m4/ltversion.m4'</span>
libtoolize: copying file <span class="s1">'m4/lt~obsolete.m4'</span>
configure.ac:27: installing <span class="s1">'build-aux/compile'</span>
configure.ac:30: installing <span class="s1">'build-aux/config.guess'</span>
configure.ac:30: installing <span class="s1">'build-aux/config.sub'</span>
configure.ac:24: installing <span class="s1">'build-aux/install-sh'</span>
configure.ac:24: installing <span class="s1">'build-aux/missing'</span>
Makefile.am: installing <span class="s1">'build-aux/depcomp'</span>
parallel-tests: installing <span class="s1">'build-aux/test-driver'</span>
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, <span class="s1">'build-aux'</span>.
libtoolize: copying file <span class="s1">'build-aux/ltmain.sh'</span>
libtoolize: Consider adding <span class="s1">'AC_CONFIG_MACRO_DIRS([m4])'</span> to configure.ac,
libtoolize: and rerunning libtoolize and aclocal.
libtoolize: Consider adding <span class="s1">'-I m4'</span> to ACLOCAL_AMFLAGS in Makefile.am.
configure.ac:22: installing <span class="s1">'build-aux/compile'</span>
configure.ac:25: installing <span class="s1">'build-aux/config.guess'</span>
configure.ac:25: installing <span class="s1">'build-aux/config.sub'</span>
configure.ac:19: installing <span class="s1">'build-aux/install-sh'</span>
configure.ac:19: installing <span class="s1">'build-aux/missing'</span>
Makefile.am: installing <span class="s1">'build-aux/depcomp'</span>
parallel-tests: installing <span class="s1">'build-aux/test-driver'</span>
libtoolize: putting auxiliary files in <span class="s1">'.'</span>.
libtoolize: copying file <span class="s1">'./ltmain.sh'</span>
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, <span class="s1">'m4'</span>.
libtoolize: copying file <span class="s1">'m4/libtool.m4'</span>
libtoolize: copying file <span class="s1">'m4/ltoptions.m4'</span>
libtoolize: copying file <span class="s1">'m4/ltsugar.m4'</span>
libtoolize: copying file <span class="s1">'m4/ltversion.m4'</span>
libtoolize: copying file <span class="s1">'m4/lt~obsolete.m4'</span>
configure.ac:66: installing <span class="s1">'./ar-lib'</span>
configure.ac:61: installing <span class="s1">'./compile'</span>
configure.ac:46: installing <span class="s1">'./config.guess'</span>
configure.ac:46: installing <span class="s1">'./config.sub'</span>
configure.ac:48: installing <span class="s1">'./install-sh'</span>
configure.ac:48: installing <span class="s1">'./missing'</span>
benchmarks/Makefile.am: installing <span class="s1">'./depcomp'</span>
parallel-tests: installing <span class="s1">'./test-driver'</span>
+ rm -rf autom4te.cache config.h.in~
+ <span class="nb">exit</span> <span class="m">0</span>
~/mingw-w64-protobuf/src/protobuf-3.3.1/build-i686-w64-mingw32 ~/mingw-w64-protobuf/src/protobuf-3.3.1
/home/user/mingw-w64-protobuf/PKGBUILD: line <span class="m">24</span>: i686-w64-mingw32-configure: команда не <span class="nv">найдена</span>
<span class="o">==</span>> ОШИБКА: Произошел сбой в build<span class="o">()</span>.
Прерывание...
</pre></div>
</div>
<p>Для сборки требуется скрипт <code class="docutils literal"><span class="pre">configure</span></code> как его поставить в MinGW из оф. реп
я не знаю, поэтому ставим по тому же принципу из исходников (<a class="reference external" href="https://aur.archlinux.org/packages/mingw-w64-configure/">https://aur.archlinux.org/packages/mingw-w64-configure/</a>).</p>
<p>Перед сборкой также важно закомментировать зависимости:</p>
<div class="literal-block-wrapper docutils container" id="id2">
<div class="code-block-caption"><span class="caption-text">PKGBUILD</span></div>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="nv">pkgname</span><span class="o">=</span>mingw-w64-configure
<span class="nv">pkgver</span><span class="o">=</span><span class="m">0</span>.1
<span class="nv">pkgrel</span><span class="o">=</span><span class="m">1</span>
<span class="nv">arch</span><span class="o">=(</span>any<span class="o">)</span>
<span class="nv">pkgdesc</span><span class="o">=</span><span class="s2">"configure wrapper for MinGW (mingw-w64)"</span>
<span class="c1">#depends=('mingw-w64-gcc' 'mingw-w64-pkg-config')</span>
<span class="nv">license</span><span class="o">=(</span><span class="s2">"GPL"</span><span class="o">)</span>
<span class="nv">url</span><span class="o">=</span><span class="s2">"http://fedoraproject.org/wiki/MinGW"</span>
<span class="nv">source</span><span class="o">=(</span><span class="s2">"mingw-configure.sh"</span><span class="o">)</span>
<span class="nv">md5sums</span><span class="o">=(</span><span class="s1">'SKIP'</span><span class="o">)</span>
<span class="nv">_architectures</span><span class="o">=</span><span class="s2">"i686-w64-mingw32 x86_64-w64-mingw32"</span>
build<span class="o">()</span> <span class="o">{</span>
<span class="k">for</span> _arch in <span class="si">${</span><span class="nv">_architectures</span><span class="si">}</span><span class="p">;</span> <span class="k">do</span>
sed <span class="s2">"s|@TRIPLE@|</span><span class="si">${</span><span class="nv">_arch</span><span class="si">}</span><span class="s2">|g"</span> mingw-configure.sh > <span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>-configure
<span class="k">done</span>
<span class="o">}</span>
package<span class="o">()</span> <span class="o">{</span>
install -d <span class="s2">"</span><span class="si">${</span><span class="nv">pkgdir</span><span class="si">}</span><span class="s2">"</span>/usr/bin
<span class="k">for</span> _arch in <span class="si">${</span><span class="nv">_architectures</span><span class="si">}</span><span class="p">;</span> <span class="k">do</span>
install -m <span class="m">755</span> <span class="si">${</span><span class="nv">_arch</span><span class="si">}</span>-configure <span class="s2">"</span><span class="si">${</span><span class="nv">pkgdir</span><span class="si">}</span><span class="s2">"</span>/usr/bin/
<span class="k">done</span>
<span class="o">}</span>
</pre></div>
</div>
</div>
<p>Сборка <code class="docutils literal"><span class="pre">configure</span></code>:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">cd</span> ../
$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/mingw-w64-configure.tar.gz
$ tar -zxf mingw-w64-configure.tar.gz
$ <span class="nb">cd</span> mingw-w64-configure/
$ <span class="nv">CARCH</span><span class="o">=</span>i686 makepkg -Acs
$ pacman -U mingw-w64-configure-0.1-1-any.pkg.tar.xz
</pre></div>
</div>
<p>Теперь все готово для сборки Protobuf:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">cd</span> ../mingw-w64-protobuf/
$ <span class="nv">CARCH</span><span class="o">=</span>i686 makepkg -Acs
</pre></div>
</div>
<p>В результате получим архив с dll-ками и заголовочными файлами. Вот так просто и
лаконично, хотя лучше поставить ArchLinux в виртуалку и собрать там тоже самое
без лишних хлопот.</p>
</div>