見出し画像

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-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>
これです。拡張子が少し違いますが。

_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つのファイル

カレントディレクトリに、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"を消せば元に戻れるはずです。


つづく・・・!


この記事が気に入ったらサポートをしてみませんか?