Я пытаюсь сделать, это создать скрипт bash, который будет запускать другой скрипт bash для компиляции некоторых программ, только если источник изменился. Пока у меня есть способ получить метки времени для каждого файла в секундах с эпохи J2000:
#get a list of the source timestamps
sourceTimes=$(stat -f "%Sm" -t "%s" *.f)
#get a list of the program timestamps
exeTimes=$(stat -f "%Sm" -t "%s")
и скрипт установки
./make_common_lib.bsh build
./make_common_lib.bsh install
Я хочу выяснить, как создать такое состояние if, что (в полупсевдокоде)
if [any of $sourceTimes>$exeTimes];
then #run make_common_lib.bsh script
else #Do nothing
fi
Мое лучшее предположение пока что состоит в том, чтобы как-то использовать, read
но я не уверен, как я мог бы индексировать обе переменные одновременно.
Если есть действительно простой способ сделать это, я приношу свои извинения, поскольку я очень плохо знаком с сценариями bash, но пока что ни один из моих поисков в Google действительно не дал ничего полезного.
Еще немного информации:
Переменные меток времени имеют формат
1432326068 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326068 1432326069 1432326069
источник
make
? Он явно разработан для удовлетворения этого требования.make depend
илиmake dep
регенерируете список).Ответы:
Ваш метод сценария сборки
Если вы хотите придерживаться "метода сборки bash", то вам, вероятно, лучше всего "прикоснуться" к файлу (
touch lastbuild
), когда скрипт сборки запускается и завершает сборку. Кроме того, сценарий сборки может затем искать файл, сгенерированный касанием (если он не существует, предположить, что сборка необходима), или, если он существует, использовать,find
чтобы увидеть, существуют ли какие-либо более новые файлы:и затем построить, если этот вывод составляет 1 или более строк (можно проверить с помощью чего-то вроде
wc -l
).Вместо этого используйте Make
Для этого лучше всего использовать что-то вроде Makefile (специально используется для такого рода проверки зависимостей).
Создание фиктивного сценария сборки
Теперь мы можем запустить make:
Вы также можете заменить
./make_common_lib.bsh build
команду,./make_common_lib.bsh build
которая выдаст команду builddependency1.o
:Makefiles также допускают подстановку символов, поэтому вы можете объявить флаги complier и compiler ранее в Makefile:
а затем сделайте ссылки на них в ваших правилах:
Обратите внимание, что строка с отступом после объявления зависимости должна начинаться с табуляции, а не с пробелов.
Сокращение списка правил зависимости
ОП спросила, можно ли сделать более короткие способы объявления всех зависимостей. Это возможно с помощью нескольких трюков с использованием GNU make (обратите внимание, что не все они будут работать с vanilla make).
Вы можете сделать замену переменных. Учитывая декларацию:
Затем вы можете создать правило объектов, используя подстановку переменных:
это заменит все
.c
с.o
's. По сути, дает строку вида:Затем вы можете дополнительно укоротить «команду компиляции», используя специальные переменные
$<
и$@
:$<
представляет предпосылку в GNU make parlance (или зависимость, как я ее назвал) и$@
цель, и в результате она выдаст:Собрав все это вместе, с опциями связывания и командой для связывания и компиляции исполняемого файла
$(TARGET)
:Обратите внимание, что есть много вещей, которые вы можете сделать с GNU make, и это хорошо задокументировано здесь GNU Make Manual .
источник