質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3064閲覧

makefile内のsourceコマンドの実行方法

muteki_gamer

総合スコア157

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/02/21 06:30

makeコマンドでvenvをactivateさせるaliasを組もうとしています。
SHELLがないと下のエラーが出ます。

error

1make: source: No such file or directory 2make: *** [active] Error 1

makefile

1SHELL := /bin/bash 2active: 3 source venv/bin/activate

質問

今の状態でmake activateを実行するとエラーが発生せず問題なく実行されたような動作をしますが、通常では (venv)user$ のように仮想環境に入った標である()が出ない為正常にactivate出来ていないのではないかと考えています。

どのようにしたらmakeコマンドからactivateできるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/02/21 06:57

venv/bin/activate ってたぶんそのシェル(から起動されたプロセス)にしか有効ではないと思うのですが、make の中で source しても、それは make の中で実行されたサブシェルだけで有効なので、make コマンドが終わったら無効になると思います。
guest

回答1

0

ベストアンサー

make: source: No such file or directory

デフォルトのシェルは/bin/shなので、source ファイル名でなく. ファイル名と書けば良いです。

が、指摘の通り、子シェルで環境変数をセットしても、親のシェルには無関係です。

コマンドは、親のシェルで実行する必要があります。

~/.bashrcにて、

Bash

1trap "source venv/bin/activate" USR1

Makefileで、親の親(Bash)にSIGUSR1を送ります。

Makefile

1SHELL := /bin/bash 2active: 3 kill -USR1 `ps h -o %P -p \`ps h -o %P -p $$$$\``

#追記
$PPIDというシェル変数があったので、psの二段重ねは不要でした。

Makefile

1SHELL := /bin/bash 2active: 3 kill -USR1 `ps h -o %P -p $$PPID`

投稿2020/02/21 08:24

編集2020/02/25 08:36
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

muteki_gamer

2020/02/21 09:21

なるほど。シグナルを出してあらかじめ登録しておいたコマンドを捕捉して実行する方法があるんですね。 回答を元に色々調べてみたのですが、Makefileの中のkill文の1節が理解できていないのでお聞きしたいです。%Pは何を表しているのでしょうか? またシグナルの送信の際にUSR1に送信しているのは理解できましたが、ハイフンが必要な理由がわかりません。これはSIGUSR1のエイリアスという事でしょうか? 重ねての質問で恐縮です。よろしくお願い致します。
otn

2020/02/21 11:55

> %Pは何を表しているのでしょうか? man ps に書いてあります。親のプロセスIDです。 ハイフンは、シグナル番号の指定です。-USR1 は -SIGUSR1 のことです。 kill -HUP や kill -KILL のように SIG は省略することが多いと思います。
muteki_gamer

2020/02/25 04:24

お返事遅くなりすみません。 なるほど。AIXフォーマットというものがあるんですね!勉強になります。 シグナルの方もSIGを対象にとっているのと勘違いしてました。オプションでしたね(汗 理解できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問