Your Build Script Method
If you want to keep to the "bash build method", то, вероятно, лучше всего "потрогать" файл (touch lastbuild
), когда запущен скрипт сборки и он завершает сборку. Кроме того, скрипт сборки может затем искать файл, сгенерированный прикосновением (если он не существует, предположим, что сборка нужна), или, если он существует, использовать find
, чтобы посмотреть, существуют ли более новые файлы:
find . -name "*.[ch]" -newer lastbuild
, а затем собрать, если этот вывод составляет 1 или более строк (можно проверить чем-то вроде wc -l
).
Использование Make вместо
Это лучше всего управляется чем-то вроде Makefile (специально используется для такой проверки зависимостей).
default: all
all: dependency1.o dependency2.o
dependency1.o: dependency1.c
./make_common_lib.bsh build
dependency2.o: dependency2.c
./make_common_lib.bsh build
install:
./make_common_lib.bsh install
Создание фиктивного скрипта "build":
$ cat make_common_lib.bsh
#! /bin/sh
echo "Build $1"
Теперь мы можем запустить make:
$ make
./make_common_lib.bsh build
Build build
./make_common_lib.bsh build
Build build
Вы также можете заменить ./make_common_lib.bsh build
командой, которая ./make_common_lib.bsh build
выдаст команду на сборку зависимости 1. o
etc:
dependency1.o: dependency1.c
gcc -c dependency1.c
Makefiles также допускает подстановку символов, поэтому вы можете объявить флаги компилятора и компилятора ранее в Makefile:
CC=/usr/bin/gcc
CFLAGS=-O2 -Wall
и затем сделать на них ссылки в ваших правилах:
dependency1.o: dependency1.c
$(CC) $(CFLAGS) -c dependency1.c
Обратите внимание, что строка, которая отступает после объявления зависимости, должна начинаться с табуляции, а не с пробелов.
Укорочение списка правил зависимостей
В операционной системе спросили, можно ли сделать более короткие способы объявления всех зависимостей. Это возможно с помощью нескольких трюков с помощью make GNU (обратите внимание, что не все они будут работать с ванильной make).
Можно сделать подстановку переменных. Учитывая объявление:
SRCS=dependency1.c dependency2.c dependency3.c
Вы можете создать правило для объектов, используя подстановку переменных:
OBJS=$(SRCS:.c=.o)
это заменит все .c
на .o
. Фактически, давая строку вида:
OBJS=dependency1.o dependency2.o dependency3.o
Вы можете далее сделать сокращение "команды компиляции", используя специальные переменные $ и
$@
:
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
$ представляет собой предпосылку в GNU сделать parlance (или зависимость, как я ее назвал) и
$@
целью, и таким образом, в конечном итоге, она будет выпущена:
/usr/bin/gcc -Wall -O2 -c dependency1.c -o dependency1.o
/usr/bin/gcc -Wall -O2 -c dependency2.c -o dependency2.o
.
.
.
Складывая все это вместе, с опциями связывания и командой для связывания и компиляции исполняемого файла $(TARGET)
:
# Globals
CC=/usr/bin/gcc
CFLAGS=-Wall -O2
LDFLAGS=-L/usr/local/lib
LIBS=-ldependencylib
# declare all the sources
SRCS=dependency1.c dependency2.c
# declare the objects files using variable substitution (find .c and replace with .o)
OBJS=$(SRCS:.c=.o)
# Target executable name:
TARGET=myexefile
default: all
all: $(TARGET)
@echo Target has been built
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS) $(LIBS)
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
install:
./make_common_lib.bsh install
Обратите внимание, что есть много вещей, которые можно сделать с помощью GNU, и это хорошо задокументировано здесь GNU Make Manual.