void BuildTool::BuildModule( const std::vector<FileToBuild>& buildFileList, const std::vector<FileSystemUtils::Path>& includeDirList, const std::vector<FileSystemUtils::Path>& libraryDirList, const std::vector<FileSystemUtils::Path>& linkLibraryList, const char* pCompileOptions, const char* pLinkOptions, const FileSystemUtils::Path& moduleName ) { // Initial version is very basic, simply compiles them. Path objectFileExtension = m_Compiler.GetObjectFileExtension(); vector<Path> compileFileList; // List of files we pass to the compiler compileFileList.reserve( buildFileList.size() ); vector<Path> forcedCompileFileList; // List of files which must be compiled even if object file exists vector<Path> nonForcedCompileFileList; // List of files which can be linked if already compiled // Seperate into seperate file lists of force and non-forced, // so we can ensure we don't have the same file in both for( size_t i = 0; i < buildFileList.size(); ++i ) { Path buildFile = buildFileList[i].filePath; if( buildFileList[i].forceCompile ) { if( find( forcedCompileFileList.begin(), forcedCompileFileList.end(), buildFile ) == forcedCompileFileList.end() ) { forcedCompileFileList.push_back( buildFile ); } } else { if( find( nonForcedCompileFileList.begin(), nonForcedCompileFileList.end(), buildFile ) == nonForcedCompileFileList.end() ) { nonForcedCompileFileList.push_back( buildFile ); } } } // Add all forced compile files to build list for( size_t i = 0; i < forcedCompileFileList.size(); ++i ) { compileFileList.push_back( forcedCompileFileList[i] ); } // Add non forced files, but only if they don't exist in forced compile list Path runtimeFolder = m_Compiler.GetRuntimeIntermediatePath(); for( size_t i = 0; i < nonForcedCompileFileList.size(); ++i ) { Path buildFile = nonForcedCompileFileList[i]; if( find( forcedCompileFileList.begin(), forcedCompileFileList.end(), buildFile ) == forcedCompileFileList.end() ) { // Check if we have a pre-compiled object version of this file, and if so use that. Path objectFileName = runtimeFolder/buildFile.Filename(); objectFileName.ReplaceExtension(objectFileExtension.c_str()); if( objectFileName.Exists() && buildFile.Exists() ) { FileSystemUtils::filetime_t objTime = objectFileName.GetLastWriteTime(); if( objTime > m_InitTime && objTime > buildFile.GetLastWriteTime() ) { // we only want to use the object file if it's newer than our start-up time so // we know it's from the current session (so likely compiled with same settings), // and it's newer than the source file buildFile = objectFileName; } } compileFileList.push_back(buildFile); } } m_Compiler.RunCompile( compileFileList, includeDirList, libraryDirList, linkLibraryList, pCompileOptions, pLinkOptions, moduleName ); }
void BuildTool::BuildModule( const std::vector<FileToBuild>& buildFileList_, const CompilerOptions& compilerOptions_, std::vector<FileSystemUtils::Path> linkLibraryList_, const FileSystemUtils::Path& moduleName_ ) { // Initial version is very basic, simply compiles them. Path objectFileExtension = m_Compiler.GetObjectFileExtension(); vector<Path> compileFileList; // List of files we pass to the compiler compileFileList.reserve( buildFileList_.size() ); vector<Path> forcedCompileFileList; // List of files which must be compiled even if object file exists vector<Path> nonForcedCompileFileList; // List of files which can be linked if already compiled // Seperate into seperate file lists of force and non-forced, // so we can ensure we don't have the same file in both for( size_t i = 0; i < buildFileList_.size(); ++i ) { Path buildFile = buildFileList_[i].filePath; if( buildFileList_[i].forceCompile ) { if( find( forcedCompileFileList.begin(), forcedCompileFileList.end(), buildFile ) == forcedCompileFileList.end() ) { forcedCompileFileList.push_back( buildFile ); } } else { if( find( nonForcedCompileFileList.begin(), nonForcedCompileFileList.end(), buildFile ) == nonForcedCompileFileList.end() ) { nonForcedCompileFileList.push_back( buildFile ); } } } // Add all forced compile files to build list for( size_t i = 0; i < forcedCompileFileList.size(); ++i ) { compileFileList.push_back( forcedCompileFileList[i] ); } // runtime folder needs to be aware of compilation level and debug/ // Add non forced files, but only if they don't exist in forced compile list for( size_t i = 0; i < nonForcedCompileFileList.size(); ++i ) { Path buildFile = nonForcedCompileFileList[i]; if( find( forcedCompileFileList.begin(), forcedCompileFileList.end(), buildFile ) == forcedCompileFileList.end() ) { // Check if we have a pre-compiled object version of this file, and if so use that. Path objectFileName = compilerOptions_.intermediatePath / buildFile.Filename(); objectFileName.ReplaceExtension(objectFileExtension.c_str()); if( objectFileName.Exists() && buildFile.Exists() ) { FileSystemUtils::filetime_t objTime = objectFileName.GetLastWriteTime(); if( objTime > buildFile.GetLastWriteTime() ) { // we only want to use the object file if it's newer than the source file buildFile = objectFileName; } } compileFileList.push_back(buildFile); } } m_Compiler.RunCompile( compileFileList, compilerOptions_, linkLibraryList_, moduleName_ ); }