特定のコマンド呼び出し用に個別の環境を作成できます:
VAR1=val1 VAR2=val2 VAR3=val3 make
私はこれを行うよりもきれいだと思います:
export VAR1=val1
export VAR2=val2
export VAR3=val3
make
ラッパー スクリプトを使用している場合を除き、場合によっては VAR1=val1 VAR2=val2 VAR3=val3 make
のように VAR
変数は、make 呼び出し前の状態になります (エクスポートされていないものや存在しないものを含みますが、これらに限定されません)。
長い行は問題ではありません。いつでも複数の行に分割できます:
VAR1=val1\
VAR2=val2\
VAR3=val3\
make
任意の Unix コマンドに対して、このような環境変数を設定できます。シェルがすべて設定します。一部のアプリケーション (make
など) または rake
) は、変数定義のように見える引数に基づいて環境を変更します (prodev_paris の回答を参照) が、それはアプリケーションによって異なります。
ご存知のように、独自のアプローチを作成するよりも、製品の構築などのタスクに標準ツールを統合する方が望ましいです。努力は通常、長期的に報われます。
そうは言っても、簡単なアプローチは、さまざまな環境ファイルを定義することです (例:build-phone.env
) 作業ディレクトリの設定、PATH
、 CC
などをさまざまな製品に適用し、必要に応じてインタラクティブに環境ファイルを調達します:
. /path/to/build-phone.env
[your build commands]
. /path/to/build-watch.env
[your build commands]
<ブロック引用>
カスタム makefile の代わりに環境を使用してビルド構成を設定する方がよいでしょうか?
ビルド システムのベスト プラクティスは、環境変数にまったく依存しないことです。プロジェクトをビルドするために必要なものは次のとおりです。
git clone ... my_project
make -C my_project
環境変数を設定する必要があると、エラーが発生しやすく、一貫性のないビルドにつながる可能性があります。
<ブロック引用>既存の環境変数を適切に調整するには?
それらをまったく調整する必要はないかもしれません。コンパイラなどのツールへの完全なパスを使用することで、ビルド システムを環境から切り離します。
設定する変数がいくつかある場合は、ラッパー を作成します。 このスクリプトを、変更するコマンドのプレフィックスとして使用します。これにより、接頭辞を使用できます
make
などの単一のコマンドに適用する 、または- シェルを初期化して、後続のコマンドが変更された設定を使用するようにする
ラッパーを使用します
- コンパイラ オプションの設定 (
clang
など) 、CC
を設定します 変数、構成スクリプトがそれを選択されたコンパイラとして「見る」ようにする)、 - POSIX
C
でテストするためのロケール変数の設定 対en_US
対en_US.UTF-8
など cron
などの縮小された環境でのテスト .
各ラッパーは、適切な PATH
を識別するために必要なことを行います 、 LD_LIBRARY_PATH
、および同様の変数。
たとえば、Python のローカル ビルドでテストするために、約 10 年前に次のアドホック スクリプトを作成しました。
#!/bin/bash
ver=2.4.2
export TOP=/usr/local/python-$ver
export PATH=$TOP/bin:$PATH
export LD_LIBRARY_PATH=`newpath -n LD_LIBRARY_PATH -bd $TOP/lib $TOP/lib/gcc/i686-pc-linux-gnu/$ver`
if test -d $TOP
then
exec $*
else
echo no $TOP
exit 1
fi
with-python-2.4.2
として使用 myscript .
一部のラッパーは単に別のスクリプトを呼び出します。たとえば、クロスコンパイル用の変数を設定するために、configure スクリプトの周りでこのラッパーを使用します。
#!/bin/sh
# $Id: cfg-mingw,v 1.7 2014/09/20 20:49:31 tom Exp $
# configure to cross-compile using mingw32
BUILD_CC=${CC:-gcc}
unset CC
unset CXX
TARGET=`choose-mingw32`
if test -n "$TARGET"
then
PREFIX=
test -d /usr/$TARGET && PREFIX="--prefix=/usr/$TARGET"
cfg-normal \
--with-build-cc=$BUILD_CC \
--host=$TARGET \
--target=$TARGET \
$PREFIX "[email protected]"
else
echo "? cannot find MinGW compiler in path"
exit 1
fi
どこで choose-mingw32
そして cfg-normal
(a) クロスコンパイラで使用可能なターゲット名を見つけ、(b) configure スクリプトに追加オプションを提供するスクリプトです。
シェルのエイリアスを提案する人もいるかもしれません または関数 .コマンドライン シェルは通常 tcsh
であるため、この目的には使用しません。 (a) 他のシェル スクリプト、(b) ディレクトリ エディター、または (c) テキスト エディターからこれらのコマンドを実行します。それらは POSIX シェルを使用し (もちろん、特定の機能を必要とするスクリプトを除く)、エイリアスや関数をほとんど役に立たないものにします。