以下は最初のMakefile
試みです。libsgtk.so
Makefile
CFLAGS= -pthread \
-I/usr/include/gtk-3.0 \
-I/usr/include/pango-1.0 \
-I/usr/include/atk-1.0 \
-I/usr/include/cairo \
-I/usr/include/gdk-pixbuf-2.0 \
-I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include
all: libsgtk.so
libsgtk.so: window.o
gcc -shared -o libsgtk.so window.o
window.o: window.c
gcc $(CFLAGS) -c -fpic window.c
clean:
rm window.o
install:
mv libsgtk.so /usr/local/lib
ご覧のとおり、インストールパスを/usr/local/lib
。パスに同じ名前のライブラリがすでに存在する場合はどうなりますか? Makefileでこれを確認する必要がありますか、または代替インストールパスを提供するために他のツールを使用する必要がありますか?
答え1
変数を使うべきだと思います。たとえば、
DESTDIR?=/usr/local/lib
...
install:
mv libsgtk.so ${DESTDIR}
この場合、ユーザーはmake DESTDIR=/usr/lib
(?
上記の注)を使用してデフォルト値を上書きできます。
必要に応じてテストできます。たぶんこれはそれほど悪い考えではないかもしれません。より簡単な方法はmv -n
(またはmv -nv
)を代わりに使用することですmv
。既存のファイルを上書きしません。最大の欠点は、戻り値がmv
ゼロであるため、make
移動が成功したかどうかがわからないことです。
cp
しかし、代わりに(コピー)を使用するとmv
良いでしょう。cp -n
ターゲットファイルが存在する場合は1(ゼロ以外)を返します。したがって、ソリューション(テストを含む)は次のようになります。
install:
cp -n libsgtk.so ${DESTDIR}
役に立つ質問です。PHONY
の対象を知っていますかMakefile
?install
とターゲットに使用する必要がありますclean
(注:libsgtk.so
でも削除する必要がありますclean
)。