雑記帳

整理しない情報集

更新情報

コマンドラインアプリ集めとシングルバイナリのビルド

公開日:

カテゴリ: Windows

PATHを通すディレクトリにアプリケーションバイナリをまとめておこうとしたのですが、DLLが邪魔なのでDLLが無くても動くように自力でビルドしてみます。

そもそもDLLって何?

ダイナミックリンクライブラリと呼ばれ、様々なアプリで共通の処理をあらかじめDLLにまとめておき、その処理を実行するときは同じDLLファイルをロードし実行します。そのため同じ処理を様々なアプリで個別に持っているよりも、メモリやファイルサイズの使用量は少なくなります。

ライブラリの共有範囲は様々で、同じアプリの別の実行ファイルで共有するものもあれば、アプリの作者を超えて共有するランタイムと呼ばれるものまであります。もしアプリを実行しようとして〇〇.dll がないため、コードの実行を続行できません。のようなメッセージを見かけた場合、この共有ライブラリが無くて、処理ができないということです。

  • 例1: exeファイルだけをどこか別の場所へ移動して実行しようとしてこのエラーが出た場合は、移動元のフォルダ内にあるDLLが読み込めなくてエラーになっています
  • 例2: ダウンロード時にzip形式とインストーラ(exe)形式があってzip形式を選択してこのエラーが出た場合、ランタイムがインストールされていなくてエラーになっています。この場合、インストーラではインストール時にランタイムをセットでインストールしています

ちなみにDLLはWindowsだけですが、LinuxではSO(Shared Object)が同じ働きをします。

このような処理の結合に、DLLを使うものを動的リンク(Dynamic Link)、DLLを使わず自身の実行ファイルに含めるものを静的リンク(Static Link)と呼びます。動的か静的かはビルド時に指定するため、実行ファイル(exeファイル)を作成した後でリンク方式を変更することはできません。

メリットとデメリット

メリット

  • DLLがなくなるので、ディレクトリがスッキリする(exeファイルだけのディレクトリとなる)
  • バージョンアップなどでライブラリのバージョンアップが上がった場合でも、不要なDLL削除することを考えなくていい

デメリット

  • 基本的にトータルのファイル容量は増える
    • 特にffmpegとffplayのように、複数アプリでの共通部分が多い場合はファイルサイズが大幅に増加します
  • メモリの使用量は増える
  • 公式の電子署名は付かない

コマンドラインアプリ集めの準備

あまり環境を汚したくないため、dockerを使います。

docker run --rm -it -v .:/output debian:latest-slim /bin/bash

ビルド不要のアプリ

ビルド済みのDLLなしの実行ファイルが配布されている場合、自力でビルドする意味は薄いので、そのまま配布ファイルをダウンロード・解凍してコピーします。

GitHubのReleaseでバイナリを公開していれば簡単に取得できますが、それ以外はスクレイピングするしか無いので、案外スクリプトを組むのはビルドするより面倒だったりします。

普通にブラウザからダウンロードしてきてもいいですが、ビルドが必要なアプリでこのあと色々コマンドを叩くので、今回はコマンドで取得してきます。

スクレイピングの正規表現が雑なのは気にしない

環境準備

Windows向けのバイナリ配布は大抵のバージョンで扱えるzip形式が多いですが、Linuxではgzipが主流なのでunzipをインストールします。

apt install -y unzip

7-Zip

7zr.exeはバイナリ単体で配布されているので簡単です。ただし暗号化ファイルは扱えません。暗号化ファイルを扱いたい場合は7z[0-9]*-extra.7zの中にある7za.exeを使うと良いでしょう(7z形式で配布されているので解凍に7-Zipのアーカイバが必要です・・・)。

curl -sS https://api.github.com/repos/ip7z/7zip/releases/latest | jq -r '.assets[] | select(.name | test("^7zr.exe$")) | .browser_download_url' | xargs -I % curl -sSL % > /output/7zr.exe

Biome

こちらもバイナリ単体で配布されているので簡単です。

curl -sS https://api.github.com/repos/biomejs/biome/releases/latest | jq -r '.assets[] | select(.name | test("^biome-win32-x64.exe$")) | .browser_download_url' | xargs -I % curl -sSL % > /output/biome.exe

BusyBox

BusyBoxのWindows向けバージョンです。Unicode版ではない従来版はファイル名のuを削除したURLです。

