GDExtensionシンプルに環境構築するよ Pt.3
前回の続き!
SConsと、それを動かすためのPythonをセットアップします。Python知識ゼロでも大丈夫です。
Pythonのセットアップ
Pythonのダウンロード
Python.org 公式Web
https://www.python.org/
"Downloads"のページから次の項目を探してダウンロードします。
Downloads>Windows>"Windows embeddable package (64-bit)"
python-3.12.0-embed-amd64.zip
解凍して、ストレージの好きな場所に配置します。この時点で21MB。
この記事ではここに置きました。
<C:/python-3.12.0-embed-amd64>
python.exeが本体。python312.zipがライブラリのようです。zipになってますが、実行時に自動で、都度、一部を解凍して利用するのでしょう。なので手動で解凍する必要はありません。
python312.zipの中は.pycファイルが入ってます。.pycは、パイソンスクリプト(.py)をある程度バイナリ化したもののようです。
pipのセットアップ
pipはPython公式アプリストア的な存在である、PyPIを使うためのツールです。
pipをダウンロードするにもPythonを使います。
Python Packaging(Pythonアプリ)を運営しているPython Packaging Authority、略してPyPAというグループが提供している、get-pipというスクリプトを使います。
【PyPA公式サイト】
https://www.pypa.io/en/latest/
トップページ(?)に、GitHubへのリンクがあります。リポジトリが50個くらいあって、その中に目当てのget-pipがあります。
【pypa/get-pip】
https://github.com/pypa/get-pip
でもこのGitHubのREADMEによると、「ここからダウンロードせず、以下の場所を使用せよ」とのこと。
それがこちら
https://bootstrap.pypa.io/
ちゃんと公式サイトからリンクを辿ってこのサイトに行き着きました。
get-pyp.pyをダウンロードして、python.exeと同じ場所に置きます。
<C:\python-3.12.0-embed-amd64\get-pip.py>
コマンドプロンプト(cmd.exe)から、次のようにして、このスクリプトを実行します。先ほどのget-pip.pyを引数としてpython.exeを呼び出します。
"C:\python-3.12.0-embed-amd64\python.exe" "C:\python-3.12.0-embed-amd64\get-pip.py"
pipのダウンロードが始まります。
ログ
C:\Users\PonBlue>"C:\python-3.12.0-embed-amd64\python.exe" "C:\python-3.12.0-embed-amd64\get-pip.py"
Collecting pip
Downloading pip-23.3.1-py3-none-any.whl.metadata (3.5 kB)
Collecting setuptools
Downloading setuptools-68.2.2-py3-none-any.whl.metadata (6.3 kB)
Collecting wheel
Downloading wheel-0.41.2-py3-none-any.whl.metadata (2.2 kB)
Downloading pip-23.3.1-py3-none-any.whl (2.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 9.6 MB/s eta 0:00:00
Downloading setuptools-68.2.2-py3-none-any.whl (807 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 807.9/807.9 kB 17.0 MB/s eta 0:00:00
Downloading wheel-0.41.2-py3-none-any.whl (64 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 64.8/64.8 kB ? eta 0:00:00
Installing collected packages: wheel, setuptools, pip
WARNING: The script wheel.exe is installed in 'C:\python-3.12.0-embed-amd64\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The scripts pip.exe, pip3.12.exe and pip3.exe are installed in 'C:\python-3.12.0-embed-amd64\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-23.3.1 setuptools-68.2.2 wheel-0.41.2
「インストールしたブツはPATH通ってないフォルダに入れたから、気を付けてね」とワーニングが出ます。この場合のPATHは環境変数の"PATH"のことのようです。気に留めておきます。
下記2つのフォルダが新規作成されて、ここにpipが入ったようです。
<C:\python-3.12.0-embed-amd64\Lib>
<C:\python-3.12.0-embed-amd64\Scripts>
この時点で、Pythonフォルダは計43MB。
Pythonインストーラを使う場合
今回はembeddedのPythonを使いましたが、インストーラを使うこともできます。
Downloads>Windows>"Windows installer (64-bit)"
python-3.12.0-amd64.exe
知らない間に環境変数を入れたり、追加のdllをインストールしたりはしないので、そんなにパソコンに不可逆な変化があるわけではありません。インストーラーでも全然いいと思います。
この場合は、インストール時にpipを入れるかどうか聞かれて、インストーラーがpipを入れてくれます。
SConsのインストール
pthファイル
pipを使ってSConsをインストールするわけですが、このままではpipが使えません。python.exeにsite-packages(Pythonアプリ)の存在を知らせてません。
自信が無いので話半分に聞いてください。(またかー)
Pythonフォルダの中にpython312.zipあったでしょう。このzipの中にsite.pycというファイルがあります。これがsite-packagesを扱うためのモジュールみたいです。
で、このsiteをPythonで使えるようにするためには、siteのパスを知らせてあげる必要があります。その手段が、.pthというファイルです。.pthファイルをpython.exeと同じフォルダに置くと、Python実行時に自動的にパスを追加してくれるようです。
pthファイルはダウンロードした時点ですでにあります。
<C:\python-3.12.0-embed-amd64\python312._pth>
これです。拡張子が少し違いますが。
これを開いてこのように書き換えます。
python312.zip
.
# Uncomment to run site.main() automatically
#import site
↓ コメントアウトを外す
import site
このpthの内容は、「python312.zipの中のsiteをimport(ライブラリのロード)してね」みたいな意味だと思います。
pip実行
さて、pipを呼び出すために、コマンドプロンプト(cmd.exe)で下記を実行します。
"C:\python-3.12.0-embed-amd64\python.exe" -m pip install scons
-mはモジュールの実行という意味みたいです。pipモジュールを実行、install sconsが引数的なものなのでしょう。
※(さらに-tを付けることで、インストール先を指定できるみたいですが、そうすると何らかのパスが解決されず、うまく動きませんでした。何が悪いかもわからない。圧倒的に知識不足。ひとまずデフォルトで。)
ダウンロードとインストールが始まります。
ログ
C:\Users\PonBlue>"C:\python-3.12.0-embed-amd64\python.exe" -m pip install scons
Collecting scons
Downloading SCons-4.5.2-py3-none-any.whl (4.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3/4.3 MB 10.8 MB/s eta 0:00:00
Requirement already satisfied: setuptools in c:\python-3.12.0-embed-amd64\lib\site-packages (from scons) (68.2.2)
Installing collected packages: scons
WARNING: The scripts scons-configure-cache.exe, scons.exe and sconsign.exe are installed in 'C:\python-3.12.0-embed-amd64\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed scons-4.5.2
<C:\python-3.12.0-embed-amd64\Scripts>の下にインストールされました。この時点でPythonフォルダは計65MB。
Scriptsフォルダ下のscons.exeが実行ファイルです。
SConsインストール確認
試しに、コマンドプロンプトで下記を実行します。scons.exeを-hを付けて呼び出します。
sconsのヘルプが出てきます。成功。
"C:\python-3.12.0-embed-amd64\Scripts\scons.exe" -h
pipのキャッシュ
pipは下記のフォルダにダウンロードしたファイルをキャッシュします。
<C:\Users\ユーザ名\AppData\Local\pip>
なので、「セットアップうまくいかないなー」ってときにやり直ししてたりすると、2度目以降はコマンドプロンプトの画面で"Downloading ~"の表示と、プログレスバーが出てこなくなります。同じ画面にならないので不安になりますが、それはこれの効果です。特に問題はないと思います。
2度目以降はこれが出てこない
Collecting scons
Downloading SCons-4.5.2-py3-none-any.whl (4.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3/4.3 MB 10.8 MB/s eta 0:00:00
Pythonにインストーラを使った場合
インストーラーを使った場合、pthファイルの用意は不要です。いきなり下記を打つだけでインストールできます。
"C:\Program Files\Python312\python.exe" -m pip install scons
そしてSConsは、次の場所にインストールされます。
<C:\Users\ユーザ名\AppData\Roaming\Python\Python312>
SConsの理解
解説動画
SConsはいったい全体何者なのか?
それについては、mohsen zareさんの、この動画がわかりやすいです。GDExtensionでググるとすぐ出てくるので、たぶん定番の動画です。
https://www.youtube.com/watch?v=mKY2KVX0Gag
SConsはPythonスクリプトを実行する。なので、なにもビルドしない単なるHello Worldも動く。
特に指定が無い限り、カレントフォルダにある"SConstruct"(拡張子無し)ファイルが、Pythonスクリプトとして実行される。
このスクリプトファイルをユーザーが書く。スクリプト内で、3つの特定関数を呼び出すことによって、ビルドが実行される。
Program(出力名, ソースファイル)関数→exe作成
StaticLibrary(出力名, ソースファイル)関数→lib作成
SharedLibrary(出力名, ソースファイル)関数→dll作成Environmentというクラス(?)のインスタンス(?)を作って、そのプロパティに、ライブラリのパスやincludeパスをセットする。
env = Environment(なんらかの引数)
その上で、env.Program()のようにして関数を呼び出すことで、特定設定でビルドが実行できる。
実践
環境変数"Path"に、MinGWのbinフォルダを追加します。
例: <C:\mingw64\bin\>
これは、SConsにMinGWの場所を教えるためです。これが無いと、g++.exeが見つからない旨のエラーが出ます。
適当なフォルダを作って、その中にmain.cppとSConstructの2つのファイルを作ります。
ファイルの中身は下記の通り。iostreamを使った典型的なHello Worldを、exeとしてビルドしようって魂胆です。
// main.cppの中身
#include <iostream>
int main() {
std::cout << "Hi!" << std::endl;
return 0;
}
# SConstructの中身 2行だけ
env = Environment(tools = ['mingw'])
env.Program("test", "main.cpp")
このフォルダにカレントディレクトリを移して、SConsを実行してみます。
scons.exeを引数無しで呼び出します。カレントディレクトリにあるSConstructスクリプトが実行されます。
C:\Users\PonBlue>cd "C:\Users\PonBlue\SConsTest"
C:\Users\PonBlue\SConsTest>"C:\python-3.12.0-embed-amd64\Scripts\scons.exe"
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o main.o -c main.cpp
g++ -o test.exe main.o
scons: done building targets.
カレントディレクトリに、3つのファイルが作成されます。
main.o: オブジェクトファイル(中間生成物)
test.exe: 成果物
.sconsign.dblite: ビルド時の条件やソースファイルの状態を記録したもので、リビルド時の無駄を省くためのものだそうです。
成果物を実行します。test.exeはカレントディテクトリにあるので、そのまま"test"で実行できます。
C:\Users\PonBlue\SConsTest>test
Hi!
できた!
ちなみに、tools = ['mingw']を指定しない場合、デフォルトでVCを使おうとするようです。
この時点でのパソコンの状態の変化は次の通りです。
【手動で配置したツール】
C:\mingw64\bin -MinGW
C:\python-3.12.0-embed-amd64 -Python
【インストールしたPython Package】
C:\python-3.12.0-embed-amd64\Scripts -SCons
【環境変数 "Path"】
C:\mingw64\bin\
【一時ファイルやキャッシュの類】
C:\Users\ユーザ名\AppData\Local\pip
なので、パソコンを元に戻したければ、これらフォルダや"Path"を消せば元に戻れるはずです。
つづく・・・!
この記事が気に入ったらサポートをしてみませんか?