web-dev-qa-db-ja.com

Makefileに正確にbashスクリプトを書き込む方法は?

私はbashスクリプトを入力するのが好きですが、複数のツールを準備すると、プロジェクトのルートディレクトリが非常に多くのシェルスクリプトでいっぱいになります。そのため、Makefileを使用することを好みます。

Makefileは良いです。ただし、通常のbashスクリプトと同じようにmakefileを構築したいと思います。

例えば:

次の内容でbashスクリプトを非常にすばやく書いたと思います。

#!/bin/bash
echo "hello"
cd ~
do-some-work.sh my-parameter

このスクリプトは$ ./my-important-task.shで実行できます。

そのスクリプトをmakefileに移動したい場合は、次のようにします。

Shell := /bin/bash 

my-important-task: 
    echo "hello" ;\
    cd ~ ;\
    do-some-work.sh my-parameter

しかし、私は以下が欲しい:

my-important-task: 
    [[copy and paste the my-important-task.sh file]]

とにかくこの目標を達成する方法はありますか?

9
ceremcem

本当に「bashスクリプトをMakefileに正確に書き込む」必要がある場合は、少し間接的に行う必要があります。ターゲット行の後にスクリプトを貼り付けるだけの場合、バイパスできない2つの問題が発生します。コマンド行はタブでインデントする必要があり、ドル記号はエスケープする必要があります。

GNU make(BSD make、Solaris makeなどとは対照的に)を使用する場合、 multi-line definition syntax を使用してスクリプトを変数として定義できます。 =、次に value function を使用して、変数の生の値を使用し、展開をバイパスします。

さらに、 skwllspで説明されているように の場合、makeに各ターゲットのコマンドリストを1行ずつではなく1つのシェルスクリプトとして実行するように指示する必要があります。これは、GNU make by .ONESHELLターゲットの定義

define my_important_task =
# script goes here
endef

my-important-task: ; $(value my_important_task)

.ONESHELL:

https://www.gnu.org/software/make/manual/html_node/One-Shell.html

.ONESHELL特殊ターゲットがメイクファイルのどこかにある場合、各ターゲットのすべてのレシピ行がシェルの1回の呼び出しに提供されます。

それでも、各行の先頭にタブ文字を配置し、すべてのドル記号を2倍にする必要があります(つまり、$ 沿って $$スクリプトのすべての場所)。

6
user17530

最上位のプロジェクトディレクトリが数十のスクリプトで乱雑になっていることが問題である場合、明白な解決策は、それらを配置するためのサブディレクトリ(例:scripts)を作成することです。

それらを./scripts/scriptnameとして実行するか、スクリプトディレクトリをPATHに追加します。

Makefileで引き続き実行する場合は、それらのターゲットに対して./scripts/scriptnameを実行するMakefileエントリを作成するだけです。例えば.

my-important-task: 
    ./scripts/my-important-task.sh my-parameter

注:./scripts内のスクリプトが同じディレクトリ内の他のスクリプトを呼び出す場合、スクリプトへのフルパスを指定するか、PATHにスクリプトディレクトリを含める必要があります。

4
cas

.bashrc(および.bash_aliases)で定義されているエイリアスと関数を使用できます。

0
xenoid