我想用C编写一个程序,该程序在makefile中占一行,并以几种方式对其进行处理:
要从makefile处理的行可能看起来像这样:
calcmarks.o : calcmarks.c calcmarks.h globals.o
calcmarks.o
是目标的名称,calcmarks.c
,calcmarks.h
和globals.o
都是依赖项的名称,前两个是磁盘上的文件,最终依赖性是另一个目标。我们将calcmarks.o
存储在变量 targetName 中,然后选择合适的数据结构来存储其他依赖项。我想以某种方式存储依赖项的名称,这样我以后可以方便地检查任何依赖项的修改日期,并将其与目标的修改日期进行比较,以查看该依赖项是否比最近修改了。目标。
这是到目前为止我能想到的代码。本质上,此函数采用文件指针和要重建的目标,并最终将其重建。
// filePtr is the text file pointer after going through processVariables
// Target is the name of the target isolated from the command line interface (requested by user)
void processTarget (FILE* filePtr , char target[]) {
// Holds line by line
char buffer[1000];
// Holds name of target with no whitespace
char targetName[1000];
// Boolean to check if the target was indeed found
bool targetFound = false;
while (fgets(buffer , sizeof(buffer) , filePtr) != NULL) {
int i;
for (i = 0; buffer[i] != '\0'; i++) {
// Copying a potential target name until we find a colon
if (buffer[i] == ':') {
// Don't copy the colon, so terminate the string
targetName[i] = '\0';
targetFound = true;
break;
}
targetName[i] = buffer[i];
}
// If the previous loop encountered a target name via the existance of a semicolon
if (targetFound) {
// If the target name is the same as the required target
if (target == targetName) {
// Test for 0 dependencies
if (buffer[i + 1] == '\0') continue; // End of string
int j;
for (j = i + 1; j != '\0'; j++) {
// Processing the line after the colon
}
}
}
}
}
还请注意,依赖项的数量是可变的。因此,如果我要初始化一个结构来存储它们的名称,我将不知道size参数。
如何在冒号后搜索依赖项,忽略空格,并将依赖项的名称存储在数据结构中?
编辑:感谢@JonathanLeffler的澄清:除基于Web的URL外,此项目必须识别的依赖项不会比下面提供的行难得多。