システムパスにインストールするときに共有ライブラリをインストールするにはどうすればよいですか?

システムパスにインストールするときに共有ライブラリをインストールするにはどうすればよいですか?

以下は最初のMakefile試みです。libsgtk.soMakefile

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の対象を知っていますかMakefileinstallとターゲットに使用する必要がありますclean(注:libsgtk.soでも削除する必要がありますclean)。

関連情報