qmake/generators/makefiledeps.cpp
changeset 7 f7bc934e204c
parent 0 1918ee327afb
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
     1 /****************************************************************************
     1 /****************************************************************************
     2 **
     2 **
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     4 ** All rights reserved.
     4 ** All rights reserved.
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     6 **
     6 **
     7 ** This file is part of the qmake application of the Qt Toolkit.
     7 ** This file is part of the qmake application of the Qt Toolkit.
     8 **
     8 **
   395         if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode))
   395         if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode))
   396             return false;
   396             return false;
   397         buffer = getBuffer(fst.st_size);
   397         buffer = getBuffer(fst.st_size);
   398         for(int have_read = 0;
   398         for(int have_read = 0;
   399             (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len));
   399             (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len));
   400             buffer_len += have_read);
   400             buffer_len += have_read) ;
   401         QT_CLOSE(fd);
   401         QT_CLOSE(fd);
   402     }
   402     }
   403     if(!buffer)
   403     if(!buffer)
   404         return false;
   404         return false;
   405     if(!file->deps)
   405     if(!file->deps)
   416                 ++x;
   416                 ++x;
   417             if(*(buffer + x) == '<') {
   417             if(*(buffer + x) == '<') {
   418                 ++x;
   418                 ++x;
   419                 if(buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) &&
   419                 if(buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) &&
   420                    (*(buffer + x + 11) == ' ' || *(buffer + x + 11) == '>')) {
   420                    (*(buffer + x + 11) == ' ' || *(buffer + x + 11) == '>')) {
   421                     for(x += 11; *(buffer + x) != '>'; ++x);
   421                     for(x += 11; *(buffer + x) != '>'; ++x) ;
   422                     int inc_len = 0;
   422                     int inc_len = 0;
   423                     for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len);
   423                     for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ;
   424                     *(buffer + x + inc_len) = '\0';
   424                     *(buffer + x + inc_len) = '\0';
   425                     inc = buffer + x;
   425                     inc = buffer + x;
   426                 } else if(buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) &&
   426                 } else if(buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) &&
   427                           (*(buffer + x + 12) == ' ' || *(buffer + x + 12) == '>')) {
   427                           (*(buffer + x + 12) == ' ' || *(buffer + x + 12) == '>')) {
   428                     for(x += 13; *(buffer + x) != '>'; ++x); //skip up to >
   428                     for(x += 13; *(buffer + x) != '>'; ++x) ; //skip up to >
   429                     while(x < buffer_len) {
   429                     while(x < buffer_len) {
   430                         for(x++; *(buffer + x) != '<'; ++x); //skip up to <
   430                         for(x++; *(buffer + x) != '<'; ++x) ; //skip up to <
   431                         x++;
   431                         x++;
   432                         if(buffer_len >= x + 7 && !strncmp(buffer+x, "header", 6) &&
   432                         if(buffer_len >= x + 7 && !strncmp(buffer+x, "header", 6) &&
   433                            (*(buffer + x + 6) == ' ' || *(buffer + x + 6) == '>')) {
   433                            (*(buffer + x + 6) == ' ' || *(buffer + x + 6) == '>')) {
   434                             for(x += 7; *(buffer + x) != '>'; ++x); //skip up to >
   434                             for(x += 7; *(buffer + x) != '>'; ++x) ; //skip up to >
   435                             int inc_len = 0;
   435                             int inc_len = 0;
   436                             for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len);
   436                             for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ;
   437                             *(buffer + x + inc_len) = '\0';
   437                             *(buffer + x + inc_len) = '\0';
   438                             inc = buffer + x;
   438                             inc = buffer + x;
   439                             break;
   439                             break;
   440                         } else if(buffer_len >= x + 14 && !strncmp(buffer+x, "/customwidget", 13) &&
   440                         } else if(buffer_len >= x + 14 && !strncmp(buffer+x, "/customwidget", 13) &&
   441                                   (*(buffer + x + 13) == ' ' || *(buffer + x + 13) == '>')) {
   441                                   (*(buffer + x + 13) == ' ' || *(buffer + x + 13) == '>')) {
   446                 } else if(buffer_len >= x + 8 && !strncmp(buffer + x, "include", 7) &&
   446                 } else if(buffer_len >= x + 8 && !strncmp(buffer + x, "include", 7) &&
   447                           (*(buffer + x + 7) == ' ' || *(buffer + x + 7) == '>')) {
   447                           (*(buffer + x + 7) == ' ' || *(buffer + x + 7) == '>')) {
   448                     for(x += 8; *(buffer + x) != '>'; ++x) {
   448                     for(x += 8; *(buffer + x) != '>'; ++x) {
   449                         if(buffer_len >= x + 9 && *(buffer + x) == 'i' &&
   449                         if(buffer_len >= x + 9 && *(buffer + x) == 'i' &&
   450                            !strncmp(buffer + x, "impldecl", 8)) {
   450                            !strncmp(buffer + x, "impldecl", 8)) {
   451                             for(x += 8; *(buffer + x) != '='; ++x);
   451                             for(x += 8; *(buffer + x) != '='; ++x) ;
   452                             if(*(buffer + x) != '=')
   452                             if(*(buffer + x) != '=')
   453                                 continue;
   453                                 continue;
   454                             for(++x; *(buffer+x) == '\t' || *(buffer+x) == ' '; ++x);
   454                             for(++x; *(buffer+x) == '\t' || *(buffer+x) == ' '; ++x) ;
   455                             char quote = 0;
   455                             char quote = 0;
   456                             if(*(buffer+x) == '\'' || *(buffer+x) == '"') {
   456                             if(*(buffer+x) == '\'' || *(buffer+x) == '"') {
   457                                 quote = *(buffer + x);
   457                                 quote = *(buffer + x);
   458                                 ++x;
   458                                 ++x;
   459                             }
   459                             }
   473                                 //### do this
   473                                 //### do this
   474                             }
   474                             }
   475                         }
   475                         }
   476                     }
   476                     }
   477                     int inc_len = 0;
   477                     int inc_len = 0;
   478                     for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len);
   478                     for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ;
   479                     *(buffer + x + inc_len) = '\0';
   479                     *(buffer + x + inc_len) = '\0';
   480                     inc = buffer + x;
   480                     inc = buffer + x;
   481                 }
   481                 }
   482             }
   482             }
   483             //read past new line now..
   483             //read past new line now..
   484             for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x);
   484             for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ;
   485             ++line_count;
   485             ++line_count;
   486         } else if(file->type == QMakeSourceFileInfo::TYPE_QRC) {
   486         } else if(file->type == QMakeSourceFileInfo::TYPE_QRC) {
   487         } else if(file->type == QMakeSourceFileInfo::TYPE_C) {
   487         } else if(file->type == QMakeSourceFileInfo::TYPE_C) {
   488             for(int beginning=1; x < buffer_len; ++x) {
   488             for(int beginning=1; x < buffer_len; ++x) {
   489                 // whitespace comments and line-endings
   489                 // whitespace comments and line-endings
   492                         // keep going
   492                         // keep going
   493                     } else if(*(buffer+x) == '/') {
   493                     } else if(*(buffer+x) == '/') {
   494                         ++x;
   494                         ++x;
   495                         if(buffer_len >= x) {
   495                         if(buffer_len >= x) {
   496                             if(*(buffer+x) == '/') { //c++ style comment
   496                             if(*(buffer+x) == '/') { //c++ style comment
   497                                 for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x);
   497                                 for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ;
   498                                 beginning = 1;
   498                                 beginning = 1;
   499                             } else if(*(buffer+x) == '*') { //c style comment
   499                             } else if(*(buffer+x) == '*') { //c style comment
   500                                 for(++x; x < buffer_len; ++x) {
   500                                 for(++x; x < buffer_len; ++x) {
   501                                     if(*(buffer+x) == '*') {
   501                                     if(*(buffer+x) == '*') {
   502                                         if(x < buffer_len-1 && *(buffer + (x+1)) == '/') {
   502                                         if(x < buffer_len-1 && *(buffer + (x+1)) == '/') {
   556             while(x+keyword_len < buffer_len) {
   556             while(x+keyword_len < buffer_len) {
   557                 if(((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) &&
   557                 if(((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) &&
   558                    *(buffer+x+keyword_len) != '_') {
   558                    *(buffer+x+keyword_len) != '_') {
   559                     for(x+=keyword_len; //skip spaces after keyword
   559                     for(x+=keyword_len; //skip spaces after keyword
   560                         x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t');
   560                         x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t');
   561                         x++);
   561                         x++) ;
   562                     break;
   562                     break;
   563                 } else if(qmake_endOfLine(*(buffer+x+keyword_len))) {
   563                 } else if(qmake_endOfLine(*(buffer+x+keyword_len))) {
   564                     x += keyword_len-1;
   564                     x += keyword_len-1;
   565                     keyword_len = 0;
   565                     keyword_len = 0;
   566                     break;
   566                     break;
   577                     continue;
   577                     continue;
   578                 }
   578                 }
   579                 x++;
   579                 x++;
   580 
   580 
   581                 int inc_len;
   581                 int inc_len;
   582                 for(inc_len = 0; *(buffer + x + inc_len) != term && !qmake_endOfLine(*(buffer + x + inc_len)); ++inc_len);
   582                 for(inc_len = 0; *(buffer + x + inc_len) != term && !qmake_endOfLine(*(buffer + x + inc_len)); ++inc_len) ;
   583                 *(buffer + x + inc_len) = '\0';
   583                 *(buffer + x + inc_len) = '\0';
   584                 inc = buffer + x;
   584                 inc = buffer + x;
   585                 x += inc_len;
   585                 x += inc_len;
   586             } else if(keyword_len == 13 && !strncmp(keyword, "qmake_warning", keyword_len)) {
   586             } else if(keyword_len == 13 && !strncmp(keyword, "qmake_warning", keyword_len)) {
   587                 char term = 0;
   587                 char term = 0;
   592                 if(term)
   592                 if(term)
   593                     x++;
   593                     x++;
   594 
   594 
   595                 int msg_len;
   595                 int msg_len;
   596                 for(msg_len = 0; (term && *(buffer + x + msg_len) != term) &&
   596                 for(msg_len = 0; (term && *(buffer + x + msg_len) != term) &&
   597                               !qmake_endOfLine(*(buffer + x + msg_len)); ++msg_len);
   597                               !qmake_endOfLine(*(buffer + x + msg_len)); ++msg_len) ;
   598                 *(buffer + x + msg_len) = '\0';
   598                 *(buffer + x + msg_len) = '\0';
   599                 debug_msg(0, "%s:%d %s -- %s", file->file.local().toLatin1().constData(), line_count, keyword, buffer+x);
   599                 debug_msg(0, "%s:%d %s -- %s", file->file.local().toLatin1().constData(), line_count, keyword, buffer+x);
   600                 x += msg_len;
   600                 x += msg_len;
   601             } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') {
   601             } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') {
   602                 const char term = *(buffer+(x++));
   602                 const char term = *(buffer+(x++));
   704         if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode))
   704         if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode))
   705             return false; //shouldn't happen
   705             return false; //shouldn't happen
   706         buffer = getBuffer(fst.st_size);
   706         buffer = getBuffer(fst.st_size);
   707         for(int have_read = buffer_len = 0;
   707         for(int have_read = buffer_len = 0;
   708             (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len));
   708             (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len));
   709             buffer_len += have_read);
   709             buffer_len += have_read) ;
   710         QT_CLOSE(fd);
   710         QT_CLOSE(fd);
   711     }
   711     }
   712 
   712 
   713     debug_msg(2, "findMocs: %s", file->file.local().toLatin1().constData());
   713     debug_msg(2, "findMocs: %s", file->file.local().toLatin1().constData());
   714     int line_count = 1;
   714     int line_count = 1;
   718     for(int x = 0; x < buffer_len; x++) {
   718     for(int x = 0; x < buffer_len; x++) {
   719         if(*(buffer + x) == '/') {
   719         if(*(buffer + x) == '/') {
   720             ++x;
   720             ++x;
   721             if(buffer_len >= x) {
   721             if(buffer_len >= x) {
   722                 if(*(buffer + x) == '/') { //c++ style comment
   722                 if(*(buffer + x) == '/') { //c++ style comment
   723                     for(;x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x);
   723                     for(;x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ;
   724                 } else if(*(buffer + x) == '*') { //c style comment
   724                 } else if(*(buffer + x) == '*') { //c style comment
   725                     for(++x; x < buffer_len; ++x) {
   725                     for(++x; x < buffer_len; ++x) {
   726                         if(*(buffer + x) == 't' || *(buffer + x) == 'q') { //ignore
   726                         if(*(buffer + x) == 't' || *(buffer + x) == 'q') { //ignore
   727                             if(buffer_len >= (x + 20) &&
   727                             if(buffer_len >= (x + 20) &&
   728                                !strncmp(buffer + x + 1, "make ignore Q_OBJECT", 20)) {
   728                                !strncmp(buffer + x + 1, "make ignore Q_OBJECT", 20)) {