curl -sSL https://frippery.org/files/busybox/busybox64u.exe > /output/busybox.exe

edit

そのうちWindowsに標準搭載されそうなので、不要になるかもしれません。

curl -sS https://api.github.com/repos/microsoft/edit/releases/latest | jq -r '.assets[] | select(.name | test("^edit-[0-9.]+-x86_64-windows.zip$")) | .browser_download_url' | xargs -I % curl -sSLo edit.zip %
unzip -j edit.zip */edit.exe -d /output

esbuild

ビルド済みのバイナリはnpmにあります。

curl -sS https://registry.npmjs.org/@esbuild/win32-x64/ | jq -r '."dist-tags".latest' | xargs -I % curl -sSLo esbuild.tgz https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-%.tgz
tar -zxvf esbuild.tgz --wildcards -C /output --strip-components=1 '*/esbuild.exe'

ImageMagick

扱いやすいportable版をダウンロードしていますが、ファイル名を変えた同じバイナリが多数存在するためダウンロードサイズが大きいです。筆者はサブコマンド派なのでmagick.exe以外は使いませんが。。。

curl -sS https://imagemagick.org/archive/binaries/ | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^ImageMagick-[0-9.]*-[0-9]*-portable-Q16-HDRI-x64.zip$/p' | sort -r -V | head -n 1 | xargs -I % curl -sSLo imagemagick.zip https://imagemagick.org/archive/binaries/%
unzip -j imagemagick.zip */magick.exe -d /output

jq

curl -sS https://api.github.com/repos/jqlang/jq/releases/latest | jq -r '.assets[] | select(.name | test("^jq-win64.exe$")) | .browser_download_url' | xargs -I % curl -sSL % > /output/jq.exe

libavif

curl -sS https://api.github.com/repos/AOMediaCodec/libavif/releases/latest | jq -r '.assets[] | select(.name | test("^windows-artifacts.zip$")) | .browser_download_url' | xargs -I % curl -sSLo libavif.zip %
unzip -j libavif.zip avifenc.exe avifdec.exe -d /output

libwebp

使わなさそうなものは外しています。vwebpはfreeglut.dllが必要です。

curl -sS https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed 's/.*\/\([^\/]*\)/\1/' | sed -r -n '/^libwebp-[0-9.]+-windows-x64\.zip$/p' | sort -r -V | head -n 1 | xargs -I % curl -sSLo libwebp.zip https://storage.googleapis.com/downloads.webmproject.org/releases/webp/%
unzip -j libwebp.zip */cwebp.exe */dwebp.exe */webpinfo.exe */webpmux.exe -d /output

SQLite

公式のダウンロードページに以下の表記があります。

For convenient, script-driven extraction of the downloadable file URLs and associated information, an HTML comment is embedded in this page’s source.

ダウンロードページのHTMLコメントに以下のような最新版のURLとハッシュのCSVリストがあります。

<!-- Download product data for scripts to read
PRODUCT,VERSION,RELATIVE-URL,SIZE-IN-BYTES,SHA3-HASH
PRODUCT,3.50.1,2025/sqlite-src-3500100.zip,14391009,1add4d3c5622f0e33842758d75fc141466f7fbe3f9ea1a85105baf7944ec14e0
PRODUCT,3.50.1,2025/sqlite-amalgamation-3500100.zip,2844807,65e5176c171aff92ff31f3ab4d431a879d648de93f139816f9331a7074859092
PRODUCT,3.50.1,2025/sqlite-autoconf-3500100.tar.gz,3172122,c12e84ba9772391d41644a0a9be37bad25791fc2a9b9395962e5f83f805e877f
PRODUCT,3.50.1,2025/sqlite-preprocessed-3500100.zip,2951788,9e066309b7e781ad7eedcce3fe1bdc68efd5875f5404b3c9b964f032bd54ecde
PRODUCT,3.50.1,2025/sqlite-doc-3500100.zip,11377048,79925842014666f8c006872be5c9b5db3479622cb4d5559dae79275132ea29e1
PRODUCT,3.50.1,2025/sqlite-android-3500100.aar,3575007,3b1a398cb0c82e95afcd24a76f2086608f8f2fd35b4441cf2be59039838fd720
PRODUCT,3.50.1,2025/sqlite-tools-linux-x64-3500100.zip,3384772,1405115a67db60c2ebe6c95ef5578552a01a26968a6f9799291334d87cea32bc
PRODUCT,3.50.1,2025/sqlite-tools-osx-x64-3500100.zip,3721601,58352ee49880019efaba4fc8c6470c3a700e6ddd5e0d56310c64fdfc0cef44df
PRODUCT,3.50.1,2025/sqlite-dll-win-x86-3500100.zip,1074557,fe382cfa167021ad5789907c0afae762c75fa0a3f92fe38e1a456fe6747a36d9
PRODUCT,3.50.1,2025/sqlite-dll-win-x64-3500100.zip,1344522,2bf2afb9a6b94dffcc033f37ebdc50118d0ea9e5536729421efa8fb4eb2a5c5f
PRODUCT,3.50.1,2025/sqlite-tools-win-x64-3500100.zip,6429241,a9b26ca6e415f61ada511a14fb2166c9278de3b471702281dd02f3ce97288cfa
PRODUCT,3.50.1,2025/sqlite-wasm-3500100.zip,812660,5e6ec4a75b4659657f91d88c2932369d19650fd57bc4596b1dcb16106f179b06
 -->

