Запуск псевдотерминала внутри псевдотерминала

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.

2
03.01.2018, 18:24
0 ответов

Теги

Похожие вопросы