소스 파일이 컴파일된 프로그램보다 최신인 경우에만 컴파일 스크립트를 실행합니다.

소스 파일이 컴파일된 프로그램보다 최신인 경우에만 컴파일 스크립트를 실행합니다.

내가 하고 싶은 것은 소스 코드가 변경될 때만 특정 프로그램을 컴파일하기 위해 다른 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 스크립팅을 처음 접했기 때문에 이 작업을 수행하는 정말 쉬운 방법이 있다면 죄송합니다. 하지만 지금까지 검색해본 결과 실제로 유용한 정보를 반환한 것은 없습니다.

추가 정보:

타임스탬프 변수의 형식은 다음과 같습니다.

1432326068 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326069 1432326068 1432326069 1432326069

답변1

빌드 스크립트 방법

"bash 빌드 방법"을 유지하려면 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

더미 "빌드" 스크립트를 만듭니다.

$ 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 builddependency1.o

dependency1.o: dependency1.c
    gcc -c dependency1.c

Makefile은 기호 대체도 허용하므로 Makefile의 앞부분에 컴파일러와 컴파일러 플래그를 선언할 수 있습니다.

CC=/usr/bin/gcc
CFLAGS=-O2 -Wall

그런 다음 규칙에서 이를 참조하세요.

dependency1.o: dependency1.c
    $(CC) $(CFLAGS) -c dependency1.c

종속성 선언 뒤의 들여쓰기된 줄은 공백이 아닌 탭으로 시작해야 합니다.

종속성 규칙 목록 단축

OP는 모든 종속성을 선언하는 더 짧은 방법이 있는지 물었습니다. GNU make를 사용하면 몇 가지 트릭이 가능합니다(이 모든 것이 바닐라 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의 대상이 용어를 지정하므로 결국 다음을 내보내게 됩니다.

/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 make를 사용하면 많은 일을 할 수 있습니다.GNU 제작 매뉴얼.

관련 정보