このコメントをスクレイピングしてくると簡単に取得できます。

curl -sS https://sqlite.org/download.html | grep "^PRODUCT" | grep "sqlite-tools-win-x64" | awk 'BEGIN {FS=","} {print $3}' | xargs -I % curl -sSLo sqlite.zip https://sqlite.org/%
unzip -j sqlite.zip sqlite3.exe sqldiff.exe sqlite3_analyzer.exe sqlite3_rsync.exe -d /output

手動ビルドするアプリ

基本的にリンカ(LD)のオプションに--staticを付けることで、静的リンクされたDLL無しのバイナリをビルドできます。その他、ファイル容量を小さくするために色々オプションをつけていますが、それらは無くても問題ありません。

環境準備

Docker内のdebianイメージのコンテナで作業するため、ビルド環境はLinuxになります。普通にビルドするとLinuxのアプリケーションがビルドされるので、mingwを使ったクロスコンパイルをするようにビルドを構成していきます。

最低限mingw-w64nasm、多くのアプリでcmakeがビルドに必要です。今回はソースの取得をcurlで統一していますが、ソースがGitなどで管理されている場合、gitなどでも大丈夫です。

apt update
apt install -y mingw-w64 nasm cmake curl jq xz-utils
cd ~

GNU BinUtils

GNUのツール類は最新バージョンを取得する方法が見当たらないので、FTPサイトをスクレイピングしてきます。GNUの公式からソースを落としてくると重いので、JAISTのミラーサーバからダウンロードします。

BinUtilsでは色々なツールがビルドされますが、必要なもののみコピーしています。

curl -sS "https://ftp.jaist.ac.jp/pub/GNU/binutils/?C=M;O=D" | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^binutils-[0-9.]*\.tar.xz$/p' | head -n 1 | xargs -I % curl -sSLo binutils.tar.xz https://ftp.jaist.ac.jp/pub/GNU/binutils/%
mkdir binutils
tar -Jxvf binutils.tar.xz -C binutils --strip-components 1
cd binutils
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --exec-prefix=/usr/bin/x86_64-w64-mingw32- CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4 -s -O2" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s --static"
make
cp -p binutils/.libs/nm-new.exe binutils/.libs/objdump.exe binutils/.libs/strip-new.exe /output
cd ~

GNU DiffUtils

configure時のオプションはそのままではエラーになるので、変数を渡してチェックをスキップさせています。

curl -sS "https://ftp.jaist.ac.jp/pub/GNU/diffutils/?C=M;O=D" | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^diffutils-[0-9.]*\.tar.xz$/p' | head -n 1 | xargs -I % curl -sSLo diffutils.tar.xz https://ftp.jaist.ac.jp/pub/GNU/diffutils/%
mkdir diffutils
tar -Jxvf diffutils.tar.xz -C diffutils --strip-components 1
cd diffutils
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --exec-prefix=/usr/bin/x86_64-w64-mingw32- CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4 -s -O2" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s --static" --enable-threads=windows gl_cv_func_strcasecmp_works=yes
make
cp -p src/diff.exe src/cmp.exe /output
cd ~

GNU make

