Переделка-Makefiles
Я пытался проверить эту главу, в моем понимании, это должен быть бесконечный цикл,
но это не так.
$ cat Makefile
#/tmp/Makefile: ;
-include /tmp/include.mk
/tmp/generate:/tmp/generate_file.c
gcc $< -o $@
/tmp/include.mk:/tmp/generate
/tmp/generate $@
/tmp/touch_file
/tmp/generate
- это исполняемый файл, который может создать файл.
/tmp/touch_file
- это исполняемый файл, который может обновлять отметку времени /tmp/generate
.
Во втором обнаружении /tmp/generate
новее /tmp/include.mk
, почему бы и нет
обновить это снова?
xuwl@xuwl:/tmp$ make
/tmp/generate /tmp/include.mk
/tmp/touch_file
/tmp/generate last change time Wed Mar 6 10:59:53 2019
/tmp/generate /tmp/include.mk
/tmp/touch_file
/tmp/generate last change time Wed Mar 6 11:08:48 2019
make: '/tmp/generate' is up to date.
xuwl@xuwl:/tmp$ stat /tmp/include.mk
File: '/tmp/include.mk'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 806h/2054d Inode: 915845 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ xuwl) Gid: ( 1000/ xuwl)
Access: 2019-03-06 11:08:48.782753764 +0800
Modify: 2019-03-06 11:08:41.778754001 +0800
Change: 2019-03-06 11:08:41.778754001 +0800
Birth: -
xuwl@xuwl:/tmp$ stat /tmp/generate
File: '/tmp/generate'
Size: 8768 Blocks: 24 IO Block: 4096 regular file
Device: 806h/2054d Inode: 915856 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 1000/ xuwl) Gid: ( 1000/ xuwl)
Access: 2019-03-06 11:08:55.782753529 +0800
Modify: 2019-03-06 11:08:55.782753529 +0800
Change: 2019-03-06 11:08:55.782753529 +0800
Birth: -
touch_file.c
- исходный код /tmp/touch_file
#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#define GENERATEFILE "/tmp/generate"
int main(int argc, char* argv[])
{
int fd = open(GENERATEFILE, O_RDWR);
if(fd<0){
perror("open file failed\n");
return -1;
}
struct stat st;
stat(GENERATEFILE,&st);
printf("%s last change time %s",GENERATEFILE,ctime(&st.st_ctime));
sleep(4);
futimens(fd,0);
close(fd);
return 0;
}
generate_file.c
является источником /tmp/generate
/tmp$ cat generate_file.c
:
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<errno.h>
#include<string.h>
int main(int argc, char* argv[])
{
int fd=open(argv[1], O_CREAT|O_RDWR, 0666);
if(fd<0){
printf("open file %s error\n", argv[1]);
return -1;
}
sleep(3);
close(fd);
return 0;
}