私はmake
を初めて使用しており、makeファイルを正しく設定する方法を理解しようとしています。特に、私はパターンに従うルールや扶養家族を扱う方がはるかに優れていると思います。しかし、私はこの点について実際にマニュアルを理解することはできません。メイクファイルを何度も何度も繰り返しないように最適化するには
OSXとLinux上で動作するmakefileを持っていますが、私はgnu makeと仮定していますが、私が理解していない手法を使用することでかなり短縮できると期待しています。それはそれのいたるところに異なるディレクトリのパターンを繰り返す。次のように改善する方法を教えてください。短縮するたびにどの施設が使用されているか教えてください。
# Include this file NOT stored in repository which defines which environment to use
include Makefile.local
# Work out the pas version
PAS=${shell git describe --abbrev=0}
# Version of node being used
VERSION = 7.6.0
\.dockerimage: access/.dockerimage evening/.dockerimage server/.dockerimage
touch .dockerimage
server/.dockerimage: client/client/.dockerimage server/.env $(shell find server \! -name pacakge.json \! -name .dockerimage -depth 1 -type f)
docker image build -t server:${PAS} -t server:latest server
touch server/.dockerimage
server/.env: environments/common/server.env environments/${enviro}/server.env
cat environments/common/server.env > server/.env
cat environments/${enviro}/server.env >> server/.env
access/.dockerimage: request/.dockerimage access/.env $(shell find access \! -name pacakge.json \! -name .dockerimage -depth 1 -type f)
docker image build -t access:${PAS} -t access:latest access
touch access/.dockerimage
access/.env: environments/common/access.env environments/${enviro}/access.env
cat environments/common/access.env > access/.env
cat environments/${enviro}/access.env >> access/.env
evening/.dockerimage: request/.dockerimage evening/.env $(shell find evening \! -name pacakge.json \! -name .dockerimage -depth 1 -type f)
docker image build -t evening:${PAS} -t evening:latest evening
touch evening/.dockerimage
evening/.env: environments/common/evening.env environments/${enviro}/evening.env
cat environments/common/evening.env > evening/.env
cat environments/${enviro}/evening.env >> evening/.env
pcode/.dockerimage: libs/.dockerimage pcode/.env $(shell find pcode \! -name pacakge.json \! -name .dockerimage -depth 1 -type f)
docker image build -t pcode:${PAS} -t pcode:latest pcode
touch pcode/.dockerimage
pcode/.env: environments/common/pcode.env environments/${enviro}/pcode.env
cat environments/common/pcode.env > pcode/.env
cat environments/${enviro}/pcode.env >> pcode/.env
test-client/.dockerimage: client/client/.dockerimage
docker image build -t test-client:${PAS} test-client:latest test-client
touch test-client/.dockerimage
test-server/.dockerimage: services/.dockerimage
docker image build -t test-server:${PAS} -t test-server:latest test-server
touch test-server/.dockerimage
client/client/.dockerimage: services/.dockerimage $(shell find client/client \! -name .dockerimage -type f)
docker image build -t client:${PAS} -t client:latest client/client
touch client/client/.dockerimage
services/.dockerimage: client/.dockerimage $(shell find services \! -name .dockerimage -type f -print0)
docker image build -t services:${PAS} -t services:latest services --build-arg PAS_VERSION=${PAS}
touch services/.dockerimage
client/.dockerimage: libs/.dockerimage $(shell find client \! -name .dockerimage -depth 1 -type f)
docker image build -t components:${PAS} -t components:latest client
touch client/.dockerimage
libs/.dockerimage: request/.dockerimage $(shell find libs \! -name .dockerimage -type f)
docker image build -t libs:${PAS} -t libs:latest libs
touch libs/.dockerimage
request/.dockerimage: node/.dockerimage $(shell find request \! -name .dockerimage -type f)
docker image build -t request:${PAS} -t request:latest request
touch request/.dockerimage
node/.dockerimage: node/Dockerfile-${ARCH} node/.dockerignore
docker image build -f node/Dockerfile-${ARCH} -t node:${VERSION} -t node:latest node
touch node/.dockerimage
clean: clean-images clean-above clean-env
rm node/.dockerimage
docker image rm -f node:latest
docker image rm -f node:${VERSION}
clean-above:
for dir in server access evening pcode client/client services test-client test-server servies client libs request; \
do rm $$dir/.dockerimage; done
clean-env:
for dir in access evening pcode server; do rm $$dir/.env; done
clean-images: clean-above
for dir in access access evening pcode client/client services test-client test-server services client libs request; \
do docker image rm -f $$dir:latest; docker image rm -f $$dir:${PAS}; done
.PHONY: run clean clean-above clean-images clean-env
必須ではないが、それは、Windows上のgit-はbash(これにMAKE.EXEを追加する)の下で実行することも有用であろう。
コードを書き直したくありませんでした。これは私が探していた答えの一種です。まったく新しいものを作るためには、どのセクションを見るかを知ることさえ知ることは非常に困難です。私は、CとC++のいくつかのルールが組み込まれている暗黙のルールを考えました。制御できるものではなく、 – akc42
OKです。 _それをより良くする方法を教えてください... git-bash_の下で実行すると便利ですが、誰かに書き直しを求めているようですが、おそらく私はそれを誤って解釈したでしょう。 makeに組み込まれているRe C/C++ルールは、(GNU makeマニュアルで)「組み込みルール」と呼ばれています。すべての組み込みルールは必ず暗黙的ですが、十分でない場合や適切でない場合は、組み込みルールを拡張または置き換える独自の暗黙ルールを定義することができます。がんばろう! – MadScientist