Compiling

在 Makefile 中使用 install -D

  • November 2, 2017

我正在嘗試編輯包含以下內容的 Makefile:

...
install -d $(DESTDIR)/usr/lib/myApp
install -d $(DESTDIR)/usr/lib/myApp/scripts
install -t $(DESTDIR)/usr/lib/myApp/scripts \
   src/scripts/ap.sh \
   src/scripts/connect.sh \
   src/scripts/devices.sh \
   src/scripts/create_ap \
   src/scripts/scan.sh
...

閱讀此 Q/A後,我想到可以將所有內容替換為:

install -D src/scripts/* $(DESTDIR)/usr/lib/myApp/scripts

但是上面給了我一個錯誤說:

安裝:目標’/var/lib/jenkins/data/workspace/network-service_build-test@2/build/debian/myApp-service-network/usr/lib/myApp/scripts/network’不是目錄

我是否誤解了-D這裡使用標誌?我認為它應該將我的文件移動到指定的路徑並在需要時創建文件夾。

我相信你需要

install -t "$(DESTDIR)/usr/lib/myApp/scripts/network" -D src/scripts/*

這將創建$(DESTDIR)/usr/lib/myApp/scripts/network(包括中間目錄)並在src/scripts/*那裡複製文件。

測試(打開額外的詳細資訊):

$ touch file-{1,2,3,4}
$ install -v -t test/dir -D file-[1-4]
install: creating directory 'test'
install: creating directory 'test/dir'
'file-1' -> 'test/dir/file-1'
'file-2' -> 'test/dir/file-2'
'file-3' -> 'test/dir/file-3'
'file-4' -> 'test/dir/file-4'

這適用於 coreutils 8.25 中的 GNU install,但不適用於 coreutils 8.4。對於較舊的 coreutils 實現,分兩步完成:

install -d "$(DESTDIR)/usr/lib/myApp/scripts/network"
install -t "$(DESTDIR)/usr/lib/myApp/scripts/network" src/scripts/*

…或類似的東西。

引用自:https://unix.stackexchange.com/questions/402150