diff options
22 files changed, 592 insertions, 21 deletions
diff --git a/Help/release/dev/vs-masm.rst b/Help/release/dev/vs-masm.rst new file mode 100644 index 0000000..d7a19d0 --- /dev/null +++ b/Help/release/dev/vs-masm.rst @@ -0,0 +1,5 @@ +vs-masm +------- + +* Visual Studio generators for VS 8 and later learned to support + the ``ASM_MASM`` language. diff --git a/Modules/CMakeASM_MASMInformation.cmake b/Modules/CMakeASM_MASMInformation.cmake index eb105ab..972883c 100644 --- a/Modules/CMakeASM_MASMInformation.cmake +++ b/Modules/CMakeASM_MASMInformation.cmake @@ -18,7 +18,7 @@ set(ASM_DIALECT "_MASM") set(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS asm) -set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> <FLAGS> /c /Fo <OBJECT> <SOURCE>") +set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> <DEFINES> <FLAGS> /c /Fo <OBJECT> <SOURCE>") include(CMakeASMInformation) set(ASM_DIALECT) diff --git a/Modules/CMakeDetermineASM_MASMCompiler.cmake b/Modules/CMakeDetermineASM_MASMCompiler.cmake index 665a65c..142ef95 100644 --- a/Modules/CMakeDetermineASM_MASMCompiler.cmake +++ b/Modules/CMakeDetermineASM_MASMCompiler.cmake @@ -17,7 +17,8 @@ set(ASM_DIALECT "_MASM") # if we are using the 64bit cl compiler, assume we also want the 64bit assembler -if(CMAKE_CL_64) +if(";${CMAKE_VS_PLATFORM_NAME};${MSVC_C_ARCHITECTURE_ID};${MSVC_CXX_ARCHITECTURE_ID};" + MATCHES ";(Win64|Itanium|x64|IA64);") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT ml64) else() set(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT ml) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 3f948b5..3681515 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -620,7 +620,8 @@ cmGlobalGenerator::EnableLanguage(std::vector<std::string>const& languages, "No " << compilerName << " could be found.\n" ; } - else if(strcmp(lang, "RC") != 0) + else if(strcmp(lang, "RC") != 0 && + strcmp(lang, "ASM_MASM") != 0) { if(!cmSystemTools::FileIsFullPath(compilerFile)) { diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index c708a08..19aa52c 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -99,7 +99,6 @@ cmGlobalVisualStudio10Generator::cmGlobalVisualStudio10Generator( "ProductDir", vc10Express, cmSystemTools::KeyWOW64_32); this->SystemIsWindowsPhone = false; this->SystemIsWindowsStore = false; - this->MasmEnabled = false; this->MSBuildCommandInitialized = false; } @@ -257,15 +256,6 @@ void cmGlobalVisualStudio10Generator ::EnableLanguage(std::vector<std::string>const & lang, cmMakefile *mf, bool optional) { - for(std::vector<std::string>::const_iterator it = lang.begin(); - it != lang.end(); ++it) - { - if(*it == "ASM_MASM") - { - this->MasmEnabled = true; - } - } - cmGlobalVisualStudio8Generator::EnableLanguage(lang, mf, optional); } diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h index 6245b28..11fa954 100644 --- a/Source/cmGlobalVisualStudio10Generator.h +++ b/Source/cmGlobalVisualStudio10Generator.h @@ -58,9 +58,6 @@ public: /** Is the installed VS an Express edition? */ bool IsExpressEdition() const { return this->ExpressEdition; } - /** Is the Microsoft Assembler enabled? */ - bool IsMasmEnabled() const { return this->MasmEnabled; } - /** The toolset name for the target platform. */ const char* GetPlatformToolset() const; @@ -123,7 +120,6 @@ protected: bool SystemIsWindowsPhone; bool SystemIsWindowsStore; bool ExpressEdition; - bool MasmEnabled; bool UseFolderProperty(); diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx index 3d79357..e312ff1 100644 --- a/Source/cmGlobalVisualStudio7Generator.cxx +++ b/Source/cmGlobalVisualStudio7Generator.cxx @@ -23,6 +23,7 @@ cmGlobalVisualStudio7Generator::cmGlobalVisualStudio7Generator( { this->IntelProjectVersion = 0; this->DevEnvCommandInitialized = false; + this->MasmEnabled = false; if (platformName.empty()) { diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h index 390b97c..7e3ed23 100644 --- a/Source/cmGlobalVisualStudio7Generator.h +++ b/Source/cmGlobalVisualStudio7Generator.h @@ -102,6 +102,9 @@ public: virtual void FindMakeProgram(cmMakefile*); + /** Is the Microsoft Assembler enabled? */ + bool IsMasmEnabled() const { return this->MasmEnabled; } + // Encoding for Visual Studio files virtual std::string Encoding(); @@ -173,6 +176,7 @@ protected: // There is one SLN file per project. std::string CurrentProject; std::string PlatformName; + bool MasmEnabled; private: char* IntelProjectVersion; diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx index 6bfef68..c91730f 100644 --- a/Source/cmGlobalVisualStudio8Generator.cxx +++ b/Source/cmGlobalVisualStudio8Generator.cxx @@ -136,6 +136,14 @@ void cmGlobalVisualStudio8Generator ::EnableLanguage(std::vector<std::string>const & lang, cmMakefile *mf, bool optional) { + for(std::vector<std::string>::const_iterator it = lang.begin(); + it != lang.end(); ++it) + { + if(*it == "ASM_MASM") + { + this->MasmEnabled = true; + } + } this->AddPlatformDefinitions(mf); cmGlobalVisualStudio7Generator::EnableLanguage(lang, mf, optional); } diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 3ed4a48..11a9627 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -44,6 +44,16 @@ private: extern cmVS7FlagTable cmLocalVisualStudio7GeneratorFlagTable[]; +static void cmConvertToWindowsSlash(std::string& s) +{ + std::string::size_type pos = 0; + while((pos = s.find('/', pos)) != std::string::npos) + { + s[pos] = '\\'; + pos++; + } +} + //---------------------------------------------------------------------------- cmLocalVisualStudio7Generator::cmLocalVisualStudio7Generator(VSVersion v): cmLocalVisualStudioGenerator(v) @@ -862,6 +872,31 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout, } } fout << "/>\n"; // end of <Tool Name=VCCLCompilerTool + if(gg->IsMasmEnabled() && !this->FortranProject) + { + Options masmOptions(this, Options::MasmCompiler, 0, 0); + fout << + "\t\t\t<Tool\n" + "\t\t\t\tName=\"MASM\"\n" + "\t\t\t\tIncludePaths=\"" + ; + const char* sep = ""; + for(i = includes.begin(); i != includes.end(); ++i) + { + std::string inc = *i; + cmConvertToWindowsSlash(inc); + fout << sep << this->EscapeForXML(inc); + sep = ";"; + } + fout << "\"\n"; + // Use same preprocessor definitions as VCCLCompilerTool. + targetOptions.OutputPreprocessorDefinitions(fout, "\t\t\t\t", "\n", + "ASM_MASM"); + masmOptions.OutputFlagMap(fout, "\t\t\t\t"); + fout << + "\t\t\t\tObjectFile=\"$(IntDir)\\\"\n" + "\t\t\t/>\n"; + } tool = "VCCustomBuildTool"; if(this->FortranProject) { @@ -1695,11 +1730,12 @@ bool cmLocalVisualStudio7Generator else if(!fcinfo.FileConfigMap.empty()) { const char* aCompilerTool = "VCCLCompilerTool"; - const char* lang = "CXX"; + const char* ppLang = "CXX"; if(this->FortranProject) { aCompilerTool = "VFFortranCompilerTool"; } + std::string const& lang = (*sf)->GetLanguage(); std::string ext = (*sf)->GetExtension(); ext = cmSystemTools::LowerCase(ext); if(ext == "idl") @@ -1713,7 +1749,7 @@ bool cmLocalVisualStudio7Generator if(ext == "rc") { aCompilerTool = "VCResourceCompilerTool"; - lang = "RC"; + ppLang = "RC"; if(this->FortranProject) { aCompilerTool = "VFResourceCompilerTool"; @@ -1727,6 +1763,11 @@ bool cmLocalVisualStudio7Generator aCompilerTool = "VFCustomBuildTool"; } } + if (gg->IsMasmEnabled() && !this->FortranProject && + lang == "ASM_MASM") + { + aCompilerTool = "MASM"; + } for(std::map<std::string, cmLVS7GFileConfig>::const_iterator fci = fcinfo.FileConfigMap.begin(); fci != fcinfo.FileConfigMap.end(); ++fci) @@ -1763,7 +1804,7 @@ bool cmLocalVisualStudio7Generator fileOptions.OutputFlagMap(fout, "\t\t\t\t\t"); fileOptions.OutputPreprocessorDefinitions(fout, "\t\t\t\t\t", "\n", - lang); + ppLang); } if(!fc.AdditionalDeps.empty()) { @@ -2095,6 +2136,16 @@ cmLocalVisualStudio7Generator::WriteProjectStart(std::ostream& fout, << "\t<Platforms>\n" << "\t\t<Platform\n\t\t\tName=\"" << gg->GetPlatformName() << "\"/>\n" << "\t</Platforms>\n"; + if(gg->IsMasmEnabled()) + { + fout << + "\t<ToolFiles>\n" + "\t\t<DefaultToolFile\n" + "\t\t\tFileName=\"masm.rules\"\n" + "\t\t/>\n" + "\t</ToolFiles>\n" + ; + } } diff --git a/Source/cmVS10MASMFlagTable.h b/Source/cmVS10MASMFlagTable.h new file mode 100644 index 0000000..8fb6f33 --- /dev/null +++ b/Source/cmVS10MASMFlagTable.h @@ -0,0 +1,96 @@ +static cmVS7FlagTable cmVS10MASMFlagTable[] = +{ + + //Enum Properties + {"PreserveIdentifierCase", "", + "Default", "0", 0}, + {"PreserveIdentifierCase", "/Cp", + "Preserves Identifier Case (/Cp)", "1", 0}, + {"PreserveIdentifierCase", "/Cu", + "Maps all identifiers to upper case. (/Cu)", "2", 0}, + {"PreserveIdentifierCase", "/Cx", + "Preserves case in public and extern symbols. (/Cx)", "3", 0}, + + {"WarningLevel", "/W0", + "Warning Level 0 (/W0)", "0", 0}, + {"WarningLevel", "/W1", + "Warning Level 1 (/W1)", "1", 0}, + {"WarningLevel", "/W2", + "Warning Level 2 (/W2)", "2", 0}, + {"WarningLevel", "/W3", + "Warning Level 3 (/W3)", "3", 0}, + + {"PackAlignmentBoundary", "", + "Default", "0", 0}, + {"PackAlignmentBoundary", "/Zp1", + "One Byte Boundary (/Zp1)", "1", 0}, + {"PackAlignmentBoundary", "/Zp2", + "Two Byte Boundary (/Zp2)", "2", 0}, + {"PackAlignmentBoundary", "/Zp4", + "Four Byte Boundary (/Zp4)", "3", 0}, + {"PackAlignmentBoundary", "/Zp8", + "Eight Byte Boundary (/Zp8)", "4", 0}, + {"PackAlignmentBoundary", "/Zp16", + "Sixteen Byte Boundary (/Zp16)", "5", 0}, + + {"CallingConvention", "", + "Default", "0", 0}, + {"CallingConvention", "/Gd", + "Use C-style Calling Convention (/Gd)", "1", 0}, + {"CallingConvention", "/Gz", + "Use stdcall Calling Convention (/Gz)", "2", 0}, + {"CallingConvention", "/Gc", + "Use Pascal Calling Convention (/Gc)", "3", 0}, + + {"ErrorReporting", "/errorReport:prompt", + "Prompt to send report immediately (/errorReport:prompt)", "0", 0}, + {"ErrorReporting", "/errorReport:queue", + "Prompt to send report at the next logon (/errorReport:queue)", "1", 0}, + {"ErrorReporting", "/errorReport:send", + "Automatically send report (/errorReport:send)", "2", 0}, + {"ErrorReporting", "/errorReport:none", + "Do not send report (/errorReport:none)", "3", 0}, + + + //Bool Properties + {"NoLogo", "/nologo", "", "true", 0}, + {"GeneratePreprocessedSourceListing", "/EP", "", "true", 0}, + {"ListAllAvailableInformation", "/Sa", "", "true", 0}, + {"UseSafeExceptionHandlers", "/safeseh", "", "true", 0}, + {"AddFirstPassListing", "/Sf", "", "true", 0}, + {"EnableAssemblyGeneratedCodeListing", "/Sg", "", "true", 0}, + {"DisableSymbolTable", "/Sn", "", "true", 0}, + {"EnableFalseConditionalsInListing", "/Sx", "", "true", 0}, + {"TreatWarningsAsErrors", "/WX", "", "true", 0}, + {"MakeAllSymbolsPublic", "/Zf", "", "true", 0}, + {"GenerateDebugInformation", "/Zi", "", "true", 0}, + {"EnableMASM51Compatibility", "/Zm", "", "true", 0}, + {"PerformSyntaxCheckOnly", "/Zs", "", "true", 0}, + + //Bool Properties With Argument + + //String List Properties + {"PreprocessorDefinitions", "/D", + "Preprocessor Definitions", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"IncludePaths", "/I", + "Include Paths", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"BrowseFile", "/FR", + "Generate Browse Information File", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + // Skip [AdditionalDependencies] - no command line Switch. + + //String Properties + // Skip [Inputs] - no command line Switch. + {"ObjectFileName", "/Fo", + "Object File Name", + "", cmVS7FlagTable::UserValue}, + {"AssembledCodeListingFile", "/Fl", + "Assembled Code Listing File", + "", cmVS7FlagTable::UserValue}, + // Skip [CommandLineTemplate] - no command line Switch. + // Skip [ExecutionDescription] - no command line Switch. + // Skip [AdditionalOptions] - no command line Switch. + {0,0,0,0,0} +}; diff --git a/Source/cmVS11MASMFlagTable.h b/Source/cmVS11MASMFlagTable.h new file mode 100644 index 0000000..2ff95ad --- /dev/null +++ b/Source/cmVS11MASMFlagTable.h @@ -0,0 +1,96 @@ +static cmVS7FlagTable cmVS11MASMFlagTable[] = +{ + + //Enum Properties + {"PreserveIdentifierCase", "", + "Default", "0", 0}, + {"PreserveIdentifierCase", "/Cp", + "Preserves Identifier Case (/Cp)", "1", 0}, + {"PreserveIdentifierCase", "/Cu", + "Maps all identifiers to upper case. (/Cu)", "2", 0}, + {"PreserveIdentifierCase", "/Cx", + "Preserves case in public and extern symbols. (/Cx)", "3", 0}, + + {"WarningLevel", "/W0", + "Warning Level 0 (/W0)", "0", 0}, + {"WarningLevel", "/W1", + "Warning Level 1 (/W1)", "1", 0}, + {"WarningLevel", "/W2", + "Warning Level 2 (/W2)", "2", 0}, + {"WarningLevel", "/W3", + "Warning Level 3 (/W3)", "3", 0}, + + {"PackAlignmentBoundary", "", + "Default", "0", 0}, + {"PackAlignmentBoundary", "/Zp1", + "One Byte Boundary (/Zp1)", "1", 0}, + {"PackAlignmentBoundary", "/Zp2", + "Two Byte Boundary (/Zp2)", "2", 0}, + {"PackAlignmentBoundary", "/Zp4", + "Four Byte Boundary (/Zp4)", "3", 0}, + {"PackAlignmentBoundary", "/Zp8", + "Eight Byte Boundary (/Zp8)", "4", 0}, + {"PackAlignmentBoundary", "/Zp16", + "Sixteen Byte Boundary (/Zp16)", "5", 0}, + + {"CallingConvention", "", + "Default", "0", 0}, + {"CallingConvention", "/Gd", + "Use C-style Calling Convention (/Gd)", "1", 0}, + {"CallingConvention", "/Gz", + "Use stdcall Calling Convention (/Gz)", "2", 0}, + {"CallingConvention", "/Gc", + "Use Pascal Calling Convention (/Gc)", "3", 0}, + + {"ErrorReporting", "/errorReport:prompt", + "Prompt to send report immediately (/errorReport:prompt)", "0", 0}, + {"ErrorReporting", "/errorReport:queue", + "Prompt to send report at the next logon (/errorReport:queue)", "1", 0}, + {"ErrorReporting", "/errorReport:send", + "Automatically send report (/errorReport:send)", "2", 0}, + {"ErrorReporting", "/errorReport:none", + "Do not send report (/errorReport:none)", "3", 0}, + + + //Bool Properties + {"NoLogo", "/nologo", "", "true", 0}, + {"GeneratePreprocessedSourceListing", "/EP", "", "true", 0}, + {"ListAllAvailableInformation", "/Sa", "", "true", 0}, + {"UseSafeExceptionHandlers", "/safeseh", "", "true", 0}, + {"AddFirstPassListing", "/Sf", "", "true", 0}, + {"EnableAssemblyGeneratedCodeListing", "/Sg", "", "true", 0}, + {"DisableSymbolTable", "/Sn", "", "true", 0}, + {"EnableFalseConditionalsInListing", "/Sx", "", "true", 0}, + {"TreatWarningsAsErrors", "/WX", "", "true", 0}, + {"MakeAllSymbolsPublic", "/Zf", "", "true", 0}, + {"GenerateDebugInformation", "/Zi", "", "true", 0}, + {"EnableMASM51Compatibility", "/Zm", "", "true", 0}, + {"PerformSyntaxCheckOnly", "/Zs", "", "true", 0}, + + //Bool Properties With Argument + + //String List Properties + {"PreprocessorDefinitions", "/D", + "Preprocessor Definitions", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"IncludePaths", "/I", + "Include Paths", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"BrowseFile", "/FR", + "Generate Browse Information File", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + // Skip [AdditionalDependencies] - no command line Switch. + + //String Properties + // Skip [Inputs] - no command line Switch. + {"ObjectFileName", "/Fo", + "Object File Name", + "", cmVS7FlagTable::UserValue}, + {"AssembledCodeListingFile", "/Fl", + "Assembled Code Listing File", + "", cmVS7FlagTable::UserValue}, + // Skip [CommandLineTemplate] - no command line Switch. + // Skip [ExecutionDescription] - no command line Switch. + // Skip [AdditionalOptions] - no command line Switch. + {0,0,0,0,0} +}; diff --git a/Source/cmVS12MASMFlagTable.h b/Source/cmVS12MASMFlagTable.h new file mode 100644 index 0000000..74d529c --- /dev/null +++ b/Source/cmVS12MASMFlagTable.h @@ -0,0 +1,96 @@ +static cmVS7FlagTable cmVS12MASMFlagTable[] = +{ + + //Enum Properties + {"PreserveIdentifierCase", "", + "Default", "0", 0}, + {"PreserveIdentifierCase", "/Cp", + "Preserves Identifier Case (/Cp)", "1", 0}, + {"PreserveIdentifierCase", "/Cu", + "Maps all identifiers to upper case. (/Cu)", "2", 0}, + {"PreserveIdentifierCase", "/Cx", + "Preserves case in public and extern symbols. (/Cx)", "3", 0}, + + {"WarningLevel", "/W0", + "Warning Level 0 (/W0)", "0", 0}, + {"WarningLevel", "/W1", + "Warning Level 1 (/W1)", "1", 0}, + {"WarningLevel", "/W2", + "Warning Level 2 (/W2)", "2", 0}, + {"WarningLevel", "/W3", + "Warning Level 3 (/W3)", "3", 0}, + + {"PackAlignmentBoundary", "", + "Default", "0", 0}, + {"PackAlignmentBoundary", "/Zp1", + "One Byte Boundary (/Zp1)", "1", 0}, + {"PackAlignmentBoundary", "/Zp2", + "Two Byte Boundary (/Zp2)", "2", 0}, + {"PackAlignmentBoundary", "/Zp4", + "Four Byte Boundary (/Zp4)", "3", 0}, + {"PackAlignmentBoundary", "/Zp8", + "Eight Byte Boundary (/Zp8)", "4", 0}, + {"PackAlignmentBoundary", "/Zp16", + "Sixteen Byte Boundary (/Zp16)", "5", 0}, + + {"CallingConvention", "", + "Default", "0", 0}, + {"CallingConvention", "/Gd", + "Use C-style Calling Convention (/Gd)", "1", 0}, + {"CallingConvention", "/Gz", + "Use stdcall Calling Convention (/Gz)", "2", 0}, + {"CallingConvention", "/Gc", + "Use Pascal Calling Convention (/Gc)", "3", 0}, + + {"ErrorReporting", "/errorReport:prompt", + "Prompt to send report immediately (/errorReport:prompt)", "0", 0}, + {"ErrorReporting", "/errorReport:queue", + "Prompt to send report at the next logon (/errorReport:queue)", "1", 0}, + {"ErrorReporting", "/errorReport:send", + "Automatically send report (/errorReport:send)", "2", 0}, + {"ErrorReporting", "/errorReport:none", + "Do not send report (/errorReport:none)", "3", 0}, + + + //Bool Properties + {"NoLogo", "/nologo", "", "true", 0}, + {"GeneratePreprocessedSourceListing", "/EP", "", "true", 0}, + {"ListAllAvailableInformation", "/Sa", "", "true", 0}, + {"UseSafeExceptionHandlers", "/safeseh", "", "true", 0}, + {"AddFirstPassListing", "/Sf", "", "true", 0}, + {"EnableAssemblyGeneratedCodeListing", "/Sg", "", "true", 0}, + {"DisableSymbolTable", "/Sn", "", "true", 0}, + {"EnableFalseConditionalsInListing", "/Sx", "", "true", 0}, + {"TreatWarningsAsErrors", "/WX", "", "true", 0}, + {"MakeAllSymbolsPublic", "/Zf", "", "true", 0}, + {"GenerateDebugInformation", "/Zi", "", "true", 0}, + {"EnableMASM51Compatibility", "/Zm", "", "true", 0}, + {"PerformSyntaxCheckOnly", "/Zs", "", "true", 0}, + + //Bool Properties With Argument + + //String List Properties + {"PreprocessorDefinitions", "/D", + "Preprocessor Definitions", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"IncludePaths", "/I", + "Include Paths", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"BrowseFile", "/FR", + "Generate Browse Information File", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + // Skip [AdditionalDependencies] - no command line Switch. + + //String Properties + // Skip [Inputs] - no command line Switch. + {"ObjectFileName", "/Fo", + "Object File Name", + "", cmVS7FlagTable::UserValue}, + {"AssembledCodeListingFile", "/Fl", + "Assembled Code Listing File", + "", cmVS7FlagTable::UserValue}, + // Skip [CommandLineTemplate] - no command line Switch. + // Skip [ExecutionDescription] - no command line Switch. + // Skip [AdditionalOptions] - no command line Switch. + {0,0,0,0,0} +}; diff --git a/Source/cmVS14MASMFlagTable.h b/Source/cmVS14MASMFlagTable.h new file mode 100644 index 0000000..dce846f --- /dev/null +++ b/Source/cmVS14MASMFlagTable.h @@ -0,0 +1,96 @@ +static cmVS7FlagTable cmVS14MASMFlagTable[] = +{ + + //Enum Properties + {"PreserveIdentifierCase", "", + "Default", "0", 0}, + {"PreserveIdentifierCase", "/Cp", + "Preserves Identifier Case (/Cp)", "1", 0}, + {"PreserveIdentifierCase", "/Cu", + "Maps all identifiers to upper case. (/Cu)", "2", 0}, + {"PreserveIdentifierCase", "/Cx", + "Preserves case in public and extern symbols. (/Cx)", "3", 0}, + + {"WarningLevel", "/W0", + "Warning Level 0 (/W0)", "0", 0}, + {"WarningLevel", "/W1", + "Warning Level 1 (/W1)", "1", 0}, + {"WarningLevel", "/W2", + "Warning Level 2 (/W2)", "2", 0}, + {"WarningLevel", "/W3", + "Warning Level 3 (/W3)", "3", 0}, + + {"PackAlignmentBoundary", "", + "Default", "0", 0}, + {"PackAlignmentBoundary", "/Zp1", + "One Byte Boundary (/Zp1)", "1", 0}, + {"PackAlignmentBoundary", "/Zp2", + "Two Byte Boundary (/Zp2)", "2", 0}, + {"PackAlignmentBoundary", "/Zp4", + "Four Byte Boundary (/Zp4)", "3", 0}, + {"PackAlignmentBoundary", "/Zp8", + "Eight Byte Boundary (/Zp8)", "4", 0}, + {"PackAlignmentBoundary", "/Zp16", + "Sixteen Byte Boundary (/Zp16)", "5", 0}, + + {"CallingConvention", "", + "Default", "0", 0}, + {"CallingConvention", "/Gd", + "Use C-style Calling Convention (/Gd)", "1", 0}, + {"CallingConvention", "/Gz", + "Use stdcall Calling Convention (/Gz)", "2", 0}, + {"CallingConvention", "/Gc", + "Use Pascal Calling Convention (/Gc)", "3", 0}, + + {"ErrorReporting", "/errorReport:prompt", + "Prompt to send report immediately (/errorReport:prompt)", "0", 0}, + {"ErrorReporting", "/errorReport:queue", + "Prompt to send report at the next logon (/errorReport:queue)", "1", 0}, + {"ErrorReporting", "/errorReport:send", + "Automatically send report (/errorReport:send)", "2", 0}, + {"ErrorReporting", "/errorReport:none", + "Do not send report (/errorReport:none)", "3", 0}, + + + //Bool Properties + {"NoLogo", "/nologo", "", "true", 0}, + {"GeneratePreprocessedSourceListing", "/EP", "", "true", 0}, + {"ListAllAvailableInformation", "/Sa", "", "true", 0}, + {"UseSafeExceptionHandlers", "/safeseh", "", "true", 0}, + {"AddFirstPassListing", "/Sf", "", "true", 0}, + {"EnableAssemblyGeneratedCodeListing", "/Sg", "", "true", 0}, + {"DisableSymbolTable", "/Sn", "", "true", 0}, + {"EnableFalseConditionalsInListing", "/Sx", "", "true", 0}, + {"TreatWarningsAsErrors", "/WX", "", "true", 0}, + {"MakeAllSymbolsPublic", "/Zf", "", "true", 0}, + {"GenerateDebugInformation", "/Zi", "", "true", 0}, + {"EnableMASM51Compatibility", "/Zm", "", "true", 0}, + {"PerformSyntaxCheckOnly", "/Zs", "", "true", 0}, + + //Bool Properties With Argument + + //String List Properties + {"PreprocessorDefinitions", "/D", + "Preprocessor Definitions", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"IncludePaths", "/I", + "Include Paths", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + {"BrowseFile", "/FR", + "Generate Browse Information File", + "", cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable}, + // Skip [AdditionalDependencies] - no command line Switch. + + //String Properties + // Skip [Inputs] - no command line Switch. + {"ObjectFileName", "/Fo", + "Object File Name", + "", cmVS7FlagTable::UserValue}, + {"AssembledCodeListingFile", "/Fl", + "Assembled Code Listing File", + "", cmVS7FlagTable::UserValue}, + // Skip [CommandLineTemplate] - no command line Switch. + // Skip [ExecutionDescription] - no command line Switch. + // Skip [AdditionalOptions] - no command line Switch. + {0,0,0,0,0} +}; diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index ef343b6..09a9252 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -24,18 +24,22 @@ #include "cmVS10RCFlagTable.h" #include "cmVS10LinkFlagTable.h" #include "cmVS10LibFlagTable.h" +#include "cmVS10MASMFlagTable.h" #include "cmVS11CLFlagTable.h" #include "cmVS11RCFlagTable.h" #include "cmVS11LinkFlagTable.h" #include "cmVS11LibFlagTable.h" +#include "cmVS11MASMFlagTable.h" #include "cmVS12CLFlagTable.h" #include "cmVS12RCFlagTable.h" #include "cmVS12LinkFlagTable.h" #include "cmVS12LibFlagTable.h" +#include "cmVS12MASMFlagTable.h" #include "cmVS14CLFlagTable.h" #include "cmVS14RCFlagTable.h" #include "cmVS14LinkFlagTable.h" #include "cmVS14LibFlagTable.h" +#include "cmVS14MASMFlagTable.h" #include <cmsys/auto_ptr.hxx> @@ -111,6 +115,24 @@ cmIDEFlagTable const* cmVisualStudio10TargetGenerator::GetLinkFlagTable() const return 0; } +cmIDEFlagTable const* cmVisualStudio10TargetGenerator::GetMasmFlagTable() const +{ + if(this->MSTools) + { + cmLocalVisualStudioGenerator::VSVersion + v = this->LocalGenerator->GetVersion(); + if(v >= cmLocalVisualStudioGenerator::VS14) + { return cmVS14MASMFlagTable; } + else if(v >= cmLocalVisualStudioGenerator::VS12) + { return cmVS12MASMFlagTable; } + else if(v == cmLocalVisualStudioGenerator::VS11) + { return cmVS11MASMFlagTable; } + else + { return cmVS10MASMFlagTable; } + } + return 0; +} + static std::string cmVS10EscapeXML(std::string arg) { cmSystemTools::ReplaceString(arg, "&", "&"); @@ -251,6 +273,10 @@ void cmVisualStudio10TargetGenerator::Generate() { return; } + if(!this->ComputeMasmOptions()) + { + return; + } if(!this->ComputeLinkOptions()) { return; @@ -1192,7 +1218,7 @@ void cmVisualStudio10TargetGenerator::WriteAllSources() { tool = "ClCompile"; } - else if (lang == "ASM_NASM" && + else if (lang == "ASM_MASM" && this->GlobalGenerator->IsMasmEnabled()) { tool = "MASM"; @@ -1715,6 +1741,71 @@ WriteRCOptions(std::string const& configName, this->WriteString("</ResourceCompile>\n", 2); } +//---------------------------------------------------------------------------- +bool cmVisualStudio10TargetGenerator::ComputeMasmOptions() +{ + if(!this->GlobalGenerator->IsMasmEnabled()) + { + return true; + } + std::vector<std::string> const* configs = + this->GlobalGenerator->GetConfigurations(); + for(std::vector<std::string>::const_iterator i = configs->begin(); + i != configs->end(); ++i) + { + if(!this->ComputeMasmOptions(*i)) + { + return false; + } + } + return true; +} + +//---------------------------------------------------------------------------- +bool cmVisualStudio10TargetGenerator::ComputeMasmOptions( + std::string const& configName) +{ + cmsys::auto_ptr<Options> pOptions( + new Options(this->LocalGenerator, Options::MasmCompiler, + this->GetMasmFlagTable())); + Options& masmOptions = *pOptions; + + std::string CONFIG = cmSystemTools::UpperCase(configName); + std::string configFlagsVar = std::string("CMAKE_ASM_MASM_FLAGS_") + CONFIG; + std::string flags = + std::string(this->Makefile->GetSafeDefinition("CMAKE_ASM_MASM_FLAGS")) + + std::string(" ") + + std::string(this->Makefile->GetSafeDefinition(configFlagsVar)); + + masmOptions.Parse(flags.c_str()); + this->MasmOptions[configName] = pOptions.release(); + return true; +} + +void cmVisualStudio10TargetGenerator:: +WriteMasmOptions(std::string const& configName, + std::vector<std::string> const& includes) +{ + if(!this->MSTools || !this->GlobalGenerator->IsMasmEnabled()) + { + return; + } + this->WriteString("<MASM>\n", 2); + + // Preprocessor definitions and includes are shared with clOptions. + Options& clOptions = *(this->ClOptions[configName]); + clOptions.OutputPreprocessorDefinitions(*this->BuildFileStream, " ", + "\n", "ASM_MASM"); + + Options& masmOptions = *(this->MasmOptions[configName]); + masmOptions.AppendFlag("IncludePaths", includes); + masmOptions.AppendFlag("IncludePaths", "%(IncludePaths)"); + masmOptions.OutputFlagMap(*this->BuildFileStream, " "); + masmOptions.OutputAdditionalOptions(*this->BuildFileStream, " ", ""); + + this->WriteString("</MASM>\n", 2); +} + void cmVisualStudio10TargetGenerator::WriteLibOptions(std::string const& config) @@ -2059,6 +2150,7 @@ void cmVisualStudio10TargetGenerator::WriteItemDefinitionGroups() this->WriteClOptions(*i, includes); // output rc compile flags <ResourceCompile></ResourceCompile> this->WriteRCOptions(*i, includes); + this->WriteMasmOptions(*i, includes); } // output midl flags <Midl></Midl> this->WriteMidlOptions(*i, includes); diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 4e9bcd1..93b72f4 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -78,6 +78,10 @@ private: bool ComputeRcOptions(std::string const& config); void WriteRCOptions(std::string const& config, std::vector<std::string> const & includes); + bool ComputeMasmOptions(); + bool ComputeMasmOptions(std::string const& config); + void WriteMasmOptions(std::string const& config, + std::vector<std::string> const& includes); bool ComputeLinkOptions(); bool ComputeLinkOptions(std::string const& config); void WriteLinkOptions(std::string const& config); @@ -109,12 +113,14 @@ private: cmIDEFlagTable const* GetRcFlagTable() const; cmIDEFlagTable const* GetLibFlagTable() const; cmIDEFlagTable const* GetLinkFlagTable() const; + cmIDEFlagTable const* GetMasmFlagTable() const; private: typedef cmVisualStudioGeneratorOptions Options; typedef std::map<std::string, Options*> OptionsMap; OptionsMap ClOptions; OptionsMap RcOptions; + OptionsMap MasmOptions; OptionsMap LinkOptions; std::string PathToVcxproj; cmTarget* Target; diff --git a/Source/cmVisualStudioGeneratorOptions.h b/Source/cmVisualStudioGeneratorOptions.h index 47a7c62..8de6017 100644 --- a/Source/cmVisualStudioGeneratorOptions.h +++ b/Source/cmVisualStudioGeneratorOptions.h @@ -28,6 +28,7 @@ public: { Compiler, ResourceCompiler, + MasmCompiler, Linker, FortranCompiler }; diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 89debc5..f51a934 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1679,6 +1679,14 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/MFC") endif() + if(MSVC AND NOT MSVC_VERSION LESS 1310 + AND NOT CMAKE_GENERATOR MATCHES "Visual Studio [67]( |$)" + AND (NOT CMAKE_GENERATOR MATCHES "Visual Studio [89]( |$)" + OR CMAKE_SIZEOF_VOID_P EQUAL 4) + ) + ADD_TEST_MACRO(VSMASM VSMASM) + endif() + if(${CMAKE_GENERATOR} MATCHES "Visual Studio") if(NOT MSVC60) ADD_TEST_MACRO(SBCS SBCS) diff --git a/Tests/VSMASM/CMakeLists.txt b/Tests/VSMASM/CMakeLists.txt new file mode 100644 index 0000000..f2570a3 --- /dev/null +++ b/Tests/VSMASM/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8.12) +project(VSMASM C ASM_MASM) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + add_definitions(-DTESTx64) +else() + add_definitions(-DTESTi386) + set(CMAKE_ASM_MASM_FLAGS "${CMAKE_ASM_MASM_FLAGS} /safeseh") +endif() +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) +add_executable(VSMASM main.c foo.asm) diff --git a/Tests/VSMASM/foo.asm b/Tests/VSMASM/foo.asm new file mode 100644 index 0000000..51cb969 --- /dev/null +++ b/Tests/VSMASM/foo.asm @@ -0,0 +1,7 @@ +ifndef TESTx64 +.386 +.model flat, c +endif +.code +include <foo-proc.asm> +end diff --git a/Tests/VSMASM/include/foo-proc.asm b/Tests/VSMASM/include/foo-proc.asm new file mode 100644 index 0000000..e8ba5dc --- /dev/null +++ b/Tests/VSMASM/include/foo-proc.asm @@ -0,0 +1,4 @@ +foo proc public + mov eax,0 + ret +foo endp diff --git a/Tests/VSMASM/main.c b/Tests/VSMASM/main.c new file mode 100644 index 0000000..570ba16 --- /dev/null +++ b/Tests/VSMASM/main.c @@ -0,0 +1,2 @@ +extern int foo(void); +int main(void) { return foo(); } |