curl -sS "https://ftp.jaist.ac.jp/pub/GNU/make/?C=M;O=D" | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^make-[0-9.]*\.tar.gz$/p' | head -n 1 | xargs -I % curl -sSLo make.tar.gz https://ftp.jaist.ac.jp/pub/GNU/make/%
mkdir make
tar -zxvf make.tar.gz -C make --strip-components 1
cd make
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --exec-prefix=/usr/bin/x86_64-w64-mingw32- CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4 -s -O2" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s --static"
make
cp -p make.exe /output
cd ~

flac

ビルドにはpkg-configが必要です。oggをサポートする場合、liboggも必要です。

# Pkg-Config
apt install -y pkg-config

# ogg
curl -sS https://api.github.com/repos/xiph/ogg/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo ogg.tar.gz %
mkdir ogg
tar -zxvf ogg.tar.gz -C ogg --strip-components 1
mkdir ogg/build
cd ogg/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s -O2" -DCMAKE_EXE_LINKER_FLAGS=-s ../
make
make install
cd ~

# flac
curl -sS https://api.github.com/repos/xiph/flac/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo flac.tar.gz %
mkdir flac
tar -zxvf flac.tar.gz -C flac --strip-components 1
mkdir flac/build
cd flac/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include -DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s -O2" -DCMAKE_EXE_LINKER_FLAGS=-s -DINSTALL_MANPAGES=OFF ../
make
cp -p objs/flac.exe objs/metaflac.exe /output
cd ~

mozjpeg

ビルドにはzlibとlibpngが必要です。debian系の場合、zlibはパッケージマネージャからインストールできます。

# zlib
apt install -y libz-mingw-w64-dev

# libpng
curl -sS https://sourceforge.net/projects/libpng/best_release.json | jq -r ".platform_releases.linux.url" | xargs -I % curl -sSLo libpng.tar.xz %
mkdir libpng
tar -Jxvf libpng.tar.xz -C libpng --strip-components 1
cd libpng
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --enable-shared=no CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s"
make
make install
cd ~

# mozjpeg
curl -sS https://api.github.com/repos/mozilla/mozjpeg/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo mozjpeg.tar.gz %
mkdir mozjpeg
tar -zxvf mozjpeg.tar.gz -C mozjpeg --strip-components 1
mkdir mozjpeg/build
cd mozjpeg/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include -DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s" -DCMAKE_EXE_LINKER_FLAGS=-s -DENABLE_SHARED=0 -DWITH_ARITH_DEC=1 -DWITH_ARITH_ENC=1 ../
make
cp -p cjpeg-static.exe djpeg-static.exe jpegtran-static.exe rdjpgcom.exe wrjpgcom.exe /output
cd ~

OpenSSL

ビルドスクリプトがPerl製のため、Perlが必要です。ビルドにかかる時間は長めです。

# Perl
apt install -y perl

# OpenSSL
curl -sS https://api.github.com/repos/openssl/openssl/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo openssl.tar.gz %
mkdir openssl
tar -zxvf openssl.tar.gz -C openssl --strip-components 1
cd openssl
./Configure --prefix=/usr/x86_64-w64-mingw32 --cross-compile-prefix=/usr/bin/x86_64-w64-mingw32- -static mingw64
make

# シンボル情報の削除(サイズ削減が目的のためやらなくてもOK)
x86_64-w64-mingw32-strip -s apps/openssl.exe

cp -p apps/openssl.exe /output
cd ~

PCRE2 Grep

curl -sS https://api.github.com/repos/PCRE2Project/pcre2/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo pcre2.tar.gz %
mkdir pcre2
tar -zxvf pcre2.tar.gz -C pcre2 --strip-components 1
mkdir pcre2/build
cd pcre2/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s" -DCMAKE_EXE_LINKER_FLAGS=-s ../
make
cp -p pcre2grep.exe /output
cd ~

QPDF

クロスコンパイルは想定されていないようで、色々オプションを指定して回避しています。

libjpegが必要ですが、上でmozjpegがビルド済みであれば、mozjpegでmake installするだけでOKです。

PowerShellが無いので途中のテストでビルドがコケますが、QPDF自体はビルドできているので良しとします。

