はじめに
この記事の目的
ソースコードのビルドや引数を多用したスクリプトのランナーとして、Makefileは根強い人気を誇っています。
本記事では、インターネット接続を伴う処理を記載したMakefileを、Proxy環境下でも使えるようにする方法を検討します。
想定する環境
以下の環境を想定しています。
OS: Linux
Shell: bash
Macの場合は、bashではなくzshを設定すれば動くのではないかと思います。
対象とするプロキシ対策
プロキシ対策は、使用するツールの実装により様々ですが、以下が一般的です。
-
http_proxy
,https_proxy
,ftp_proxy
,no_proxy
などの環境変数にhttp://<USER ID>:<USER PASS>@<SERVER>:<PORT>
の書式でプロキシサーバの設定を記載する。 - 所定のディレクトリにプロキシサーバの設定を記載したファイルを配置する
本記事では、前者の環境変数を設定するタイプのスクリプトをMakefileの中で実行する場合の対策を示します。
Makefileの使用方法と設定
Makefileの使用方法
まず、後述のMakefileを任意のディレクトリに配置し、そのディレクトリへ移動します。
そして、実行したいターゲットがtest
の場合、ユーザは次のコマンドを実行します。
# 非プロキシ環境下
make test
# プロキシ環境下
make test USE_PROXY=true
# Configure proxy setting:
# USER ID: > aaa
# USER PASS: >
上記のように、非プロキシ環境下では、単にtest
を指定します。そして、プロキシ環境下では、引数USE_PROXY=true
を付けます。
そして、プロキシサーバへ接続するためのユーザ名とパスワードはmake実行時に、入力する方式とします。
なお、本記事は、プロキシサーバのホスト名とポート名は事前に分かっているものとして、Makefileの中に記載してしまいます。
なお、プロキシ環境下であっても、すでに環境変数が設定されている場合は、USE_PROXY=true
を省略できるようにします。
Makefileの設定
以下では、プロキシサーバのホスト名がproxy.server.com
、ポート番号が8080
とします。
なお、プロキシサーバのホスト名が不明で、代わりにIPが分かっている場合は、ホスト名の代わりにIPを記載します。
PROXY_SERVER:=proxy.server.com
PROXY_PORT:=8080
SHELL:=/bin/bash # readコマンドを使用するため、シェルをデフォルトのshからbashに変更します
# USE_PROXYの設定が無い場合は、環境変数が設定されているかを確認しますhttp_proxy
USE_PROXY?=$(shell if [ ! -z $$http_proxy ]; then echo "true"; else echo "false"; fi)
# USE_PROXYがtrueで、かつ、http_proxyが設定されていない場合は、ユーザにIDとパスワードを入力してもらい、http_prox等を設定します。
ifeq ($(USE_PROXY), true)
ifeq ($(http_proxy),)
USER_ID:=$(shell echo "Configure proxy setting:" 1>&2; read -p " LDAP ID: > " tmp; echo $$tmp)
USER_PASS:=$(shell read -s -p " LDAP PASS: > " tmp; echo "" 1>&2; echo $$tmp)
export http_proxy:=http://$(USER_ID):$(USER_PASS)@$(PROXY_SERVER):$(PROXY_PORT)
export https_proxy:=$(http_proxy)
endif
endif
# プロキシ設定を活用して、example.comのサイトをダウンロードできるか確認します。
# 接続できない場合は、5秒でタイムアウトします。
test: ## Test connection with internet (connect to http://example.com)
@if timeout 5 curl -L http://example.com 1>/dev/null 2>&1; then\
echo "Successfully connected with example.com";\
else\
echo "Failed to connect with example.com";\
fi
なお、環境変数はMakefileの中だけで設定され、makeのスクリプトを抜けると上記環境変数は消えてしまいます。
Makefileで使っているテクニック
exportによる環境変数設定
Makefile
で設定した変数は通常、環境変数とは区別されますが、exportを付けると、makeのサブプロセスで実行されるシェル内の環境変数に展開されます。
上記の例では、http_proxyとhttps_proxyをMakefileの記法である:=
によって設定し、さらに、export
することで、それ以降のコマンドを実行する際の環境変数に登録しています。
?=
代入
?=
は、変数が定義されていない場合のみ、変数を宣言して値を代入する代入演算子です。
上記の例では、USE_PROXY
の設定を?=
による代入とすることで、ユーザがUSE_PROXY
を設定しなかった場合のみ、値を設定しています。
さらに、?=
代入演算子の右辺で、$(shell ...)
を使うことで、http_proxy
環境変数が設定されているか確認し、すでに設定済みの場合はtrue
とし、http_proxy
が存在しないor空の場合はfalse
としています。