summaryrefslogtreecommitdiff
path: root/qmake/generators/win32/msvc_objectmodel.cpp
Unidiff
Diffstat (limited to 'qmake/generators/win32/msvc_objectmodel.cpp') (more/less context) (show whitespace changes)
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp155
1 files changed, 96 insertions, 59 deletions
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index c2b9e30..7ffe4f7 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -374,25 +374,25 @@ VCCLCompilerTool::VCCLCompilerTool()
374 UsePrecompiledHeader( pchGenerateAuto ), 374 UsePrecompiledHeader( pchGenerateAuto ),
375 WarnAsError( unset ), 375 WarnAsError( unset ),
376 WarningLevel( warningLevel_0 ), 376 WarningLevel( warningLevel_0 ),
377 WholeProgramOptimization( unset ) 377 WholeProgramOptimization( unset )
378{ 378{
379} 379}
380 380
381QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool ) 381QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool )
382{ 382{
383 strm << _begTool3; 383 strm << _begTool3;
384 strm << _VCCLCompilerToolName; 384 strm << _VCCLCompilerToolName;
385 strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories ); 385 strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories );
386 strm << XPair( _AdditionalOptions, tool.AdditionalOptions ); 386 strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
387 strm << XPair( _AdditionalUsingDirectories, tool.AdditionalUsingDirectories ); 387 strm << XPair( _AdditionalUsingDirectories, tool.AdditionalUsingDirectories );
388 strm << SPair( _AssemblerListingLocation, tool.AssemblerListingLocation ); 388 strm << SPair( _AssemblerListingLocation, tool.AssemblerListingLocation );
389 if ( tool.AssemblerOutput != asmListingNone ) strm << EPair( _AssemblerOutput, tool.AssemblerOutput ); 389 if ( tool.AssemblerOutput != asmListingNone ) strm << EPair( _AssemblerOutput, tool.AssemblerOutput );
390 if ( tool.BasicRuntimeChecks != runtimeBasicCheckNone ) strm << EPair( _BasicRuntimeChecks, tool.BasicRuntimeChecks ); 390 if ( tool.BasicRuntimeChecks != runtimeBasicCheckNone ) strm << EPair( _BasicRuntimeChecks, tool.BasicRuntimeChecks );
391 if ( tool.BrowseInformation != brInfoNone ) strm << EPair( _BrowseInformation, tool.BrowseInformation ); 391 if ( tool.BrowseInformation != brInfoNone ) strm << EPair( _BrowseInformation, tool.BrowseInformation );
392 strm << SPair( _BrowseInformationFile, tool.BrowseInformationFile ); 392 strm << SPair( _BrowseInformationFile, tool.BrowseInformationFile );
393 strm << TPair( _BufferSecurityCheck, tool.BufferSecurityCheck ); 393 strm << TPair( _BufferSecurityCheck, tool.BufferSecurityCheck );
394 if ( tool.CallingConvention != callConventionDefault ) strm << EPair( _CallingConvention, tool.CallingConvention ); 394 if ( tool.CallingConvention != callConventionDefault ) strm << EPair( _CallingConvention, tool.CallingConvention );
395 if ( tool.CompileAs != compileAsDefault ) strm << EPair( _CompileAs, tool.CompileAs ); 395 if ( tool.CompileAs != compileAsDefault ) strm << EPair( _CompileAs, tool.CompileAs );
396 if ( tool.CompileAsManaged != managedDefault ) strm << EPair( _CompileAsManaged, tool.CompileAsManaged ); 396 if ( tool.CompileAsManaged != managedDefault ) strm << EPair( _CompileAsManaged, tool.CompileAsManaged );
397 strm << TPair( _CompileOnly, tool.CompileOnly ); 397 strm << TPair( _CompileOnly, tool.CompileOnly );
398 strm << EPair( _DebugInformationFormat, tool.DebugInformationFormat ); 398 strm << EPair( _DebugInformationFormat, tool.DebugInformationFormat );
@@ -445,58 +445,62 @@ QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool )
445 strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization ); 445 strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization );
446 strm << "/>"; 446 strm << "/>";
447return strm; 447return strm;
448} 448}
449 449
450bool VCCLCompilerTool::parseOption( const char* option ) 450bool VCCLCompilerTool::parseOption( const char* option )
451{ 451{
452 // skip index 0 ('/' or '-') 452 // skip index 0 ('/' or '-')
453 char first = option[1]; 453 char first = option[1];
454 char second = option[2]; 454 char second = option[2];
455 char third = option[3]; 455 char third = option[3];
456 char fourth = option[4]; 456 char fourth = option[4];
457 bool found = TRUE;
457 458
458 switch ( first ) { 459 switch ( first ) {
459 case '?': 460 case '?':
460 case 'h': 461 case 'h':
461 qWarning( "Generator: Option '/?', '/help': MSVC.NET projects do not support outputting help info" ); 462 qWarning( "Generator: Option '/?', '/help': MSVC.NET projects do not support outputting help info" );
462 return FALSE; 463 found = FALSE;
464 break;
463 case '@': 465 case '@':
464 qWarning( "Generator: Option '/@': MSVC.NET projects do not support the use of a response file" ); 466 qWarning( "Generator: Option '/@': MSVC.NET projects do not support the use of a response file" );
465 return FALSE; 467 found = FALSE;
468 break;
466 case 'l': 469 case 'l':
467 qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" ); 470 qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" );
468 return FALSE; 471 found = FALSE;
469 472 break;
470 case 'A': 473 case 'A':
471 if ( second != 'I' ) 474 if ( second != 'I' ) {
472 return FALSE; 475 found = FALSE; break;
476 }
473 AdditionalUsingDirectories += option+2; 477 AdditionalUsingDirectories += option+2;
474 break; 478 break;
475 case 'C': 479 case 'C':
476 KeepComments = _True; 480 KeepComments = _True;
477 break; 481 break;
478 case 'D': 482 case 'D':
479 PreprocessorDefinitions += option+1; 483 PreprocessorDefinitions += option+1;
480 break; 484 break;
481 case 'E': 485 case 'E':
482 if ( second == 'H' ) { 486 if ( second == 'H' ) {
483 if ( third == 'a' || third == 'c' || third == 's' ) { 487 if ( third == 'a' || third == 'c' || third == 's' ) {
484 // ExceptionHandling must be false, or it will override 488 // ExceptionHandling must be false, or it will override
485 // with an /EHsc option 489 // with an /EHsc option
486 ExceptionHandling = _False; 490 ExceptionHandling = _False;
487 AdditionalOptions += option; 491 AdditionalOptions += option;
488 break; 492 break;
489 } 493 }
490 return FALSE; 494 found = FALSE; break;
491 } 495 }
492 GeneratePreprocessedFile = preprocessYes; 496 GeneratePreprocessedFile = preprocessYes;
493 break; 497 break;
494 case 'F': 498 case 'F':
495 if ( second <= '9' && second >= '0' ) { 499 if ( second <= '9' && second >= '0' ) {
496 AdditionalOptions += option; 500 AdditionalOptions += option;
497 break; 501 break;
498 } else { 502 } else {
499 switch ( second ) { 503 switch ( second ) {
500 case 'A': 504 case 'A':
501 if ( third == 'c' ) { 505 if ( third == 'c' ) {
502 AssemblerOutput = asmListingAsmMachine; 506 AssemblerOutput = asmListingAsmMachine;
@@ -535,34 +539,34 @@ bool VCCLCompilerTool::parseOption( const char* option )
535 AdditionalOptions += option; 539 AdditionalOptions += option;
536 break; 540 break;
537 case 'o': 541 case 'o':
538 ObjectFile = option+3; 542 ObjectFile = option+3;
539 break; 543 break;
540 case 'p': 544 case 'p':
541 PrecompiledHeaderFile = option+3; 545 PrecompiledHeaderFile = option+3;
542 break; 546 break;
543 case 'x': 547 case 'x':
544 ExpandAttributedSource = _True; 548 ExpandAttributedSource = _True;
545 break; 549 break;
546 default: 550 default:
547 return FALSE; 551 found = FALSE; break;
548 } 552 }
549 } 553 }
550 break; 554 break;
551 case 'G': 555 case 'G':
552 switch ( second ) { 556 switch ( second ) {
553 case '3': 557 case '3':
554 case '4': 558 case '4':
555 qWarning( "Option '/G3' and '/G4' were phased out in Visual C++ 5.0" ); 559 qWarning( "Option '/G3' and '/G4' were phased out in Visual C++ 5.0" );
556 return FALSE; 560 found = FALSE; break;
557 case '5': 561 case '5':
558 OptimizeForProcessor = procOptimizePentium; 562 OptimizeForProcessor = procOptimizePentium;
559 break; 563 break;
560 case '6': 564 case '6':
561 case 'B': 565 case 'B':
562 OptimizeForProcessor = procOptimizePentiumProAndAbove; 566 OptimizeForProcessor = procOptimizePentiumProAndAbove;
563 break; 567 break;
564 case 'A': 568 case 'A':
565 OptimizeForWindowsApplication = _True; 569 OptimizeForWindowsApplication = _True;
566 break; 570 break;
567 case 'F': 571 case 'F':
568 StringPooling = _True; 572 StringPooling = _True;
@@ -610,77 +614,77 @@ bool VCCLCompilerTool::parseOption( const char* option )
610 case 's': 614 case 's':
611 // Warning: following [num] is not used, 615 // Warning: following [num] is not used,
612 // were should we put it? 616 // were should we put it?
613 BufferSecurityCheck = _True; 617 BufferSecurityCheck = _True;
614 break; 618 break;
615 case 'y': 619 case 'y':
616 EnableFunctionLevelLinking = _True; 620 EnableFunctionLevelLinking = _True;
617 break; 621 break;
618 case 'z': 622 case 'z':
619 CallingConvention = callConventionStdCall; 623 CallingConvention = callConventionStdCall;
620 break; 624 break;
621 default: 625 default:
622 return FALSE; 626 found = FALSE; break;
623 } 627 }
624 break; 628 break;
625 case 'H': 629 case 'H':
626 AdditionalOptions += option; 630 AdditionalOptions += option;
627 break; 631 break;
628 case 'I': 632 case 'I':
629 AdditionalIncludeDirectories += option+2; 633 AdditionalIncludeDirectories += option+2;
630 break; 634 break;
631 case 'L': 635 case 'L':
632 if ( second == 'D' ) { 636 if ( second == 'D' ) {
633 AdditionalOptions += option; 637 AdditionalOptions += option;
634 break; 638 break;
635 } 639 }
636 return FALSE; 640 found = FALSE; break;
637 case 'M': 641 case 'M':
638 if ( second == 'D' ) { 642 if ( second == 'D' ) {
639 RuntimeLibrary = rtMultiThreadedDLL; 643 RuntimeLibrary = rtMultiThreadedDLL;
640 if ( third == 'd' ) 644 if ( third == 'd' )
641 RuntimeLibrary = rtMultiThreadedDebugDLL; 645 RuntimeLibrary = rtMultiThreadedDebugDLL;
642 break; 646 break;
643 } else if ( second == 'L' ) { 647 } else if ( second == 'L' ) {
644 RuntimeLibrary = rtSingleThreaded; 648 RuntimeLibrary = rtSingleThreaded;
645 if ( third == 'd' ) 649 if ( third == 'd' )
646 RuntimeLibrary = rtSingleThreadedDebug; 650 RuntimeLibrary = rtSingleThreadedDebug;
647 break; 651 break;
648 } else if ( second == 'T' ) { 652 } else if ( second == 'T' ) {
649 RuntimeLibrary = rtMultiThreaded; 653 RuntimeLibrary = rtMultiThreaded;
650 if ( third == 'd' ) 654 if ( third == 'd' )
651 RuntimeLibrary = rtMultiThreadedDebug; 655 RuntimeLibrary = rtMultiThreadedDebug;
652 break; 656 break;
653 } 657 }
654 return FALSE; 658 found = FALSE; break;
655 case 'O': 659 case 'O':
656 switch ( second ) { 660 switch ( second ) {
657 case '1': 661 case '1':
658 Optimization = optimizeMinSpace; 662 Optimization = optimizeMinSpace;
659 break; 663 break;
660 case '2': 664 case '2':
661 Optimization = optimizeMaxSpeed; 665 Optimization = optimizeMaxSpeed;
662 break; 666 break;
663 case 'a': 667 case 'a':
664 AdditionalOptions += option; 668 AdditionalOptions += option;
665 break; 669 break;
666 case 'b': 670 case 'b':
667 if ( third == '0' ) 671 if ( third == '0' )
668 InlineFunctionExpansion = expandDisable; 672 InlineFunctionExpansion = expandDisable;
669 else if ( third == '1' ) 673 else if ( third == '1' )
670 InlineFunctionExpansion = expandOnlyInline; 674 InlineFunctionExpansion = expandOnlyInline;
671 else if ( third == '2' ) 675 else if ( third == '2' )
672 InlineFunctionExpansion = expandAnySuitable; 676 InlineFunctionExpansion = expandAnySuitable;
673 else 677 else
674 return FALSE; 678 found = FALSE;
675 break; 679 break;
676 case 'd': 680 case 'd':
677 Optimization = optimizeDisabled; 681 Optimization = optimizeDisabled;
678 break; 682 break;
679 case 'g': 683 case 'g':
680 GlobalOptimizations = _True; 684 GlobalOptimizations = _True;
681 break; 685 break;
682 case 'i': 686 case 'i':
683 EnableIntrinsicFunctions = _True; 687 EnableIntrinsicFunctions = _True;
684 break; 688 break;
685 case 'p': 689 case 'p':
686 ImproveFloatingPointConsistency = _True; 690 ImproveFloatingPointConsistency = _True;
@@ -696,58 +700,58 @@ bool VCCLCompilerTool::parseOption( const char* option )
696 case 'w': 700 case 'w':
697 AdditionalOptions += option; 701 AdditionalOptions += option;
698 break; 702 break;
699 case 'x': 703 case 'x':
700 Optimization = optimizeFull; 704 Optimization = optimizeFull;
701 break; 705 break;
702 case 'y': 706 case 'y':
703 OmitFramePointers = _True; 707 OmitFramePointers = _True;
704 if ( third == '-' ) 708 if ( third == '-' )
705 OmitFramePointers = _False; 709 OmitFramePointers = _False;
706 break; 710 break;
707 default: 711 default:
708 return FALSE; 712 found = FALSE; break;
709 } 713 }
710 break; 714 break;
711 case 'P': 715 case 'P':
712 GeneratePreprocessedFile = preprocessYes; 716 GeneratePreprocessedFile = preprocessYes;
713 break; 717 break;
714 case 'Q': 718 case 'Q':
715 if ( second == 'I' ) { 719 if ( second == 'I' ) {
716 AdditionalOptions += option; 720 AdditionalOptions += option;
717 break; 721 break;
718 } 722 }
719 return FALSE; 723 found = FALSE; break;
720 case 'R': 724 case 'R':
721 if ( second == 'T' && third == 'C' ) { 725 if ( second == 'T' && third == 'C' ) {
722 if ( fourth == '1' ) 726 if ( fourth == '1' )
723 BasicRuntimeChecks = runtimeBasicCheckAll; 727 BasicRuntimeChecks = runtimeBasicCheckAll;
724 else if ( fourth == 'c' ) 728 else if ( fourth == 'c' )
725 SmallerTypeCheck = _True; 729 SmallerTypeCheck = _True;
726 else if ( fourth == 's' ) 730 else if ( fourth == 's' )
727 BasicRuntimeChecks = runtimeCheckStackFrame; 731 BasicRuntimeChecks = runtimeCheckStackFrame;
728 else if ( fourth == 'u' ) 732 else if ( fourth == 'u' )
729 BasicRuntimeChecks = runtimeCheckUninitVariables; 733 BasicRuntimeChecks = runtimeCheckUninitVariables;
730 else 734 else
731 return FALSE; 735 found = FALSE; break;
732 } 736 }
733 break; 737 break;
734 case 'T': 738 case 'T':
735 if ( second == 'C' ) { 739 if ( second == 'C' ) {
736 CompileAs = compileAsC; 740 CompileAs = compileAsC;
737 } else if ( second == 'P' ) { 741 } else if ( second == 'P' ) {
738 CompileAs = compileAsCPlusPlus; 742 CompileAs = compileAsCPlusPlus;
739 } else { 743 } else {
740 qWarning( "Generator: Options '/Tp<filename>' and '/Tc<filename>' are not supported by qmake" ); 744 qWarning( "Generator: Options '/Tp<filename>' and '/Tc<filename>' are not supported by qmake" );
741 return FALSE; 745 found = FALSE; break;
742 } 746 }
743 break; 747 break;
744 case 'U': 748 case 'U':
745 UndefinePreprocessorDefinitions += option+2; 749 UndefinePreprocessorDefinitions += option+2;
746 break; 750 break;
747 case 'V': 751 case 'V':
748 AdditionalOptions += option; 752 AdditionalOptions += option;
749 break; 753 break;
750 case 'W': 754 case 'W':
751 switch ( second ) { 755 switch ( second ) {
752 case 'a': 756 case 'a':
753 case '4': 757 case '4':
@@ -769,25 +773,25 @@ bool VCCLCompilerTool::parseOption( const char* option )
769 AdditionalOptions += option; 773 AdditionalOptions += option;
770 break; 774 break;
771 case 'X': 775 case 'X':
772 WarnAsError = _True; 776 WarnAsError = _True;
773 break; 777 break;
774 case 'p': 778 case 'p':
775 if ( third == '6' && fourth == '4' ) { 779 if ( third == '6' && fourth == '4' ) {
776 Detect64BitPortabilityProblems = _True; 780 Detect64BitPortabilityProblems = _True;
777 break; 781 break;
778 } 782 }
779 // Fallthrough 783 // Fallthrough
780 default: 784 default:
781 return FALSE; 785 found = FALSE; break;
782 } 786 }
783 break; 787 break;
784 case 'X': 788 case 'X':
785 IgnoreStandardIncludePath = _True; 789 IgnoreStandardIncludePath = _True;
786 break; 790 break;
787 case 'Y': 791 case 'Y':
788 switch ( second ) { 792 switch ( second ) {
789 case '\0': 793 case '\0':
790 case '-': 794 case '-':
791 AdditionalOptions += option; 795 AdditionalOptions += option;
792 break; 796 break;
793 case 'X': 797 case 'X':
@@ -798,25 +802,25 @@ bool VCCLCompilerTool::parseOption( const char* option )
798 UsePrecompiledHeader = pchCreateUsingSpecific; 802 UsePrecompiledHeader = pchCreateUsingSpecific;
799 PrecompiledHeaderFile = option+3; 803 PrecompiledHeaderFile = option+3;
800 break; 804 break;
801 case 'd': 805 case 'd':
802 case 'l': 806 case 'l':
803 AdditionalOptions =+ option; 807 AdditionalOptions =+ option;
804 break; 808 break;
805 case 'u': 809 case 'u':
806 UsePrecompiledHeader = pchUseUsingSpecific; 810 UsePrecompiledHeader = pchUseUsingSpecific;
807 PrecompiledHeaderFile = option+3; 811 PrecompiledHeaderFile = option+3;
808 break; 812 break;
809 default: 813 default:
810 return FALSE; 814 found = FALSE; break;
811 } 815 }
812 break; 816 break;
813 case 'Z': 817 case 'Z':
814 switch ( second ) { 818 switch ( second ) {
815 case '7': 819 case '7':
816 DebugInformationFormat = debugOldStyleInfo; 820 DebugInformationFormat = debugOldStyleInfo;
817 break; 821 break;
818 case 'I': 822 case 'I':
819 DebugInformationFormat = debugEditAndContinue; 823 DebugInformationFormat = debugEditAndContinue;
820 break; 824 break;
821 case 'd': 825 case 'd':
822 DebugInformationFormat = debugLineInfoOnly; 826 DebugInformationFormat = debugLineInfoOnly;
@@ -831,27 +835,27 @@ bool VCCLCompilerTool::parseOption( const char* option )
831 DisableLanguageExtensions = _True; 835 DisableLanguageExtensions = _True;
832 break; 836 break;
833 case 'e': 837 case 'e':
834 DisableLanguageExtensions = _False; 838 DisableLanguageExtensions = _False;
835 break; 839 break;
836 case 'c': 840 case 'c':
837 if ( third == ':' ) { 841 if ( third == ':' ) {
838 if ( fourth == 'f' ) 842 if ( fourth == 'f' )
839 ForceConformanceInForLoopScope = _True; 843 ForceConformanceInForLoopScope = _True;
840 else if ( fourth == 'w' ) 844 else if ( fourth == 'w' )
841 TreatWChar_tAsBuiltInType = _True; 845 TreatWChar_tAsBuiltInType = _True;
842 else 846 else
843 return FALSE; 847 found = FALSE;
844 } else { 848 } else {
845 return FALSE; 849 found = FALSE; break;
846 } 850 }
847 break; 851 break;
848 case 'g': 852 case 'g':
849 case 'm': 853 case 'm':
850 case 's': 854 case 's':
851 AdditionalOptions += option; 855 AdditionalOptions += option;
852 break; 856 break;
853 case 'p': 857 case 'p':
854 switch ( third ) 858 switch ( third )
855 { 859 {
856 case '\0': 860 case '\0':
857 case '1': 861 case '1':
@@ -860,90 +864,93 @@ bool VCCLCompilerTool::parseOption( const char* option )
860 StructMemberAlignment = alignSixteenBytes; 864 StructMemberAlignment = alignSixteenBytes;
861 break; 865 break;
862 case '2': 866 case '2':
863 StructMemberAlignment = alignTwoBytes; 867 StructMemberAlignment = alignTwoBytes;
864 break; 868 break;
865 case '4': 869 case '4':
866 StructMemberAlignment = alignFourBytes; 870 StructMemberAlignment = alignFourBytes;
867 break; 871 break;
868 case '8': 872 case '8':
869 StructMemberAlignment = alignEightBytes; 873 StructMemberAlignment = alignEightBytes;
870 break; 874 break;
871 default: 875 default:
872 return FALSE; 876 found = FALSE; break;
873 } 877 }
874 break; 878 break;
875 default: 879 default:
876 return FALSE; 880 found = FALSE; break;
877 } 881 }
878 break; 882 break;
879 case 'c': 883 case 'c':
880 if ( second == '\0' ) { 884 if ( second == '\0' ) {
881 CompileOnly = _True; 885 CompileOnly = _True;
882 } else if ( second == 'l' ) { 886 } else if ( second == 'l' ) {
883 if ( *(option+5) == 'n' ) { 887 if ( *(option+5) == 'n' ) {
884 CompileAsManaged = managedAssembly; 888 CompileAsManaged = managedAssembly;
885 TurnOffAssemblyGeneration = _True; 889 TurnOffAssemblyGeneration = _True;
886 } else { 890 } else {
887 CompileAsManaged = managedAssembly; 891 CompileAsManaged = managedAssembly;
888 } 892 }
889 } else { 893 } else {
890 return FALSE; 894 found = FALSE; break;
891 } 895 }
892 break; 896 break;
893 case 'd': 897 case 'd':
894 if ( second != 'r' ) 898 if ( second != 'r' ) {
895 return FALSE; 899 found = FALSE; break;
900 }
896 CompileAsManaged = managedAssembly; 901 CompileAsManaged = managedAssembly;
897 break; 902 break;
898 case 'n': 903 case 'n':
899 if ( second == 'o' && third == 'B' && fourth == 'o' ) { 904 if ( second == 'o' && third == 'B' && fourth == 'o' ) {
900 AdditionalOptions += "/noBool"; 905 AdditionalOptions += "/noBool";
901 break; 906 break;
902 } 907 }
903 if ( second == 'o' && third == 'l' && fourth == 'o' ) { 908 if ( second == 'o' && third == 'l' && fourth == 'o' ) {
904 SuppressStartupBanner = _True; 909 SuppressStartupBanner = _True;
905 break; 910 break;
906 } 911 }
907 return FALSE; 912 found = FALSE; break;
908 case 's': 913 case 's':
909 if ( second == 'h' && third == 'o' && fourth == 'w' ) { 914 if ( second == 'h' && third == 'o' && fourth == 'w' ) {
910 ShowIncludes = _True; 915 ShowIncludes = _True;
911 break; 916 break;
912 } 917 }
913 return FALSE; 918 found = FALSE; break;
914 case 'u': 919 case 'u':
915 UndefineAllPreprocessorDefinitions = _True; 920 UndefineAllPreprocessorDefinitions = _True;
916 break; 921 break;
917 case 'v': 922 case 'v':
918 if ( second == 'd' || second == 'm' ) { 923 if ( second == 'd' || second == 'm' ) {
919 AdditionalOptions += option; 924 AdditionalOptions += option;
920 break; 925 break;
921 } 926 }
922 return FALSE; 927 found = FALSE; break;
923 case 'w': 928 case 'w':
924 switch ( second ) { 929 switch ( second ) {
925 case '\0': 930 case '\0':
926 WarningLevel = warningLevel_0; 931 WarningLevel = warningLevel_0;
927 break; 932 break;
928 case 'd': 933 case 'd':
929 DisableSpecificWarnings += option+3; 934 DisableSpecificWarnings += option+3;
930 break; 935 break;
931 default: 936 default:
932 AdditionalOptions += option; 937 AdditionalOptions += option;
933 } 938 }
934 break; 939 break;
935 default: 940 default:
936 return FALSE; 941 found = FALSE; break;
937 } 942 }
943 if( !found )
944 warn_msg( WarnLogic, "Could not parse Compiler option: %s", option );
938 return TRUE; 945 return TRUE;
939} 946}
940 947
941// VCLinkerTool ----------------------------------------------------- 948// VCLinkerTool -----------------------------------------------------
942VCLinkerTool::VCLinkerTool() 949VCLinkerTool::VCLinkerTool()
943 :EnableCOMDATFolding( optFoldingDefault ), 950 :EnableCOMDATFolding( optFoldingDefault ),
944 GenerateDebugInformation( unset ), 951 GenerateDebugInformation( unset ),
945 GenerateMapFile( unset ), 952 GenerateMapFile( unset ),
946 HeapCommitSize( -1 ), 953 HeapCommitSize( -1 ),
947 HeapReserveSize( -1 ), 954 HeapReserveSize( -1 ),
948 IgnoreAllDefaultLibraries( unset ), 955 IgnoreAllDefaultLibraries( unset ),
949 IgnoreEmbeddedIDL( unset ), 956 IgnoreEmbeddedIDL( unset ),
@@ -971,25 +978,25 @@ VCLinkerTool::VCLinkerTool()
971 TerminalServerAware( termSvrAwareDefault ), 978 TerminalServerAware( termSvrAwareDefault ),
972 TurnOffAssemblyGeneration( unset ), 979 TurnOffAssemblyGeneration( unset ),
973 TypeLibraryResourceID( 0 ) 980 TypeLibraryResourceID( 0 )
974{ 981{
975} 982}
976 983
977QTextStream &operator<<( QTextStream &strm, const VCLinkerTool &tool ) 984QTextStream &operator<<( QTextStream &strm, const VCLinkerTool &tool )
978{ 985{
979 strm << _begTool3; 986 strm << _begTool3;
980 strm << _VCLinkerToolName; 987 strm << _VCLinkerToolName;
981 strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies, " " ); 988 strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies, " " );
982 strm << XPair( _AdditionalLibraryDirectories, tool.AdditionalLibraryDirectories ); 989 strm << XPair( _AdditionalLibraryDirectories, tool.AdditionalLibraryDirectories );
983 strm << XPair( _AdditionalOptions, tool.AdditionalOptions ); 990 strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
984 strm << XPair( _AddModuleNamesToAssembly, tool.AddModuleNamesToAssembly ); 991 strm << XPair( _AddModuleNamesToAssembly, tool.AddModuleNamesToAssembly );
985 strm << SPair( _BaseAddress, tool.BaseAddress ); 992 strm << SPair( _BaseAddress, tool.BaseAddress );
986 strm << XPair( _DelayLoadDLLs, tool.DelayLoadDLLs ); 993 strm << XPair( _DelayLoadDLLs, tool.DelayLoadDLLs );
987 if ( tool.EnableCOMDATFolding != optFoldingDefault ) strm << EPair( _EnableCOMDATFolding, tool.EnableCOMDATFolding ); 994 if ( tool.EnableCOMDATFolding != optFoldingDefault ) strm << EPair( _EnableCOMDATFolding, tool.EnableCOMDATFolding );
988 strm << SPair( _EntryPointSymbol, tool.EntryPointSymbol ); 995 strm << SPair( _EntryPointSymbol, tool.EntryPointSymbol );
989 strm << XPair( _ForceSymbolReferences, tool.ForceSymbolReferences ); 996 strm << XPair( _ForceSymbolReferences, tool.ForceSymbolReferences );
990 strm << SPair( _FunctionOrder, tool.FunctionOrder ); 997 strm << SPair( _FunctionOrder, tool.FunctionOrder );
991 strm << TPair( _GenerateDebugInformation, tool.GenerateDebugInformation ); 998 strm << TPair( _GenerateDebugInformation, tool.GenerateDebugInformation );
992 strm << TPair( _GenerateMapFile, tool.GenerateMapFile ); 999 strm << TPair( _GenerateMapFile, tool.GenerateMapFile );
993 if ( tool.HeapCommitSize != -1 ) strm << LPair( _HeapCommitSize, tool.HeapCommitSize ); 1000 if ( tool.HeapCommitSize != -1 ) strm << LPair( _HeapCommitSize, tool.HeapCommitSize );
994 if ( tool.HeapReserveSize != -1 ) strm << LPair( _HeapReserveSize, tool.HeapReserveSize ); 1001 if ( tool.HeapReserveSize != -1 ) strm << LPair( _HeapReserveSize, tool.HeapReserveSize );
995 strm << TPair( _IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries ); 1002 strm << TPair( _IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries );
@@ -1051,63 +1058,67 @@ static uint elfHash( const char* name )
1051 (*k)!=',' && 1058 (*k)!=',' &&
1052 (*k)!=' ' ) { 1059 (*k)!=' ' ) {
1053 h = ( h << 4 ) + *k++; 1060 h = ( h << 4 ) + *k++;
1054 if ( (g = (h & 0xf0000000)) != 0 ) 1061 if ( (g = (h & 0xf0000000)) != 0 )
1055 h ^= g >> 24; 1062 h ^= g >> 24;
1056 h &= ~g; 1063 h &= ~g;
1057 } 1064 }
1058 } 1065 }
1059 if ( !h ) 1066 if ( !h )
1060 h = 1; 1067 h = 1;
1061 return h; 1068 return h;
1062} 1069}
1070
1071//#define USE_DISPLAY_HASH
1072#ifdef USE_DISPLAY_HASH
1063static void displayHash( const char* str ) 1073static void displayHash( const char* str )
1064{ 1074{
1065 printf( "case 0x%07x: // %s\n break;\n", elfHash(str), str ); 1075 printf( "case 0x%07x: // %s\n break;\n", elfHash(str), str );
1066} 1076}
1077#endif
1067 1078
1068bool VCLinkerTool::parseOption( const char* option ) 1079bool VCLinkerTool::parseOption( const char* option )
1069{ 1080{
1070#if 0 1081#ifdef USE_DISPLAY_HASH
1071 // Main options 1082 // Main options
1072 displayHash( "/ALIGN" ); displayHash( "/ALLOWBIND" ); displayHash( "/ASSEMBLYMODULE" ); 1083 displayHash( "/ALIGN" ); displayHash( "/ALLOWBIND" ); displayHash( "/ASSEMBLYMODULE" );
1073 displayHash( "/ASSEMBLYRESOURCE" ); displayHash( "/BASE" ); displayHash( "/DEBUG" ); 1084 displayHash( "/ASSEMBLYRESOURCE" ); displayHash( "/BASE" ); displayHash( "/DEBUG" );
1074 displayHash( "/DEF" ); displayHash( "/DEFAULTLIB" ); displayHash( "/DELAY" ); 1085 displayHash( "/DEF" ); displayHash( "/DEFAULTLIB" ); displayHash( "/DELAY" );
1075 displayHash( "/DELAYLOAD" ); displayHash( "/DLL" ); displayHash( "/DRIVER" ); 1086 displayHash( "/DELAYLOAD" ); displayHash( "/DLL" ); displayHash( "/DRIVER" );
1076 displayHash( "/ENTRY" ); displayHash( "/EXETYPE" ); displayHash( "/EXPORT" ); 1087 displayHash( "/ENTRY" ); displayHash( "/EXETYPE" ); displayHash( "/EXPORT" );
1077 displayHash( "/FIXED" ); displayHash( "/FORCE" ); displayHash( "/HEAP" ); 1088 displayHash( "/FIXED" ); displayHash( "/FORCE" ); displayHash( "/HEAP" );
1078 displayHash( "/IDLOUT" ); displayHash( "/IGNOREIDL" ); displayHash( "/IMPLIB" ); 1089 displayHash( "/IDLOUT" ); displayHash( "/IGNOREIDL" ); displayHash( "/IMPLIB" );
1079 displayHash( "/INCLUDE" ); displayHash( "/INCREMENTAL" ); displayHash( "/LARGEADDRESSAWARE" ); 1090 displayHash( "/INCLUDE" ); displayHash( "/INCREMENTAL" ); displayHash( "/LARGEADDRESSAWARE" );
1080 displayHash( "/LIBPATH" ); displayHash( "/LTCG" ); displayHash( "/MACHINE" ); 1091 displayHash( "/LIBPATH" ); displayHash( "/LTCG" ); displayHash( "/MACHINE" );
1081 displayHash( "/MAP" ); displayHash( "/MAPINFO" ); displayHash( "/MERGE" ); 1092 displayHash( "/MAP" ); displayHash( "/MAPINFO" ); displayHash( "/MERGE" );
1082 displayHash( "/MIDL" ); displayHash( "/NOASSEMBLY" ); displayHash( "/NODEFAULTLIB" ); 1093 displayHash( "/MIDL" ); displayHash( "/NOASSEMBLY" ); displayHash( "/NODEFAULTLIB" );
1083 displayHash( "/NOENTRY" ); displayHash( "/NOLOGO" ); displayHash( "/OPT" ); 1094 displayHash( "/NOENTRY" ); displayHash( "/NOLOGO" ); displayHash( "/OPT" );
1084 displayHash( "/ORDER" ); displayHash( "/OUT" ); displayHash( "/PDB" ); 1095 displayHash( "/ORDER" ); displayHash( "/OUT" ); displayHash( "/PDB" );
1085 displayHash( "/PDBSTRIPPED" ); displayHash( "/RELEASE" ); displayHash( "/SECTION" ); 1096 displayHash( "/PDBSTRIPPED" ); displayHash( "/RELEASE" ); displayHash( "/SECTION" );
1086 displayHash( "/STACK" ); displayHash( "/STUB" ); displayHash( "/SUBSYSTEM" ); 1097 displayHash( "/STACK" ); displayHash( "/STUB" ); displayHash( "/SUBSYSTEM" );
1087 displayHash( "/SWAPRUN" ); displayHash( "/TLBID" ); displayHash( "/TLBOUT" ); 1098 displayHash( "/SWAPRUN" ); displayHash( "/TLBID" ); displayHash( "/TLBOUT" );
1088 displayHash( "/TSAWARE" ); displayHash( "/VERBOSE" ); displayHash( "/VERSION" ); 1099 displayHash( "/TSAWARE" ); displayHash( "/VERBOSE" ); displayHash( "/VERSION" );
1089 displayHash( "/VXD" ); displayHash( "/WS " ); 1100 displayHash( "/VXD" ); displayHash( "/WS " );
1090#endif 1101#endif
1091#if 0 1102#ifdef USE_DISPLAY_HASH
1092 // Sub options 1103 // Sub options
1093 displayHash( "UNLOAD" ); displayHash( "NOBIND" ); displayHash( "no" ); displayHash( "NOSTATUS" ); displayHash( "STATUS" ); 1104 displayHash( "UNLOAD" ); displayHash( "NOBIND" ); displayHash( "no" ); displayHash( "NOSTATUS" ); displayHash( "STATUS" );
1094 displayHash( "AM33" ); displayHash( "ARM" ); displayHash( "CEE" ); displayHash( "IA64" ); displayHash( "X86" ); displayHash( "M32R" ); 1105 displayHash( "AM33" ); displayHash( "ARM" ); displayHash( "CEE" ); displayHash( "IA64" ); displayHash( "X86" ); displayHash( "M32R" );
1095 displayHash( "MIPS" ); displayHash( "MIPS16" ); displayHash( "MIPSFPU" ); displayHash( "MIPSFPU16" ); displayHash( "MIPSR41XX" ); displayHash( "PPC" ); 1106 displayHash( "MIPS" ); displayHash( "MIPS16" ); displayHash( "MIPSFPU" ); displayHash( "MIPSFPU16" ); displayHash( "MIPSR41XX" ); displayHash( "PPC" );
1096 displayHash( "SH3" ); displayHash( "SH4" ); displayHash( "SH5" ); displayHash( "THUMB" ); displayHash( "TRICORE" ); displayHash( "EXPORTS" ); 1107 displayHash( "SH3" ); displayHash( "SH4" ); displayHash( "SH5" ); displayHash( "THUMB" ); displayHash( "TRICORE" ); displayHash( "EXPORTS" );
1097 displayHash( "LINES" ); displayHash( "REF" ); displayHash( "NOREF" ); displayHash( "ICF" ); displayHash( "WIN98" ); displayHash( "NOWIN98" ); 1108 displayHash( "LINES" ); displayHash( "REF" ); displayHash( "NOREF" ); displayHash( "ICF" ); displayHash( "WIN98" ); displayHash( "NOWIN98" );
1098 displayHash( "CONSOLE" ); displayHash( "EFI_APPLICATION" ); displayHash( "EFI_BOOT_SERVICE_DRIVER" ); displayHash( "EFI_ROM" ); displayHash( "EFI_RUNTIME_DRIVER" ); displayHash( "NATIVE" ); 1109 displayHash( "CONSOLE" ); displayHash( "EFI_APPLICATION" ); displayHash( "EFI_BOOT_SERVICE_DRIVER" ); displayHash( "EFI_ROM" ); displayHash( "EFI_RUNTIME_DRIVER" ); displayHash( "NATIVE" );
1099 displayHash( "POSIX" ); displayHash( "WINDOWS" ); displayHash( "WINDOWSCE" ); displayHash( "NET" ); displayHash( "CD" ); displayHash( "NO" ); 1110 displayHash( "POSIX" ); displayHash( "WINDOWS" ); displayHash( "WINDOWSCE" ); displayHash( "NET" ); displayHash( "CD" ); displayHash( "NO" );
1100#endif 1111#endif
1101 1112 bool found = TRUE;
1102 switch ( elfHash(option) ) { 1113 switch ( elfHash(option) ) {
1103 case 0x3360dbe: // /ALIGN[:number] 1114 case 0x3360dbe: // /ALIGN[:number]
1104 case 0x1485c34: // /ALLOWBIND[:NO] 1115 case 0x1485c34: // /ALLOWBIND[:NO]
1105 case 0x6b21972: // /DEFAULTLIB:library 1116 case 0x6b21972: // /DEFAULTLIB:library
1106 case 0x396ea92: // /DRIVER[:UPONLY | :WDM] 1117 case 0x396ea92: // /DRIVER[:UPONLY | :WDM]
1107 case 0xaca9d75: // /EXETYPE[:DYNAMIC | :DEV386] 1118 case 0xaca9d75: // /EXETYPE[:DYNAMIC | :DEV386]
1108 case 0x3ad5444: // /EXPORT:entryname[,@ordinal[,NONAME]][,DATA] 1119 case 0x3ad5444: // /EXPORT:entryname[,@ordinal[,NONAME]][,DATA]
1109 case 0x33aec94: // /FIXED[:NO] 1120 case 0x33aec94: // /FIXED[:NO]
1110 case 0x33b4675: // /FORCE:[MULTIPLE|UNRESOLVED] 1121 case 0x33b4675: // /FORCE:[MULTIPLE|UNRESOLVED]
1111 case 0x7988f7e: // /SECTION:name,[E][R][W][S][D][K][L][P][X][,ALIGN=#] 1122 case 0x7988f7e: // /SECTION:name,[E][R][W][S][D][K][L][P][X][,ALIGN=#]
1112 case 0x0348992: // /STUB:filename 1123 case 0x0348992: // /STUB:filename
1113 case 0x0034bc4: // /VXD 1124 case 0x0034bc4: // /VXD
@@ -1207,25 +1218,25 @@ bool VCLinkerTool::parseOption( const char* option )
1207 case 0x0005543: // PPC 1218 case 0x0005543: // PPC
1208 case 0x00057b3: // SH3 1219 case 0x00057b3: // SH3
1209 case 0x00057b4: // SH4 1220 case 0x00057b4: // SH4
1210 case 0x00057b5: // SH5 1221 case 0x00057b5: // SH5
1211 case 0x058da12: // THUMB 1222 case 0x058da12: // THUMB
1212 case 0x96d8435: // TRICORE 1223 case 0x96d8435: // TRICORE
1213 AdditionalOptions += option; 1224 AdditionalOptions += option;
1214 break; 1225 break;
1215 case 0x0005bb6: // X86 1226 case 0x0005bb6: // X86
1216 TargetMachine = machineX86; 1227 TargetMachine = machineX86;
1217 break; 1228 break;
1218 default: 1229 default:
1219 return FALSE; 1230 found = FALSE;
1220 } 1231 }
1221 break; 1232 break;
1222 case 0x0034160: // /MAP[:filename] 1233 case 0x0034160: // /MAP[:filename]
1223 GenerateMapFile = _True; 1234 GenerateMapFile = _True;
1224 MapFileName = option+5; 1235 MapFileName = option+5;
1225 break; 1236 break;
1226 case 0x164e1ef: // /MAPINFO:{EXPORTS|LINES} 1237 case 0x164e1ef: // /MAPINFO:{EXPORTS|LINES}
1227 if ( *(option+9) == 'E' ) 1238 if ( *(option+9) == 'E' )
1228 MapExports = _True; 1239 MapExports = _True;
1229 else if ( *(option+9) == 'L' ) 1240 else if ( *(option+9) == 'L' )
1230 MapLines = _True; 1241 MapLines = _True;
1231 break; 1242 break;
@@ -1266,25 +1277,25 @@ bool VCLinkerTool::parseOption( const char* option )
1266 OptimizeReferences = optNoReferences; 1277 OptimizeReferences = optNoReferences;
1267 break; 1278 break;
1268 case 'I': // NOICF 1279 case 'I': // NOICF
1269 EnableCOMDATFolding = optNoFolding; 1280 EnableCOMDATFolding = optNoFolding;
1270 break; 1281 break;
1271 case 'N': // WIN98 1282 case 'N': // WIN98
1272 OptimizeForWindows98 = optWin98Yes; 1283 OptimizeForWindows98 = optWin98Yes;
1273 break; 1284 break;
1274 case 'W': // NOWIN98 1285 case 'W': // NOWIN98
1275 OptimizeForWindows98 = optWin98No; 1286 OptimizeForWindows98 = optWin98No;
1276 break; 1287 break;
1277 default: 1288 default:
1278 return FALSE; 1289 found = FALSE;
1279 } 1290 }
1280 } 1291 }
1281 break; 1292 break;
1282 case 0x34468a2: // /ORDER:@filename 1293 case 0x34468a2: // /ORDER:@filename
1283 FunctionOrder = option+8; 1294 FunctionOrder = option+8;
1284 break; 1295 break;
1285 case 0x00344a4: // /OUT:filename 1296 case 0x00344a4: // /OUT:filename
1286 OutputFile = option+5; 1297 OutputFile = option+5;
1287 break; 1298 break;
1288 case 0x0034482: // /PDB:filename 1299 case 0x0034482: // /PDB:filename
1289 ProgramDatabaseFile = option+5; 1300 ProgramDatabaseFile = option+5;
1290 break; 1301 break;
@@ -1315,35 +1326,35 @@ bool VCLinkerTool::parseOption( const char* option )
1315 break; 1326 break;
1316 // The following are undocumented, so add them to AdditionalOptions 1327 // The following are undocumented, so add them to AdditionalOptions
1317 case 0x240949e: // EFI_APPLICATION 1328 case 0x240949e: // EFI_APPLICATION
1318 case 0xe617652: // EFI_BOOT_SERVICE_DRIVER 1329 case 0xe617652: // EFI_BOOT_SERVICE_DRIVER
1319 case 0x9af477d: // EFI_ROM 1330 case 0x9af477d: // EFI_ROM
1320 case 0xd34df42: // EFI_RUNTIME_DRIVER 1331 case 0xd34df42: // EFI_RUNTIME_DRIVER
1321 case 0x5268ea5: // NATIVE 1332 case 0x5268ea5: // NATIVE
1322 case 0x05547e8: // POSIX 1333 case 0x05547e8: // POSIX
1323 case 0x2949c95: // WINDOWSCE 1334 case 0x2949c95: // WINDOWSCE
1324 AdditionalOptions += option; 1335 AdditionalOptions += option;
1325 break; 1336 break;
1326 default: 1337 default:
1327 return FALSE; 1338 found = FALSE;
1328 } 1339 }
1329 } 1340 }
1330 break; 1341 break;
1331 case 0x8b654de: // /SWAPRUN:{NET | CD} 1342 case 0x8b654de: // /SWAPRUN:{NET | CD}
1332 if ( *(option+9) == 'N' ) 1343 if ( *(option+9) == 'N' )
1333 SwapRunFromNet = _True; 1344 SwapRunFromNet = _True;
1334 else if ( *(option+9) == 'C' ) 1345 else if ( *(option+9) == 'C' )
1335 SwapRunFromCD = _True; 1346 SwapRunFromCD = _True;
1336 else 1347 else
1337 return FALSE; 1348 found = FALSE;
1338 break; 1349 break;
1339 case 0x34906d4: // /TLBID:id 1350 case 0x34906d4: // /TLBID:id
1340 TypeLibraryResourceID = QString( option+7 ).toLong(); 1351 TypeLibraryResourceID = QString( option+7 ).toLong();
1341 break; 1352 break;
1342 case 0x4907494: // /TLBOUT:[path\]filename 1353 case 0x4907494: // /TLBOUT:[path\]filename
1343 TypeLibraryFile = option+8; 1354 TypeLibraryFile = option+8;
1344 break; 1355 break;
1345 case 0x976b525: // /TSAWARE[:NO] 1356 case 0x976b525: // /TSAWARE[:NO]
1346 if ( *(option+8) == ':' ) 1357 if ( *(option+8) == ':' )
1347 TerminalServerAware = termSvrAwareNo; 1358 TerminalServerAware = termSvrAwareNo;
1348 else 1359 else
1349 TerminalServerAware = termSvrAwareYes; 1360 TerminalServerAware = termSvrAwareYes;
@@ -1351,27 +1362,29 @@ bool VCLinkerTool::parseOption( const char* option )
1351 case 0xaa67735: // /VERBOSE[:lib] 1362 case 0xaa67735: // /VERBOSE[:lib]
1352 if ( *(option+9) == ':' ) { 1363 if ( *(option+9) == ':' ) {
1353 ShowProgress = linkProgressLibs; 1364 ShowProgress = linkProgressLibs;
1354 AdditionalOptions += option; 1365 AdditionalOptions += option;
1355 } else { 1366 } else {
1356 ShowProgress = linkProgressAll; 1367 ShowProgress = linkProgressAll;
1357 } 1368 }
1358 break; 1369 break;
1359 case 0xaa77f7e: // /VERSION:major[.minor] 1370 case 0xaa77f7e: // /VERSION:major[.minor]
1360 Version = option+9; 1371 Version = option+9;
1361 break; 1372 break;
1362 default: 1373 default:
1363 return FALSE; 1374 found = FALSE;
1364 } 1375 }
1365 return TRUE; 1376 if( !found )
1377 warn_msg( WarnLogic, "Could not parse Linker options: %s", option );
1378 return found;
1366} 1379}
1367 1380
1368// VCMIDLTool ------------------------------------------------------- 1381// VCMIDLTool -------------------------------------------------------
1369VCMIDLTool::VCMIDLTool() 1382VCMIDLTool::VCMIDLTool()
1370 :DefaultCharType( midlCharUnsigned ), 1383 :DefaultCharType( midlCharUnsigned ),
1371 EnableErrorChecks( midlDisableAll ), 1384 EnableErrorChecks( midlDisableAll ),
1372 ErrorCheckAllocations( unset ), 1385 ErrorCheckAllocations( unset ),
1373 ErrorCheckBounds( unset ), 1386 ErrorCheckBounds( unset ),
1374 ErrorCheckEnumRange( unset ), 1387 ErrorCheckEnumRange( unset ),
1375 ErrorCheckRefPointers( unset ), 1388 ErrorCheckRefPointers( unset ),
1376 ErrorCheckStubData( unset ), 1389 ErrorCheckStubData( unset ),
1377 GenerateStublessProxies( unset ), 1390 GenerateStublessProxies( unset ),
@@ -1383,25 +1396,25 @@ VCMIDLTool::VCMIDLTool()
1383 TargetEnvironment( midlTargetNotSet ), 1396 TargetEnvironment( midlTargetNotSet ),
1384 ValidateParameters( unset ), 1397 ValidateParameters( unset ),
1385 WarnAsError( unset ), 1398 WarnAsError( unset ),
1386 WarningLevel( midlWarningLevel_0 ) 1399 WarningLevel( midlWarningLevel_0 )
1387{ 1400{
1388} 1401}
1389 1402
1390QTextStream &operator<<( QTextStream &strm, const VCMIDLTool &tool ) 1403QTextStream &operator<<( QTextStream &strm, const VCMIDLTool &tool )
1391{ 1404{
1392 strm << _begTool3; 1405 strm << _begTool3;
1393 strm << _VCMIDLToolName; 1406 strm << _VCMIDLToolName;
1394 strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories ); 1407 strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories );
1395 strm << XPair( _AdditionalOptions, tool.AdditionalOptions ); 1408 strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
1396 strm << XPair( _CPreprocessOptions, tool.CPreprocessOptions ); 1409 strm << XPair( _CPreprocessOptions, tool.CPreprocessOptions );
1397 strm << EPair( _DefaultCharType, tool.DefaultCharType ); 1410 strm << EPair( _DefaultCharType, tool.DefaultCharType );
1398 strm << SPair( _DLLDataFileName, tool.DLLDataFileName ); 1411 strm << SPair( _DLLDataFileName, tool.DLLDataFileName );
1399 strm << EPair( _EnableErrorChecks, tool.EnableErrorChecks ); 1412 strm << EPair( _EnableErrorChecks, tool.EnableErrorChecks );
1400 strm << TPair( _ErrorCheckAllocations, tool.ErrorCheckAllocations ); 1413 strm << TPair( _ErrorCheckAllocations, tool.ErrorCheckAllocations );
1401 strm << TPair( _ErrorCheckBounds, tool.ErrorCheckBounds ); 1414 strm << TPair( _ErrorCheckBounds, tool.ErrorCheckBounds );
1402 strm << TPair( _ErrorCheckEnumRange, tool.ErrorCheckEnumRange ); 1415 strm << TPair( _ErrorCheckEnumRange, tool.ErrorCheckEnumRange );
1403 strm << TPair( _ErrorCheckRefPointers, tool.ErrorCheckRefPointers ); 1416 strm << TPair( _ErrorCheckRefPointers, tool.ErrorCheckRefPointers );
1404 strm << TPair( _ErrorCheckStubData, tool.ErrorCheckStubData ); 1417 strm << TPair( _ErrorCheckStubData, tool.ErrorCheckStubData );
1405 strm << XPair( _FullIncludePath, tool.FullIncludePath ); 1418 strm << XPair( _FullIncludePath, tool.FullIncludePath );
1406 strm << TPair( _GenerateStublessProxies, tool.GenerateStublessProxies ); 1419 strm << TPair( _GenerateStublessProxies, tool.GenerateStublessProxies );
1407 strm << TPair( _GenerateTypeLibrary, tool.GenerateTypeLibrary ); 1420 strm << TPair( _GenerateTypeLibrary, tool.GenerateTypeLibrary );
@@ -1418,25 +1431,25 @@ QTextStream &operator<<( QTextStream &strm, const VCMIDLTool &tool )
1418 if ( tool.TargetEnvironment != midlTargetNotSet ) strm << EPair( _TargetEnvironment, tool.TargetEnvironment ); 1431 if ( tool.TargetEnvironment != midlTargetNotSet ) strm << EPair( _TargetEnvironment, tool.TargetEnvironment );
1419 strm << SPair( _TypeLibraryName, tool.TypeLibraryName ); 1432 strm << SPair( _TypeLibraryName, tool.TypeLibraryName );
1420 strm << XPair( _UndefinePreprocessorDefinitions, tool.UndefinePreprocessorDefinitions ); 1433 strm << XPair( _UndefinePreprocessorDefinitions, tool.UndefinePreprocessorDefinitions );
1421 strm << TPair( _ValidateParameters, tool.ValidateParameters ); 1434 strm << TPair( _ValidateParameters, tool.ValidateParameters );
1422 strm << TPair( _WarnAsError, tool.WarnAsError ); 1435 strm << TPair( _WarnAsError, tool.WarnAsError );
1423 strm << EPair( _WarningLevel, tool.WarningLevel ); 1436 strm << EPair( _WarningLevel, tool.WarningLevel );
1424 strm << "/>"; 1437 strm << "/>";
1425 return strm; 1438 return strm;
1426} 1439}
1427 1440
1428bool VCMIDLTool::parseOption( const char* option ) 1441bool VCMIDLTool::parseOption( const char* option )
1429{ 1442{
1430#if 0 1443#ifdef USE_DISPLAY_HASH
1431 displayHash( "/D name[=def]" ); displayHash( "/I directory-list" ); displayHash( "/Oi" ); 1444 displayHash( "/D name[=def]" ); displayHash( "/I directory-list" ); displayHash( "/Oi" );
1432 displayHash( "/Oic" ); displayHash( "/Oicf" ); displayHash( "/Oif" ); displayHash( "/Os" ); 1445 displayHash( "/Oic" ); displayHash( "/Oicf" ); displayHash( "/Oif" ); displayHash( "/Os" );
1433 displayHash( "/U name" ); displayHash( "/WX" ); displayHash( "/W{0|1|2|3|4}" ); 1446 displayHash( "/U name" ); displayHash( "/WX" ); displayHash( "/W{0|1|2|3|4}" );
1434 displayHash( "/Zp {N}" ); displayHash( "/Zs" ); displayHash( "/acf filename" ); 1447 displayHash( "/Zp {N}" ); displayHash( "/Zs" ); displayHash( "/acf filename" );
1435 displayHash( "/align {N}" ); displayHash( "/app_config" ); displayHash( "/c_ext" ); 1448 displayHash( "/align {N}" ); displayHash( "/app_config" ); displayHash( "/c_ext" );
1436 displayHash( "/char ascii7" ); displayHash( "/char signed" ); displayHash( "/char unsigned" ); 1449 displayHash( "/char ascii7" ); displayHash( "/char signed" ); displayHash( "/char unsigned" );
1437 displayHash( "/client none" ); displayHash( "/client stub" ); displayHash( "/confirm" ); 1450 displayHash( "/client none" ); displayHash( "/client stub" ); displayHash( "/confirm" );
1438 displayHash( "/cpp_cmd cmd_line" ); displayHash( "/cpp_opt options" ); 1451 displayHash( "/cpp_cmd cmd_line" ); displayHash( "/cpp_opt options" );
1439 displayHash( "/cstub filename" ); displayHash( "/dlldata filename" ); displayHash( "/env win32" ); 1452 displayHash( "/cstub filename" ); displayHash( "/dlldata filename" ); displayHash( "/env win32" );
1440 displayHash( "/env win64" ); displayHash( "/error all" ); displayHash( "/error allocation" ); 1453 displayHash( "/env win64" ); displayHash( "/error all" ); displayHash( "/error allocation" );
1441 displayHash( "/error bounds_check" ); displayHash( "/error enum" ); displayHash( "/error none" ); 1454 displayHash( "/error bounds_check" ); displayHash( "/error enum" ); displayHash( "/error none" );
1442 displayHash( "/error ref" ); displayHash( "/error stub_data" ); displayHash( "/h filename" ); 1455 displayHash( "/error ref" ); displayHash( "/error stub_data" ); displayHash( "/h filename" );
@@ -1446,24 +1459,25 @@ bool VCMIDLTool::parseOption( const char* option )
1446 displayHash( "/no_def_idir" ); displayHash( "/no_default_epv" ); displayHash( "/no_format_opt" ); 1459 displayHash( "/no_def_idir" ); displayHash( "/no_default_epv" ); displayHash( "/no_format_opt" );
1447 displayHash( "/no_warn" ); displayHash( "/nocpp" ); displayHash( "/nologo" ); displayHash( "/notlb" ); 1460 displayHash( "/no_warn" ); displayHash( "/nocpp" ); displayHash( "/nologo" ); displayHash( "/notlb" );
1448 displayHash( "/o filename" ); displayHash( "/oldnames" ); displayHash( "/oldtlb" ); 1461 displayHash( "/o filename" ); displayHash( "/oldnames" ); displayHash( "/oldtlb" );
1449 displayHash( "/osf" ); displayHash( "/out directory" ); displayHash( "/pack {N}" ); 1462 displayHash( "/osf" ); displayHash( "/out directory" ); displayHash( "/pack {N}" );
1450 displayHash( "/prefix all" ); displayHash( "/prefix client" ); displayHash( "/prefix server" ); 1463 displayHash( "/prefix all" ); displayHash( "/prefix client" ); displayHash( "/prefix server" );
1451 displayHash( "/prefix switch" ); displayHash( "/protocol all" ); displayHash( "/protocol dce" ); 1464 displayHash( "/prefix switch" ); displayHash( "/protocol all" ); displayHash( "/protocol dce" );
1452 displayHash( "/protocol ndr64" ); displayHash( "/proxy filename" ); displayHash( "/robust" ); 1465 displayHash( "/protocol ndr64" ); displayHash( "/proxy filename" ); displayHash( "/robust" );
1453 displayHash( "/rpcss" ); displayHash( "/savePP" ); displayHash( "/server none" ); 1466 displayHash( "/rpcss" ); displayHash( "/savePP" ); displayHash( "/server none" );
1454 displayHash( "/server stub" ); displayHash( "/sstub filename" ); displayHash( "/syntax_check" ); 1467 displayHash( "/server stub" ); displayHash( "/sstub filename" ); displayHash( "/syntax_check" );
1455 displayHash( "/target {system}" ); displayHash( "/tlb filename" ); displayHash( "/use_epv" ); 1468 displayHash( "/target {system}" ); displayHash( "/tlb filename" ); displayHash( "/use_epv" );
1456 displayHash( "/win32" ); displayHash( "/win64" ); 1469 displayHash( "/win32" ); displayHash( "/win64" );
1457#endif 1470#endif
1471 bool found = TRUE;
1458 int offset = 0; 1472 int offset = 0;
1459 switch( elfHash(option) ) { 1473 switch( elfHash(option) ) {
1460 case 0x0000334: // /D name[=def] 1474 case 0x0000334: // /D name[=def]
1461 PreprocessorDefinitions += option+3; 1475 PreprocessorDefinitions += option+3;
1462 break; 1476 break;
1463 case 0x0000339: // /I directory-list 1477 case 0x0000339: // /I directory-list
1464 AdditionalIncludeDirectories += option+3; 1478 AdditionalIncludeDirectories += option+3;
1465 break; 1479 break;
1466 case 0x0345f96: // /Oicf 1480 case 0x0345f96: // /Oicf
1467 case 0x00345f6: // /Oif 1481 case 0x00345f6: // /Oif
1468 GenerateStublessProxies = _True; 1482 GenerateStublessProxies = _True;
1469 break; 1483 break;
@@ -1481,40 +1495,40 @@ bool VCMIDLTool::parseOption( const char* option )
1481 StructMemberAlignment = ( *(option+offset+5) == '\0' ) ? midlAlignSingleByte : midlAlignSixteenBytes; 1495 StructMemberAlignment = ( *(option+offset+5) == '\0' ) ? midlAlignSingleByte : midlAlignSixteenBytes;
1482 break; 1496 break;
1483 case '2': 1497 case '2':
1484 StructMemberAlignment = midlAlignTwoBytes; 1498 StructMemberAlignment = midlAlignTwoBytes;
1485 break; 1499 break;
1486 case '4': 1500 case '4':
1487 StructMemberAlignment = midlAlignFourBytes; 1501 StructMemberAlignment = midlAlignFourBytes;
1488 break; 1502 break;
1489 case '8': 1503 case '8':
1490 StructMemberAlignment = midlAlignEightBytes; 1504 StructMemberAlignment = midlAlignEightBytes;
1491 break; 1505 break;
1492 default: 1506 default:
1493 return FALSE; 1507 found = FALSE;
1494 } 1508 }
1495 break; 1509 break;
1496 case 0x0359e82: // /char {ascii7|signed|unsigned} 1510 case 0x0359e82: // /char {ascii7|signed|unsigned}
1497 switch( *(option+6) ) { 1511 switch( *(option+6) ) {
1498 case 'a': 1512 case 'a':
1499 DefaultCharType = midlCharAscii7; 1513 DefaultCharType = midlCharAscii7;
1500 break; 1514 break;
1501 case 's': 1515 case 's':
1502 DefaultCharType = midlCharSigned; 1516 DefaultCharType = midlCharSigned;
1503 break; 1517 break;
1504 case 'u': 1518 case 'u':
1505 DefaultCharType = midlCharUnsigned; 1519 DefaultCharType = midlCharUnsigned;
1506 break; 1520 break;
1507 default: 1521 default:
1508 return FALSE; 1522 found = FALSE;
1509 } 1523 }
1510 break; 1524 break;
1511 case 0xa766524: // /cpp_opt options 1525 case 0xa766524: // /cpp_opt options
1512 CPreprocessOptions += option+9; 1526 CPreprocessOptions += option+9;
1513 break; 1527 break;
1514 case 0xb32abf1: // /dlldata filename 1528 case 0xb32abf1: // /dlldata filename
1515 DLLDataFileName = option + 9; 1529 DLLDataFileName = option + 9;
1516 break; 1530 break;
1517 case 0x0035c56: // /env {win32|win64} 1531 case 0x0035c56: // /env {win32|win64}
1518 TargetEnvironment = ( *(option+8) == '6' ) ? midlTargetWin64 : midlTargetWin32; 1532 TargetEnvironment = ( *(option+8) == '6' ) ? midlTargetWin64 : midlTargetWin32;
1519 break; 1533 break;
1520 case 0x35c9962: // /error {all|allocation|bounds_check|enum|none|ref|stub_data} 1534 case 0x35c9962: // /error {all|allocation|bounds_check|enum|none|ref|stub_data}
@@ -1527,31 +1541,31 @@ bool VCMIDLTool::parseOption( const char* option )
1527 ErrorCheckAllocations = _True; 1541 ErrorCheckAllocations = _True;
1528 break; 1542 break;
1529 case 'b': 1543 case 'b':
1530 ErrorCheckBounds = _True; 1544 ErrorCheckBounds = _True;
1531 break; 1545 break;
1532 case 'e': 1546 case 'e':
1533 ErrorCheckEnumRange = _True; 1547 ErrorCheckEnumRange = _True;
1534 break; 1548 break;
1535 case 'n': 1549 case 'n':
1536 EnableErrorChecks = midlDisableAll; 1550 EnableErrorChecks = midlDisableAll;
1537 break; 1551 break;
1538 case 'r': 1552 case 'r':
1539 break;
1540 ErrorCheckRefPointers = _True; 1553 ErrorCheckRefPointers = _True;
1541 case 's':
1542 break; 1554 break;
1555 case 's':
1543 ErrorCheckStubData = _True; 1556 ErrorCheckStubData = _True;
1557 break;
1544 default: 1558 default:
1545 return FALSE; 1559 found = FALSE;
1546 } 1560 }
1547 break; 1561 break;
1548 case 0x5eb7af2: // /header filename 1562 case 0x5eb7af2: // /header filename
1549 offset = 5; 1563 offset = 5;
1550 case 0x0000358: // /h filename 1564 case 0x0000358: // /h filename
1551 HeaderFileName = option + offset + 3; 1565 HeaderFileName = option + offset + 3;
1552 break; 1566 break;
1553 case 0x0035ff4: // /iid filename 1567 case 0x0035ff4: // /iid filename
1554 InterfaceIdentifierFileName = option+5; 1568 InterfaceIdentifierFileName = option+5;
1555 break; 1569 break;
1556 case 0x64b7933: // /mktyplib203 1570 case 0x64b7933: // /mktyplib203
1557 MkTypLibCompatible = _True; 1571 MkTypLibCompatible = _True;
@@ -1638,46 +1652,48 @@ bool VCMIDLTool::parseOption( const char* option )
1638 WarningLevel = midlWarningLevel_1; 1652 WarningLevel = midlWarningLevel_1;
1639 break; 1653 break;
1640 case '2': 1654 case '2':
1641 WarningLevel = midlWarningLevel_2; 1655 WarningLevel = midlWarningLevel_2;
1642 break; 1656 break;
1643 case '3': 1657 case '3':
1644 WarningLevel = midlWarningLevel_3; 1658 WarningLevel = midlWarningLevel_3;
1645 break; 1659 break;
1646 case '4': 1660 case '4':
1647 WarningLevel = midlWarningLevel_4; 1661 WarningLevel = midlWarningLevel_4;
1648 break; 1662 break;
1649 default: 1663 default:
1650 return FALSE; 1664 found = FALSE;
1651 } 1665 }
1652 } 1666 }
1653 break; 1667 break;
1654 } 1668 }
1669 if( !found )
1670 warn_msg( WarnLogic, "Could not parse MIDL option: %s", option );
1655 return TRUE; 1671 return TRUE;
1656} 1672}
1657 1673
1658// VCLibrarianTool -------------------------------------------------- 1674// VCLibrarianTool --------------------------------------------------
1659VCLibrarianTool::VCLibrarianTool() 1675VCLibrarianTool::VCLibrarianTool()
1660 :IgnoreAllDefaultLibraries( unset ), 1676 :IgnoreAllDefaultLibraries( unset ),
1661 SuppressStartupBanner( _True ) 1677 SuppressStartupBanner( _True )
1662{ 1678{
1663} 1679}
1664 1680
1665QTextStream &operator<<( QTextStream &strm, const VCLibrarianTool &tool ) 1681QTextStream &operator<<( QTextStream &strm, const VCLibrarianTool &tool )
1666{ 1682{
1667 strm << _begTool3; 1683 strm << _begTool3;
1668 strm << SPair( _ToolName, QString( "VCLibrarianTool" ) ); 1684 strm << SPair( _ToolName, QString( "VCLibrarianTool" ) );
1669 strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies ); 1685 strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies );
1670 strm << XPair( _AdditionalLibraryDirectories, tool.AdditionalLibraryDirectories ); 1686 strm << XPair( _AdditionalLibraryDirectories, tool.AdditionalLibraryDirectories );
1671 strm << XPair( _AdditionalOptions, tool.AdditionalOptions ); 1687 strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
1672 strm << XPair( _ExportNamedFunctions, tool.ExportNamedFunctions ); 1688 strm << XPair( _ExportNamedFunctions, tool.ExportNamedFunctions );
1673 strm << XPair( _ForceSymbolReferences, tool.ForceSymbolReferences ); 1689 strm << XPair( _ForceSymbolReferences, tool.ForceSymbolReferences );
1674 strm << TPair( _IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries ); 1690 strm << TPair( _IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries );
1675 strm << XPair( _IgnoreDefaultLibraryNames, tool.IgnoreDefaultLibraryNames ); 1691 strm << XPair( _IgnoreDefaultLibraryNames, tool.IgnoreDefaultLibraryNames );
1676 strm << SPair( _ModuleDefinitionFile, tool.ModuleDefinitionFile ); 1692 strm << SPair( _ModuleDefinitionFile, tool.ModuleDefinitionFile );
1677 strm << SPair( _OutputFile, tool.OutputFile ); 1693 strm << SPair( _OutputFile, tool.OutputFile );
1678 strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner ); 1694 strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner );
1679 strm << "/>"; 1695 strm << "/>";
1680 return strm; 1696 return strm;
1681} 1697}
1682 1698
1683// VCCustomBuildTool ------------------------------------------------ 1699// VCCustomBuildTool ------------------------------------------------
@@ -1705,25 +1721,25 @@ VCResourceCompilerTool::VCResourceCompilerTool()
1705 IgnoreStandardIncludePath( unset ), 1721 IgnoreStandardIncludePath( unset ),
1706 ShowProgress( linkProgressNotSet ) 1722 ShowProgress( linkProgressNotSet )
1707{ 1723{
1708 PreprocessorDefinitions = "NDEBUG"; 1724 PreprocessorDefinitions = "NDEBUG";
1709} 1725}
1710 1726
1711QTextStream &operator<<( QTextStream &strm, const VCResourceCompilerTool &tool ) 1727QTextStream &operator<<( QTextStream &strm, const VCResourceCompilerTool &tool )
1712{ 1728{
1713 strm << _begTool3; 1729 strm << _begTool3;
1714 strm << _VCResourceCompilerToolName; 1730 strm << _VCResourceCompilerToolName;
1715 strm << SPair( _ToolPath, tool.ToolPath ); 1731 strm << SPair( _ToolPath, tool.ToolPath );
1716 strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories ); 1732 strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories );
1717 strm << XPair( _AdditionalOptions, tool.AdditionalOptions ); 1733 strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
1718 if ( tool.Culture != rcUseDefault ) strm << EPair( _Culture, tool.Culture ); 1734 if ( tool.Culture != rcUseDefault ) strm << EPair( _Culture, tool.Culture );
1719 strm << XPair( _FullIncludePath, tool.FullIncludePath ); 1735 strm << XPair( _FullIncludePath, tool.FullIncludePath );
1720 strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath ); 1736 strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath );
1721 strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions ); 1737 strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions );
1722 strm << SPair( _ResourceOutputFileName, tool.ResourceOutputFileName ); 1738 strm << SPair( _ResourceOutputFileName, tool.ResourceOutputFileName );
1723 if ( tool.ShowProgress != linkProgressNotSet ) strm << EPair( _ShowProgress, tool.ShowProgress ); 1739 if ( tool.ShowProgress != linkProgressNotSet ) strm << EPair( _ShowProgress, tool.ShowProgress );
1724 strm << "/>"; 1740 strm << "/>";
1725 return strm; 1741 return strm;
1726} 1742}
1727 1743
1728// VCEventTool ------------------------------------------------- 1744// VCEventTool -------------------------------------------------
1729QTextStream &operator<<( QTextStream &strm, const VCEventTool &tool ) 1745QTextStream &operator<<( QTextStream &strm, const VCEventTool &tool )
@@ -1842,47 +1858,68 @@ void VCFilter::generateMOC( QTextStream &strm, QString str ) const
1842 strm << _Outputs6; 1858 strm << _Outputs6;
1843 strm << mocOutput << "\""; 1859 strm << mocOutput << "\"";
1844 strm << "/>"; 1860 strm << "/>";
1845 strm << _endFileConfiguration; 1861 strm << _endFileConfiguration;
1846} 1862}
1847 1863
1848void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const 1864void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const
1849{ 1865{
1850 QString uicApp = Project->var("QMAKE_UIC"); 1866 QString uicApp = Project->var("QMAKE_UIC");
1851 QString mocApp = Project->var( "QMAKE_MOC" ); 1867 QString mocApp = Project->var( "QMAKE_MOC" );
1852 QString fname = str.section( '\\', -1 ); 1868 QString fname = str.section( '\\', -1 );
1853 QString mocDir = Project->var( "MOC_DIR" ); 1869 QString mocDir = Project->var( "MOC_DIR" );
1854 int dot = fname.findRev( '.' ); 1870 QString uiDir = Project->var( "UI_DIR" );
1855 if( dot != -1 ) 1871 QString uiHeaders;
1856 fname.truncate( dot ); 1872 QString uiSources;
1857 1873
1874 // Determining the paths for the output files.
1858 int slash = str.findRev( '\\' ); 1875 int slash = str.findRev( '\\' );
1859 QString pname = ( slash != -1 ) ? str.left( slash+1 ) : QString(".\\"); 1876 QString pname = ( slash != -1 ) ? str.left( slash+1 ) : QString(".\\");
1877 if( !uiDir.isEmpty() ) {
1878 uiHeaders = uiDir;
1879 uiSources = uiDir;
1880 } else {
1881 uiHeaders = Project->var( "UI_HEADERS_DIR" );
1882 uiSources = Project->var( "UI_SOURCES_DIR" );
1883 if( uiHeaders.isEmpty() )
1884 uiHeaders = pname;
1885 if( uiSources.isEmpty() )
1886 uiSources = pname;
1887 }
1888 if( !uiHeaders.endsWith( "\\" ) )
1889 uiHeaders += "\\";
1890 if( !uiSources.endsWith( "\\" ) )
1891 uiSources += "\\";
1892
1893 // Determine the file name.
1894 int dot = fname.findRev( '.' );
1895 if( dot != -1 )
1896 fname.truncate( dot );
1860 1897
1861 strm << _begFileConfiguration; 1898 strm << _begFileConfiguration;
1862 strm << _Name5; 1899 strm << _Name5;
1863 strm << Config->Name; 1900 strm << Config->Name;
1864 strm << "\">"; 1901 strm << "\">";
1865 strm << _begTool5; 1902 strm << _begTool5;
1866 strm << _VCCustomBuildTool; 1903 strm << _VCCustomBuildTool;
1867 strm << _Description6; 1904 strm << _Description6;
1868 strm << "Uic'ing " << str << "...\""; 1905 strm << "Uic'ing " << str << "...\"";
1869 strm << _CommandLine6; 1906 strm << _CommandLine6;
1870 strm << uicApp << " " << str << " -o " << pname << fname << ".h &amp;&amp; "; // Create .h from .ui file 1907 strm << uicApp << " " << str << " -o " << uiHeaders << fname << ".h &amp;&amp; "; // Create .h from .ui file
1871 strm << uicApp << " " << str << " -i " << fname << ".h -o " << pname << fname << ".cpp &amp;&amp; ";// Create .cpp from .ui file 1908 strm << uicApp << " " << str << " -i " << fname << ".h -o " << uiSources << fname << ".cpp &amp;&amp; ";// Create .cpp from .ui file
1872 strm << mocApp << " " << pname << fname << ".h -o " << mocDir << "moc_" << fname << ".cpp\""; 1909 strm << mocApp << " " << uiHeaders << fname << ".h -o " << mocDir << "moc_" << fname << ".cpp\"";
1873 strm << _AdditionalDependencies6; 1910 strm << _AdditionalDependencies6;
1874 strm << mocApp << ";" << uicApp << "\""; 1911 strm << mocApp << ";" << uicApp << "\"";
1875 strm << _Outputs6; 1912 strm << _Outputs6;
1876 strm << pname << fname << ".h;" << pname << fname << ".cpp;" << mocDir << "moc_" << fname << ".cpp\""; 1913 strm << uiHeaders << fname << ".h;" << uiSources << fname << ".cpp;" << mocDir << "moc_" << fname << ".cpp\"";
1877 strm << "/>"; 1914 strm << "/>";
1878 strm << _endFileConfiguration; 1915 strm << _endFileConfiguration;
1879} 1916}
1880 1917
1881QTextStream &operator<<( QTextStream &strm, const VCFilter &tool ) 1918QTextStream &operator<<( QTextStream &strm, const VCFilter &tool )
1882{ 1919{
1883 if ( tool.Files.count() == 0 ) 1920 if ( tool.Files.count() == 0 )
1884 return strm; 1921 return strm;
1885 1922
1886 strm << _begFilter; 1923 strm << _begFilter;
1887 strm << SPair( _Name3, tool.Name ); 1924 strm << SPair( _Name3, tool.Name );
1888 strm << TPair( _ParseFiles, tool.ParseFiles ); 1925 strm << TPair( _ParseFiles, tool.ParseFiles );
@@ -1897,27 +1934,27 @@ QTextStream &operator<<( QTextStream &strm, const VCFilter &tool )
1897 else if ( tool.CustomBuild == uic ) 1934 else if ( tool.CustomBuild == uic )
1898 tool.generateUIC( strm, *it ); 1935 tool.generateUIC( strm, *it );
1899 strm << _endFile; 1936 strm << _endFile;
1900 } 1937 }
1901 1938
1902 strm << _endFilter; 1939 strm << _endFilter;
1903 return strm; 1940 return strm;
1904} 1941}
1905 1942
1906// VCProject -------------------------------------------------------- 1943// VCProject --------------------------------------------------------
1907VCProject::VCProject() 1944VCProject::VCProject()
1908{ 1945{
1909 QUuid uniqueId;
1910#if defined(Q_WS_WIN32) 1946#if defined(Q_WS_WIN32)
1911 GUID guid; 1947 GUID guid;
1948 QUuid uniqueId;
1912 HRESULT h = CoCreateGuid( &guid ); 1949 HRESULT h = CoCreateGuid( &guid );
1913 if ( h == S_OK ) 1950 if ( h == S_OK )
1914 uniqueId = QUuid( guid ); 1951 uniqueId = QUuid( guid );
1915 ProjectGUID = uniqueId.toString(); 1952 ProjectGUID = uniqueId.toString();
1916#else 1953#else
1917 // Qt doesn't support GUID on other platforms yet 1954 // Qt doesn't support GUID on other platforms yet
1918 ProjectGUID = ""; 1955 ProjectGUID = "";
1919#endif 1956#endif
1920} 1957}
1921 1958
1922QTextStream &operator<<( QTextStream &strm, const VCProject &tool ) 1959QTextStream &operator<<( QTextStream &strm, const VCProject &tool )
1923{ 1960{