curl -sS https://api.github.com/repos/qpdf/qpdf/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo qpdf.tar.gz %
mkdir qpdf
tar -zxvf qpdf.tar.gz -C qpdf --strip-components 1
mkdir qpdf/build
cd qpdf/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include -DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-s" -DCMAKE_CXX_FLAGS="-s -O2" -DCMAKE_EXE_LINKER_FLAGS="-s --static" -DBUILD_SHARED_LIBS=OFF -DZLIB_LIB_PATH=/usr/x86_64-w64-mingw32/lib/libz.a ../
find | grep link.txt | xargs -I % sed -i 's@CRT_glob.o@/usr/x86_64-w64-mingw32/lib/CRT_glob.o@' %
make
cp -p qpdf/qpdf.exe /output
cd ~

zopflipng

curl -sS https://api.github.com/repos/google/zopfli/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo zopfli.tar.gz %
mkdir zopfli
tar -zxvf zopfli.tar.gz -C zopfli --strip-components 1
mkdir zopfli/build
cd zopfli/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s -O2" -DCMAKE_EXE_LINKER_FLAGS=-s ../
make
cp -p zopfli.exe zopflipng.exe /output
cd ~

ffmpeg

ビルドに非常に時間がかかり、かつオプションも非常に複雑なため、今回の方法ではなく以下のようなスクリプトを使用したほうが簡単です。

GitHub - rdp/ffmpeg-windows-build-helpers

おわり

exeファイルだけが並んでいるのは壮観ですが、ただの自己満足、にしか見えませんね・・・w

資料

最新リリースのソースを取得する方法

GitHubではReleasesのlatestを指定してデータを取得する認証不要のAPIがあるので、その結果JSONをパースするのがお手軽です。ソースコードはassetsとして上がっていればそちらでもいいですが、tarball_urlが全プロジェクト共通で使え、圧縮形式も同じためそちらの方が便利です(git cloneを使ってもいいですが、どのみち最新リリースのタグ検索が必要なので今回はこの方法で)。

ソースファイルのダウンロード時はリダイレクトが挟まるので、curlの場合-Lオプションが必須です。

curl -sS https://api.github.com/repos/<user>/<repository>/releases/latest | jq ".tarball_url" | xargs -I % curl -sSLo <name>.tar.gz %

SourceForgeにも一応最新のリリース取得の認証不要APIがあります。ただし、1つのプロジェクト内に複数のアプリがリリースされている場合、全アプリの中で最新のものが出てくるので、このAPIの内容にあまり過度な期待はできません。。。

こちらもソースファイルのダウンロード時はリダイレクトが挟まるので、curlは-Lオプションが必須です。

curl -sS https://sourceforge.net/projects/<project>/best_release.json | jq -r ".platform_releases.linux.url" | xargs -I % curl -sSLo <project>.tar.xz %

クロスコンパイル関連

autotools系(configure)は、./configure実行時に以下のパラメータを付加します。--exec-prefixが必要かどうかはプロジェクトによって異なるようです。./configure --helpで指定できるパラメータのヘルプを見れるプロジェクトが多いです。

--host=x86_64-w64-mingw32
--prefix=/usr/x86_64-w64-mingw32
--exec-prefix=/usr/bin/x86_64-w64-mingw32-
CFLAGS="-I/usr/x86_64-w64-mingw32/include"
CPPFLAGS="-I/usr/x86_64-w64-mingw32/include"
LDFLAGS="-L/usr/x86_64-w64-mingw32/lib"

CMake系(CMakeLists.txt)はcmake実行時に以下のパラメータを付加します。

-DCMAKE_SYSTEM_NAME=Windows
-DCMAKE_SYSTEM_PROCESSOR=AMD64
-DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc
-DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres
-DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include
-DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib
-DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32

ファイルサイズ関連

シンボル情報の容量が大きめです。ビルド時やリンク時に-sオプションを付けるとシンボル情報を保持しないため、そこそこファイルサイズの削減になります。

CFLAGS=-s
CPPFLAGS=-s
LDFLAGS=-s

シンボル情報はbinutilsのツールを使用することで、後から削除することもできます。

# シンボル情報の確認
nm some.exe
nm-new some.exe

# シンボル情報の削除
strip -s some.exe
strip-new -s some.exe

# Linux上で実行する場合
x86_64-w64-mingw32-strip -s some.exe

その他、ビルド時のファイル容量削減は下の参考サイトに解説があります。オプションは物によってはアプリ自体が動かなくなってしまうことがあるので、ダメそうであれば諦めましょう。

ビルド関連の参考サイト

カテゴリ: Windows