From 9ad2bdb2ae9f600e8fe372e9c9001f5d7b7ee32d Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 10 Jun 2025 19:25:10 +0200 Subject: [PATCH 01/12] Warn when unable to read log --- source/projectGenerator_compiler.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/projectGenerator_compiler.cpp b/source/projectGenerator_compiler.cpp index 817df4e..319b0f8 100644 --- a/source/projectGenerator_compiler.cpp +++ b/source/projectGenerator_compiler.cpp @@ -287,6 +287,10 @@ popd\n"; } else if (error) { outputError("Unknown error detected. See ffvs_log.txt for further details.", false); } + } else { + outputError("Could not read compilation error log (ffvs_log.txt)", false); + outputError("The compiler failed but error details are not available", false); + outputError("Check that the compiler batch file executed correctly and generated the error log", false); } // Remove the compile files deleteFile("ffvs_compile.bat"); From 47a65f2c1dd013045c5f560c5cf85160c12550b0 Mon Sep 17 00:00:00 2001 From: softworkz Date: Wed, 11 Jun 2025 04:27:05 +0200 Subject: [PATCH 02/12] Add bin2c.exe tool It was simply compiled by cl.exe ffbuild/bin2c.c (no params) Signed-off-by: softworkz --- .gitignore | 3 ++- bin2c.exe | Bin 0 -> 152064 bytes project_generate.vcxproj | 3 +++ project_generate.vcxproj.filters | 3 +++ source/Templates.rc | Bin 1028 -> 1074 bytes source/projectGenerator.cpp | 1 + 6 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 bin2c.exe diff --git a/.gitignore b/.gitignore index f281046..cbdec96 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ *.ilk [Bb]in/* !smp_* -*Caches/ \ No newline at end of file +*Caches/ +!bin2c.exe diff --git a/bin2c.exe b/bin2c.exe new file mode 100644 index 0000000000000000000000000000000000000000..093eb1dad5ecd676d1ef13a987b480b160c5af6e GIT binary patch literal 152064 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%0DS&{oTvEKSDk%?o6g)>VQ^cBL;g64ik_}NpE-f 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
    UR?}cr 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

    n4-WNYZ4+=$s_DdVW*hE@ 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 + + + {FA1D2C31-D809-4021-9DE4-7552704175EE} ffmpeg_generate diff --git a/project_generate.vcxproj.filters b/project_generate.vcxproj.filters index b6203bd..4f648f9 100644 --- a/project_generate.vcxproj.filters +++ b/project_generate.vcxproj.filters @@ -62,4 +62,7 @@ Resource Files + + + \ No newline at end of file diff --git a/source/Templates.rc b/source/Templates.rc index e32aca537cad5b3e2a21fabb41a35490f7fd7610..36fa6066b8b3c628a1e35fee942a06aabaa0f78a 100644 GIT binary patch delta 37 rcmZqS*u=4cg@xIW!Ej={s8|w1CPN;B5koSA9z!Za1rRGSa4`S?nkokA delta 7 OcmdnQ(ZaETg#`c! Date: Wed, 11 Jun 2025 09:22:36 +0200 Subject: [PATCH 03/12] Add support for fftools/resources Latest FFmpeg has resources which need similar treatment like .cu files. Signed-off-by: softworkz --- include/projectGenerator.h | 16 +++ source/projectGenerator.cpp | 231 +++++++++++++++++++++++++++++++ source/projectGenerator_pass.cpp | 147 +++++++++++++++++++- 3 files changed, 392 insertions(+), 2 deletions(-) diff --git a/include/projectGenerator.h b/include/projectGenerator.h index e394163..0e2b47d 100644 --- a/include/projectGenerator.h +++ b/include/projectGenerator.h @@ -445,6 +445,22 @@ class ProjectGenerator */ void outputCUDATools(string& projectTemplate) const; + /** + * Output resource source files (HTML/CSS) with custom build steps. + * @param [in,out] fileList The list of resource files to process. + * @param [in,out] projectTemplate The project template. + * @param [in,out] filterTemplate The filter template. + * @param [in,out] foundObjects The list of found object files. + * @param [in,out] foundFilters The set of found filters. + * @param staticOnly True to only include in static builds. + * @param sharedOnly True to only include in shared builds. + * @param bit32Only True to only include in 32-bit builds. + * @param bit64Only True to only include in 64-bit builds. + */ + void outputResourceSourceFiles(StaticList& fileList, string& projectTemplate, string& filterTemplate, + StaticList& foundObjects, set& foundFilters, bool staticOnly = false, bool sharedOnly = false, + bool bit32Only = false, bool bit64Only = false) const; + bool outputDependencyLibs(string& projectTemplate, bool winrt, bool program); /** diff --git a/source/projectGenerator.cpp b/source/projectGenerator.cpp index 23b053a..ed39100 100644 --- a/source/projectGenerator.cpp +++ b/source/projectGenerator.cpp @@ -1086,6 +1086,40 @@ void ProjectGenerator::outputSourceFiles(string& projectTemplate, string& filter } } + // Process resource files (HTML/CSS) from OBJS-resman + StaticList resourceFiles; + auto resmanIt = m_unknowns.find("OBJS-resman"); + if (resmanIt != m_unknowns.end()) { + for (const auto& resFile : resmanIt->second) { + // Convert .o extension back to source file + string sourceFile = resFile; + if (sourceFile.length() > 2 && sourceFile.substr(sourceFile.length() - 2) == ".o") { + sourceFile = sourceFile.substr(0, sourceFile.length() - 2); + // Check if this is a resource file we can process + if (sourceFile.find(".html") != string::npos || sourceFile.find(".css") != string::npos) { + resourceFiles.push_back(sourceFile); + + // Copy bin2c.exe if needed for resource processing + static bool bin2cCopied = false; + if (!bin2cCopied) { + string bin2cContent; + if (loadFromResourceFile(BIN2C_EXE_ID, bin2cContent)) { + string bin2cPath = m_configHelper.m_solutionDirectory + "bin2c.exe"; + if (writeToFile(bin2cPath, bin2cContent, true)) { + bin2cCopied = true; + } + } + } + } + } + } + + // Process resource files if any were found + if (!resourceFiles.empty()) { + outputResourceSourceFiles(resourceFiles, projectTemplate, filterTemplate, foundObjects, foundFilters); + } + } + // Output header files in new item group outputSourceFileType( m_includesH, "ClInclude", "Header", projectTemplate, filterTemplate, foundObjects, foundFilters, false); @@ -1632,6 +1666,203 @@ void ProjectGenerator::outputASMTools(string& projectTemplate) const } } +void ProjectGenerator::outputResourceSourceFiles(StaticList& fileList, string& projectTemplate, string& filterTemplate, + StaticList& foundObjects, set& foundFilters, bool staticOnly, bool sharedOnly, bool bit32Only, bool bit64Only) const +{ + // Constants for resource build + const string itemGroup = "\r\n "; + const string itemGroupEnd = "\r\n "; + const string includeClose = "\">"; + const string includeEnd = "\" />"; + const string typeInclude = "\r\n true"; + const string buildConfigsStatic[] = {"Release", "Debug", "ReleaseWinRT", "DebugWinRT"}; + const string buildConfigsShared[] = {"ReleaseDLL", "ReleaseDLLStaticDeps", "DebugDLL", "ReleaseDLLWinRT", + "ReleaseDLLWinRTStaticDeps", "DebugDLLWinRT"}; + + if (fileList.size() > 0) { + string resourceFiles = itemGroup; + string resourceFilesFilt = itemGroup; + string resourceFilesTemp, resourceFilesFiltTemp; + + for (const auto& i : fileList) { + // Resource custom build entry + resourceFilesTemp = typeInclude; + resourceFilesFiltTemp = typeInclude; + + // Add the fileName with full project-relative path + string file = i; + string fullPath; + if (findSourceFile(file.substr(0, file.rfind('.')), file.substr(file.rfind('.')), fullPath)) { + m_configHelper.makeFileProjectRelative(fullPath, file); + } + replace(file.begin(), file.end(), '/', '\\'); + resourceFilesTemp += file; + resourceFilesFiltTemp += file; + + // Get resource name without path or extension for generated .c file + uint pos = i.rfind('/') + 1; + string resourceName = i.substr(pos); + uint pos2 = resourceName.rfind('.'); + string extension = resourceName.substr(pos2); + resourceName.resize(pos2); + string outputCFile = "$(IntDir)\\" + resourceName + extension + ".c"; + + // Add the filters Filter + string sourceDir; + m_configHelper.makeFileProjectRelative(m_configHelper.m_rootDirectory, sourceDir); + pos = i.rfind(sourceDir); + pos = (pos == string::npos) ? 0 : pos + sourceDir.length(); + resourceFilesFiltTemp += includeClose; + resourceFilesFiltTemp += filterSource; + uint folderLength = i.rfind('/') - pos; + if (static_cast(folderLength) != -1) { + string folderName = file.substr(pos, folderLength); + folderName = '\\' + folderName; + foundFilters.insert("Source Files" + folderName); + resourceFilesFiltTemp += folderName; + } + resourceFilesFiltTemp += filterEnd; + resourceFilesFiltTemp += typeIncludeEnd; + + // Add resource compilation commands + resourceFilesTemp += includeClose; + + if (extension == ".css") { + // CSS processing: minify then convert to C array + string minFile = "$(IntDir)\\" + resourceName + ".css.min"; + string varName = resourceName; + replace(varName.begin(), varName.end(), '.', '_'); + varName += "_css"; + + resourceFilesTemp += "\r\n powershell -Command \"(Get-Content '%(FullPath)' -Raw) -replace '/\\*.*?\\*/', '' -replace '\\r?\\n', ' ' -replace '\\s+', ' ' -replace '^\\s+|\\s+$', '' | Out-File '" + minFile + "' -NoNewline -Encoding ASCII\" && \"$(ProjectDir)bin2c.exe\" \"" + minFile + "\" \"" + outputCFile + "\" " + varName + ""; + } else if (extension == ".html") { + // HTML processing: direct conversion to C array + string varName = resourceName; + replace(varName.begin(), varName.end(), '.', '_'); + varName += "_html"; + + resourceFilesTemp += "\r\n \"$(ProjectDir)bin2c.exe\" \"%(FullPath)\" \"" + outputCFile + "\" " + varName + ""; + } else { + // Generic resource processing + string varName = resourceName; + replace(varName.begin(), varName.end(), '.', '_'); + varName += "_" + extension.substr(1); // Remove the dot from extension + + resourceFilesTemp += "\r\n \"$(ProjectDir)bin2c.exe\" \"%(FullPath)\" \"" + outputCFile + "\" " + varName + ""; + } + + resourceFilesTemp += "\r\n " + outputCFile + ""; + resourceFilesTemp += "\r\n Converting resource file %(Filename)%(Extension)"; + + // Check if this file should be disabled under certain configurations + if (staticOnly || sharedOnly) { + const string* buildConfig = nullptr; + uint configs = 0; + if (staticOnly) { + buildConfig = buildConfigsShared; + configs = sizeof(buildConfigsShared) / sizeof(buildConfigsShared[0]); + } else { + buildConfig = buildConfigsStatic; + configs = sizeof(buildConfigsStatic) / sizeof(buildConfigsStatic[0]); + } + for (uint j = 0; j < configs; j++) { + resourceFilesTemp += excludeConfig; + resourceFilesTemp += buildConfig[j]; + resourceFilesTemp += excludeConfigEnd; + } + } else if (bit32Only || bit64Only) { + resourceFilesTemp += excludeConfigPlatform; + if (bit32Only) { + resourceFilesTemp += "x64"; + } else { + resourceFilesTemp += "Win32"; + } + resourceFilesTemp += excludeConfigEnd; + } + + resourceFilesTemp += typeIncludeEnd; + + // Add to output + resourceFiles += resourceFilesTemp; + resourceFilesFilt += resourceFilesFiltTemp; + } + + resourceFiles += itemGroupEnd; + resourceFilesFilt += itemGroupEnd; + + // Add generated .c files for compilation with explicit dependencies + string cFiles = itemGroup; + string cFilesFilt = itemGroup; + for (const auto& i : fileList) { + uint pos = i.rfind('/') + 1; + string resourceName = i.substr(pos); + uint pos2 = resourceName.rfind('.'); + string extension = resourceName.substr(pos2); + resourceName.resize(pos2); + string outputCFile = "$(IntDir)\\" + resourceName + extension + ".c"; + string origResourceFile = i; + replace(origResourceFile.begin(), origResourceFile.end(), '/', '\\'); + + // ClCompile entry with explicit dependency + cFiles += "\r\n "; + cFiles += "\r\n " + origResourceFile + ""; + + // Check if this file should be disabled under certain configurations + if (staticOnly || sharedOnly) { + const string* buildConfig = nullptr; + uint configs = 0; + if (staticOnly) { + buildConfig = buildConfigsShared; + configs = sizeof(buildConfigsShared) / sizeof(buildConfigsShared[0]); + } else { + buildConfig = buildConfigsStatic; + configs = sizeof(buildConfigsStatic) / sizeof(buildConfigsStatic[0]); + } + for (uint j = 0; j < configs; j++) { + cFiles += "\r\n " + "true"; + } + } else if (bit32Only || bit64Only) { + cFiles += "\r\n " + string("true"); + } + + cFiles += "\r\n "; + + // Filter entry for generated .c file + cFilesFilt += "\r\n "; + cFilesFilt += "\r\n Source Files\\Generated"; + cFilesFilt += "\r\n "; + } + cFiles += itemGroupEnd; + cFilesFilt += itemGroupEnd; + + // Add the Generated filter + foundFilters.insert("Source Files\\Generated"); + + // After add the item groups for resource files + string endTag = ""; + uint findPos = projectTemplate.rfind(endTag); + findPos += endTag.length(); + uint findPosFilt = filterTemplate.rfind(endTag); + findPosFilt += endTag.length(); + + // Insert into output file + projectTemplate.insert(findPos, resourceFiles + cFiles); + filterTemplate.insert(findPosFilt, resourceFilesFilt + cFilesFilt); + } +} + void ProjectGenerator::outputCUDATools(string& projectTemplate) const { if (m_configHelper.isCUDAEnabled() && (m_includesCU.size() > 0)) { diff --git a/source/projectGenerator_pass.cpp b/source/projectGenerator_pass.cpp index 0a5c365..83ea1e2 100644 --- a/source/projectGenerator_pass.cpp +++ b/source/projectGenerator_pass.cpp @@ -525,6 +525,17 @@ bool ProjectGenerator::passMake() return false; } } + } else if (m_inLine.substr(0, 11) == "OBJS-resman") { + // Find position after "+=" + uint startPos = m_inLine.find("+="); + if (startPos != string::npos) { + startPos += 2; // Skip past "+=" + // Found resource manager objects - store for later resolution + if (!passStaticInclude(startPos, m_unknowns["OBJS-resman"])) { + m_inputFile.close(); + return false; + } + } } else if (m_inLine.substr(0, 7) == "HEADERS") { // Found some headers if (m_inLine.at(7) == '-') { @@ -681,7 +692,7 @@ bool ProjectGenerator::passMake() } makeFiles.push_back(newMake); // Add to internal list of known subdirectories - const uint rootPos = newMake.find(m_configHelper.m_rootDirectory); + const uint rootPos = newMake.find(m_configHelper.m_rootDirectory); if (rootPos != string::npos) { newMake.erase(rootPos, m_configHelper.m_rootDirectory.length()); } @@ -720,6 +731,8 @@ bool ProjectGenerator::passMake() bool ProjectGenerator::passProgramMake() { uint checks = 2; + vector makeFiles; // Track additional includes + while (checks >= 1) { // Open the input Makefile string makeFile = m_projectDir + "MakeFile"; @@ -810,9 +823,133 @@ bool ProjectGenerator::passProgramMake() return false; } } + } else if (m_inLine.substr(0, 11) == "OBJS-resman") { + // Find position after "+=" + uint startPos = m_inLine.find("+="); + if (startPos != string::npos) { + startPos += 2; // Skip past "+=" + // Found resource manager objects - store for later resolution + if (!passStaticInclude(startPos, m_unknowns["OBJS-resman"])) { + m_inputFile.close(); + return false; + } + } + } else if (m_inLine.substr(0, 7) == "include" || m_inLine.substr(0, 8) == "-include") { + // Need to append the included file to makefile list + uint startPos = m_inLine.find_first_not_of(" \t", 7 + (m_inLine[0] == '-' ? 1 : 0)); + uint endPos = m_inLine.find_first_of(" \t\n\r", startPos + 1); + endPos = (endPos == string::npos) ? endPos : endPos - startPos; + string newMake = m_inLine.substr(startPos, endPos); + + // Check if this include contains function parameters (like $(1), $(2), etc.) and skip it + if (newMake.find("$(1)") != string::npos || newMake.find("$(2)") != string::npos || + newMake.find("$(3)") != string::npos || newMake.find("$(prog)") != string::npos || + newMake.find("$(P)") != string::npos) { + continue; // Skip this include as it's part of a Make function definition + } + + // Perform token substitution + startPos = newMake.find('$'); + while (startPos != string::npos) { + endPos = newMake.find(')', startPos + 1); + if (endPos == string::npos) { + outputError("Invalid token in include (" + newMake + ")"); + return false; + } + ++endPos; + string token = newMake.substr(startPos, endPos - startPos); + if (token == "$(SRC_PATH)") { + newMake.replace(startPos, endPos - startPos, m_configHelper.m_rootDirectory); + } else if (token == "$(ARCH)") { + newMake.replace(startPos, endPos - startPos, "x86"); + } else { + outputError("Unknown token in include (" + token + ")"); + return false; + } + startPos = newMake.find('$', startPos); + } + + makeFiles.push_back(newMake); } } m_inputFile.close(); + + // Process any included makefiles + while (!makeFiles.empty()) { + const string includedMakeFile = makeFiles.back(); + makeFiles.pop_back(); + outputLine(" Generating from Makefile (" + includedMakeFile + ")..."); + + // Open the included Makefile + ifstream includedFile(includedMakeFile); + if (includedFile.is_open()) { + string includedLine; + while (getline(includedFile, includedLine)) { + // Process OBJS-resman lines in included files + if (includedLine.length() >= 11 && includedLine.substr(0, 11) == "OBJS-resman") { + // Only process OBJS-resman for ffmpeg project + if (m_projectName == "ffmpeg") { + // Handle multi-line declarations directly here instead of using passStaticInclude + // to avoid file context mismatch + string fullLine = includedLine; + + // Read continuation lines from the included file + while (fullLine.back() == '\\') { + string nextLine; + if (getline(includedFile, nextLine)) { + fullLine += " " + nextLine; // Append with space + } else { + break; // No more lines + } + } + + // Now parse the complete line manually + uint startPos = fullLine.find("+="); + if (startPos != string::npos) { + startPos += 2; // Skip past "+=" + + // Parse files from the line + uint pos = fullLine.find_first_not_of("+=: \t", startPos); + while (pos != string::npos && pos < fullLine.length()) { + // Skip backslashes and whitespace + if (fullLine[pos] == '\\' || fullLine[pos] == ' ' || fullLine[pos] == '\t') { + pos = fullLine.find_first_not_of(" \t\\", pos + 1); + continue; + } + + // Find end of current file + uint endPos = fullLine.find_first_of(" \t\\", pos); + if (endPos == string::npos) { + endPos = fullLine.length(); + } + + string file = fullLine.substr(pos, endPos - pos); + if (!file.empty() && file != "+=" && file != "OBJS-resman") { + // Special handling for resman.o - convert to resman since it's a real source file + if (file == "fftools/resources/resman.o") { + string sourceFile = "fftools/resources/resman"; + m_includes.push_back(sourceFile); + outputInfo("Found Static: '" + sourceFile + ".c' (converted from resman.o)"); + } + + // Store in unknowns for $(OBJS-resman) resolution + // These are object files that will be resolved when $(OBJS-resman) is encountered + m_unknowns["OBJS-resman"].push_back(file); + outputInfo("Found Static: '" + file + "' (stored for $(OBJS-resman) resolution)"); + } + + pos = fullLine.find_first_not_of(" \t\\", endPos); + } + } + } + } + } + includedFile.close(); + } else { + outputInfo("Could not open included MakeFile (" + includedMakeFile + ")"); + } + } + if (checks == 2) { string ignored; const string makeFolder = "fftools/"; @@ -829,9 +966,15 @@ bool ProjectGenerator::passProgramMake() uint uiPos; for (auto i = m_includes.begin(); i < m_includes.end(); ++i) { if ((uiPos = i->find(makeFolder)) != string::npos) { - i->erase(uiPos, makeFolder.length()); + // Don't strip fftools/ prefix from resman as it's a real source file in that location + if (*i != "fftools/resources/resman") { + i->erase(uiPos, makeFolder.length()); + } else { + // Keep full path for resman.c + } } } + --checks; } From e9eec3245afb4e4363c3059f1d5c1047b3f55b56 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 21 Feb 2026 09:02:01 +0100 Subject: [PATCH 04/12] Add smp_common.props --- project_generate.vcxproj | 1 + project_generate.vcxproj.filters | 1 + source/Templates.rc | Bin 1074 -> 1154 bytes source/projectGenerator.cpp | 11 ++++++ templates/smp_common.props | 53 +++++++++++++++++++++++++++ templates/template_in.vcxproj | 1 + templates/templateprogram_in.vcxproj | 3 ++ 7 files changed, 70 insertions(+) create mode 100644 templates/smp_common.props diff --git a/project_generate.vcxproj b/project_generate.vcxproj index 0b0d2f0..f2976b7 100644 --- a/project_generate.vcxproj +++ b/project_generate.vcxproj @@ -40,6 +40,7 @@ + {FA1D2C31-D809-4021-9DE4-7552704175EE} diff --git a/project_generate.vcxproj.filters b/project_generate.vcxproj.filters index 4f648f9..ac05d8b 100644 --- a/project_generate.vcxproj.filters +++ b/project_generate.vcxproj.filters @@ -64,5 +64,6 @@ + \ No newline at end of file diff --git a/source/Templates.rc b/source/Templates.rc index 36fa6066b8b3c628a1e35fee942a06aabaa0f78a..6f20931c9ebb5f4195410cde3dc8686e2428c1fb 100644 GIT binary patch delta 52 zcmdnQ(ZspIh=tjZ!Dw libraries; m_configHelper.getConfigList("LIBRARY_LIST", libraries); diff --git a/templates/smp_common.props b/templates/smp_common.props new file mode 100644 index 0000000..ab5869a --- /dev/null +++ b/templates/smp_common.props @@ -0,0 +1,53 @@ + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + + + %(AdditionalLibraryDirectories) + + + diff --git a/templates/template_in.vcxproj b/templates/template_in.vcxproj index 9ca51d8..6952789 100644 --- a/templates/template_in.vcxproj +++ b/templates/template_in.vcxproj @@ -6,6 +6,7 @@ + diff --git a/templates/templateprogram_in.vcxproj b/templates/templateprogram_in.vcxproj index 9d7734b..04371e5 100644 --- a/templates/templateprogram_in.vcxproj +++ b/templates/templateprogram_in.vcxproj @@ -98,6 +98,9 @@ + + + From aa83718677cfe319e57370bd1ce3a0452037dc98 Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 24 Feb 2026 00:07:00 +0100 Subject: [PATCH 05/12] Remove invalid AfterTargets value for CustomBuild --- project_generate.vcxproj | 4 ++++ templates/smp_deps.props | 10 ---------- templates/smp_winrt_deps.props | 10 ---------- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/project_generate.vcxproj b/project_generate.vcxproj index f2976b7..58726ab 100644 --- a/project_generate.vcxproj +++ b/project_generate.vcxproj @@ -41,6 +41,10 @@ + + + + {FA1D2C31-D809-4021-9DE4-7552704175EE} diff --git a/templates/smp_deps.props b/templates/smp_deps.props index fbd1880..3b5ffb1 100644 --- a/templates/smp_deps.props +++ b/templates/smp_deps.props @@ -115,52 +115,42 @@ $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 diff --git a/templates/smp_winrt_deps.props b/templates/smp_winrt_deps.props index ed14af6..05ee17a 100644 --- a/templates/smp_winrt_deps.props +++ b/templates/smp_winrt_deps.props @@ -128,52 +128,42 @@ $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 $(ProjectDir)obj\Generated - Clean MSB8012 From b16c36f8c177bc05f54950f0be7af280027990ff Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 24 Feb 2026 03:16:20 +0100 Subject: [PATCH 06/12] Fix intermediate output dir The $(Project) variable is not always available, causing intermediate outputs from all projects going into the same directory --- templates/smp_deps.props | 2 +- templates/smp_winrt_deps.props | 2 +- templates/templateprogram_in.vcxproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/smp_deps.props b/templates/smp_deps.props index 3b5ffb1..876bac2 100644 --- a/templates/smp_deps.props +++ b/templates/smp_deps.props @@ -45,7 +45,7 @@ $(ProjectDir)..\..\..\msvc\ $(OutBaseDir)bin\$(Platform)\ - $(ProjectDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\ + $(ProjectDir)obj\$(Configuration)\$(Platform)\$(MSBuildProjectName)\ $(RootNamespace) lib$(RootNamespace)d $(RootNamespace)d diff --git a/templates/smp_winrt_deps.props b/templates/smp_winrt_deps.props index 05ee17a..563e89f 100644 --- a/templates/smp_winrt_deps.props +++ b/templates/smp_winrt_deps.props @@ -45,7 +45,7 @@ $(ProjectDir)..\..\..\msvc\ $(OutBaseDir)bin\$(Platform)\ - $(ProjectDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\ + $(ProjectDir)obj\$(Configuration)\$(Platform)\$(MSBuildProjectName)\ $(RootNamespace)_winrt lib$(RootNamespace)d_winrt $(RootNamespace)d_winrt diff --git a/templates/templateprogram_in.vcxproj b/templates/templateprogram_in.vcxproj index 04371e5..83eae1f 100644 --- a/templates/templateprogram_in.vcxproj +++ b/templates/templateprogram_in.vcxproj @@ -37,7 +37,7 @@ template_outdir $(OutBaseDir)bin\$(Platform)\ - $(ProjectDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\ + $(ProjectDir)obj\$(Configuration)\$(Platform)\$(MSBuildProjectName)\ template_in template_ind template_ind From 3bd0a4022397a32f3a2df56469591615595bbac3 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 21 Feb 2026 09:03:22 +0100 Subject: [PATCH 07/12] Add support for libvpl (OneVPL) --- source/configGenerator_build.cpp | 25 +++++++++++++++++++++++-- source/projectGenerator_build.cpp | 11 ++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/source/configGenerator_build.cpp b/source/configGenerator_build.cpp index 2867e48..70edf5a 100644 --- a/source/configGenerator_build.cpp +++ b/source/configGenerator_build.cpp @@ -369,6 +369,8 @@ bool ConfigGenerator::buildAutoDetectValues() enable = true; } else if (i == "metal") { enable = false; + } else if (i == "qsv") { + enable = isConfigOptionEnabled("libmfx") || isConfigOptionEnabled("libvpl"); } else if (i == "nvdec") { enable = (findFile(m_rootDirectory + "compat/cuda/dynlink_loader.h", sFileName) && findFile(m_rootDirectory + "compat/cuda/dynlink_cuda.h", sFileName)); @@ -721,10 +723,24 @@ void ConfigGenerator::buildReplaceValues( } opt = getConfigOptionPrefixed("CONFIG_LIBMFX"); if ((opt != m_configValues.end()) && opt->m_value == "1") { - replaceValues["CONFIG_LIBMFX"] = "#if " + winrtDefine + "\n\ + auto optVpl = getConfigOptionPrefixed("CONFIG_LIBVPL"); + if ((optVpl != m_configValues.end()) && optVpl->m_value == "1") { + // libmfx was enabled internally to satisfy deps; output 0 since libvpl is the actual dispatcher + replaceValues["CONFIG_LIBMFX"] = "#define CONFIG_LIBMFX 0"; + } else { + replaceValues["CONFIG_LIBMFX"] = "#if " + winrtDefine + "\n\ # define CONFIG_LIBMFX 1\n\ #else\n\ # define CONFIG_LIBMFX 0\n\ +#endif"; + } + } + opt = getConfigOptionPrefixed("CONFIG_LIBVPL"); + if ((opt != m_configValues.end()) && opt->m_value == "1") { + replaceValues["CONFIG_LIBVPL"] = "#if " + winrtDefine + "\n\ +# define CONFIG_LIBVPL 1\n\ +#else\n\ +# define CONFIG_LIBVPL 0\n\ #endif"; } opt = getConfigOptionPrefixed("CONFIG_AMF"); @@ -1119,7 +1135,9 @@ void ConfigGenerator::buildAdditionalDependencies(DependencyList& additionalDepe if (!isConfigOptionValid("atomics_native")) { additionalDependencies["atomics_native"] = true; } - additionalDependencies["MFX_CODEC_VP9"] = isConfigOptionEnabled("libmfx"); + const bool bQSV = isConfigOptionEnabled("libmfx") || isConfigOptionEnabled("libvpl"); + additionalDependencies["MFX_CODEC_VP9"] = bQSV; + additionalDependencies["MFXLoad"] = isConfigOptionEnabled("libvpl"); bool bNvenc = isConfigOptionEnabled("nvenc"); additionalDependencies["NV_ENC_PIC_PARAMS_AV1"] = bNvenc; const auto spirv = getConfigOption("spirv_compiler"); @@ -1245,6 +1263,9 @@ void ConfigGenerator::buildForcedEnables(const string& optionLower, vector& projectDeps) ((m_projectName == "libavfilter") && (findSourceFile("vf_deinterlace_qsv", ".c", notUsed) || findSourceFile("vf_stack_qsv", ".c", notUsed))) || (m_projectName == "ffmpeg") || (m_projectName == "avconv"); + projectDeps["libvpl"] = ((m_projectName == "libavutil") && findSourceFile("hwcontext_qsv", ".h", notUsed)) || + (m_projectName == "libavcodec") || + ((m_projectName == "libavfilter") && + (findSourceFile("vf_deinterlace_qsv", ".c", notUsed) || findSourceFile("vf_stack_qsv", ".c", notUsed))) || + (m_projectName == "ffmpeg") || (m_projectName == "avconv"); projectDeps["libmodplug"] = (m_projectName == "libavformat"); projectDeps["libmp3lame"] = (m_projectName == "libavcodec"); projectDeps["libnpp"] = (m_projectName == "libavfilter"); @@ -546,7 +554,8 @@ void ProjectGenerator::buildProjectDependencies(map& projectDeps) projectDeps["sdl2"] = (m_projectName == "libavdevice") || (m_projectName == "ffplay") || (m_projectName == "avplay"); projectDeps["vapoursynth"] = m_projectName == "libavformat"; - projectDeps["vulkan"] = (m_projectName == "libavcodec") || (m_projectName == "libavutil"); + projectDeps["vulkan"] = (m_projectName == "libavcodec") || (m_projectName == "libavutil") || + (m_projectName == "libavfilter"); projectDeps["zlib"] = (m_projectName == "libavformat") || (m_projectName == "libavcodec"); } From 04991e0ed61c8e4196935b8ac1648f77cc698d8d Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 24 Feb 2026 01:26:54 +0100 Subject: [PATCH 08/12] Add support for CUDA, OpenCL and SPIRV shader compilation (.cu,.cl,.comp) - Add support for shaderc - Add support for shader (.comp) file conversion to C strings - Add support for OpenCL (.cl) file conversion to C strings - Add support for CUDA PTX compile via NVCC and conversion to C strings Signed-off-by: softworkz --- .gitignore | 7 + include/projectGenerator.h | 16 ++ project_generate.sln | 11 +- project_generate.vcxproj | 28 ++- project_generate.vcxproj.filters | 9 +- bin2c.exe => resources/bin2c.exe | Bin resources/cuda_bin2c.props | 19 ++ resources/cuda_bin2c.targets | 27 +++ resources/cuda_bin2c.xml | 53 ++++++ resources/opencl_source2c.props | 19 ++ resources/opencl_source2c.targets | 27 +++ resources/opencl_source2c.xml | 53 ++++++ resources/source2c.exe | Bin 0 -> 155136 bytes resources/spirv_source2c.props | 19 ++ resources/spirv_source2c.targets | 27 +++ resources/spirv_source2c.xml | 53 ++++++ source/Templates.rc | Bin 1154 -> 2020 bytes source/configGenerator_build.cpp | 18 +- source/projectGenerator.cpp | 306 ++++++++++++++++++++++++++++-- source/projectGenerator_build.cpp | 33 +++- 20 files changed, 698 insertions(+), 27 deletions(-) rename bin2c.exe => resources/bin2c.exe (100%) create mode 100644 resources/cuda_bin2c.props create mode 100644 resources/cuda_bin2c.targets create mode 100644 resources/cuda_bin2c.xml create mode 100644 resources/opencl_source2c.props create mode 100644 resources/opencl_source2c.targets create mode 100644 resources/opencl_source2c.xml create mode 100644 resources/source2c.exe create mode 100644 resources/spirv_source2c.props create mode 100644 resources/spirv_source2c.targets create mode 100644 resources/spirv_source2c.xml diff --git a/.gitignore b/.gitignore index cbdec96..e8178b8 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,10 @@ !smp_* *Caches/ !bin2c.exe +!source2c.exe +!opencl_source2c.props +!opencl_source2c.targets +!opencl_source2c.xml +!cuda_bin2c.props +!cuda_bin2c.targets +!cuda_bin2c.xml diff --git a/include/projectGenerator.h b/include/projectGenerator.h index 0e2b47d..054448b 100644 --- a/include/projectGenerator.h +++ b/include/projectGenerator.h @@ -445,6 +445,22 @@ class ProjectGenerator */ void outputCUDATools(string& projectTemplate) const; + /** + * Output OpenCL source2c build customization to project template. + * @remark Copies source2c.exe and opencl_source2c .props/.targets/.xml to the output directory + * and adds the ExtensionSettings/ExtensionTargets import groups. + * @param [in,out] projectTemplate The project template. + */ + void outputOpenCLTools(string& projectTemplate) const; + + /** + * Output SPIRV source2c build customization to project template. + * @remark Copies source2c.exe and spirv_source2c .props/.targets/.xml to the output directory + * and adds the ExtensionSettings/ExtensionTargets import groups. + * @param [in,out] projectTemplate The project template. + */ + void outputSPIRVTools(string& projectTemplate) const; + /** * Output resource source files (HTML/CSS) with custom build steps. * @param [in,out] fileList The list of resource files to process. diff --git a/project_generate.sln b/project_generate.sln index cb8ff86..01a5d27 100644 --- a/project_generate.sln +++ b/project_generate.sln @@ -1,9 +1,15 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -VisualStudioVersion = 12.0.30501.0 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.37012.4 d17.14 MinimumVisualStudioVersion = 12.0.30501.0 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "project_generate", "project_generate.vcxproj", "{FA1D2C31-D809-4021-9DE4-7552704175EE}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "!Config", "!Config", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" + ProjectSection(SolutionItems) = preProject + newtask\OpenCL_Build.md = newtask\OpenCL_Build.md + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -24,4 +30,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5B060291-F0AE-456C-85C4-754764957A2A} + EndGlobalSection EndGlobal diff --git a/project_generate.vcxproj b/project_generate.vcxproj index 58726ab..e016f9c 100644 --- a/project_generate.vcxproj +++ b/project_generate.vcxproj @@ -1,4 +1,4 @@ - + @@ -39,17 +39,37 @@ - + + + + + + + + + + + + + + + + + + + + {FA1D2C31-D809-4021-9DE4-7552704175EE} ffmpeg_generate project_generate + 10.0 @@ -60,6 +80,7 @@ v141 v140 v120 + v143 Application @@ -69,6 +90,7 @@ v141 v140 v120 + v143 Application @@ -79,6 +101,7 @@ v140 v120 true + v143 Application @@ -89,6 +112,7 @@ v140 v120 true + v143 diff --git a/project_generate.vcxproj.filters b/project_generate.vcxproj.filters index ac05d8b..34d4ddd 100644 --- a/project_generate.vcxproj.filters +++ b/project_generate.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -64,6 +64,13 @@ + + + + + + + \ No newline at end of file diff --git a/bin2c.exe b/resources/bin2c.exe similarity index 100% rename from bin2c.exe rename to resources/bin2c.exe diff --git a/resources/cuda_bin2c.props b/resources/cuda_bin2c.props new file mode 100644 index 0000000..8f58962 --- /dev/null +++ b/resources/cuda_bin2c.props @@ -0,0 +1,19 @@ + + + + + $(IntDir)%(Filename).ptx.c + false + $(TLogLocation) + true + true + + true + ClCompile + true + 0 + 1 + "%CUDA_PATH%\bin\nvcc" -gencode arch=compute_60,code=sm_60 -O2 -m64 -ptx -c -o "$(IntDir)%(Filename).ptx" "%(FullPath)" && "$(ProjectDir)bin2c.exe" "$(IntDir)%(Filename).ptx" "%(Outputs)" %(Filename)_ptx + + + diff --git a/resources/cuda_bin2c.targets b/resources/cuda_bin2c.targets new file mode 100644 index 0000000..372fa75 --- /dev/null +++ b/resources/cuda_bin2c.targets @@ -0,0 +1,27 @@ + + + + + + SelectCudaBin2C + + + + + + + + %(CudaBin2C.FullPath) + %(CudaBin2C.AdditionalInputs);$(MSBuildProjectFile) + + Exec CudaBin2C: %(CudaBin2C.FileName) + + + + + + + + + + diff --git a/resources/cuda_bin2c.xml b/resources/cuda_bin2c.xml new file mode 100644 index 0000000..76603dc --- /dev/null +++ b/resources/cuda_bin2c.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/opencl_source2c.props b/resources/opencl_source2c.props new file mode 100644 index 0000000..9629d07 --- /dev/null +++ b/resources/opencl_source2c.props @@ -0,0 +1,19 @@ + + + + + $(IntDir)%(Filename)_cl.c + false + $(TLogLocation) + true + true + + true + ClCompile + true + 0 + 1 + "$(ProjectDir)source2c.exe" "%(FullPath)" "%(Outputs)" + + + diff --git a/resources/opencl_source2c.targets b/resources/opencl_source2c.targets new file mode 100644 index 0000000..daa9a4b --- /dev/null +++ b/resources/opencl_source2c.targets @@ -0,0 +1,27 @@ + + + + + + SelectOpenCLSource2C + + + + + + + + %(OpenCLSource2C.FullPath) + %(OpenCLSource2C.AdditionalInputs);$(MSBuildProjectFile) + + Exec OpenCLSource2C: %(OpenCLSource2C.FileName) + + + + + + + + + + diff --git a/resources/opencl_source2c.xml b/resources/opencl_source2c.xml new file mode 100644 index 0000000..e786ef2 --- /dev/null +++ b/resources/opencl_source2c.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/source2c.exe b/resources/source2c.exe new file mode 100644 index 0000000000000000000000000000000000000000..fbab31fa355e6cd0a115d30ee984059508953976 GIT binary patch literal 155136 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%0AF1HGPN%Pt5Aj@5u*ZEn1?}m*z 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 B + + + + $(IntDir)%(Filename)_comp.c + false + $(TLogLocation) + true + true + + true + ClCompile + true + 0 + 1 + "$(ProjectDir)source2c.exe" "%(FullPath)" "%(Outputs)" + + + diff --git a/resources/spirv_source2c.targets b/resources/spirv_source2c.targets new file mode 100644 index 0000000..6fa9b27 --- /dev/null +++ b/resources/spirv_source2c.targets @@ -0,0 +1,27 @@ + + + + + + SelectSPIRVSource2C + + + + + + + + %(SPIRVSource2C.FullPath) + %(SPIRVSource2C.AdditionalInputs);$(MSBuildProjectFile) + + Exec SPIRVSource2C: %(SPIRVSource2C.FileName) + + + + + + + + + + diff --git a/resources/spirv_source2c.xml b/resources/spirv_source2c.xml new file mode 100644 index 0000000..9f75dbf --- /dev/null +++ b/resources/spirv_source2c.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/Templates.rc b/source/Templates.rc index 6f20931c9ebb5f4195410cde3dc8686e2428c1fb..45ec7efa7e8e862d6b7f7da5bd4d73e6d185abb3 100644 GIT binary patch literal 2020 zcmcIj+fIW(6r5+jqVWT0cfCIv`vt~#QYqFdEe(s6uUCiN0Ii&o?N-x}E)eF-nalT= z!UPH@z$bV{3&XL7xK^Sb_Mx2+%E&CIJOINo>4)k(Vp8*LB*$c#GE0U`ok#V#VS9HZR+sr9+`0py-Eyf+ zMZW69&hGbAi9Ic-mSOKcnB>Hs$8@;%M)N-6lZuzqPeJOWgs_V!;Yh8MaB_N>l1suY z)(Px*I@I3|D@a`nK`xo{0t-$r+x#d=dBuAU^)-+h BSDOF; delta 21 ccmaFD-^95=hGnt=iv*+5& foundFilters, bool staticOnly, bool sharedOnly, bool bit32Only, bool bit64Only) const { // Constants for resource build @@ -1877,7 +1916,222 @@ void ProjectGenerator::outputResourceSourceFiles(StaticList& fileList, string& p void ProjectGenerator::outputCUDATools(string& projectTemplate) const { if (m_configHelper.isCUDAEnabled() && (m_includesCU.size() > 0)) { - // TODO: Add cuda tools + // Copy bin2c.exe to project directory for CUDA compilation + string bin2cContent; + if (!loadFromResourceFile(BIN2C_EXE_ID, bin2cContent)) { + outputError("Failed to load bin2c.exe from resources"); + return; + } + string bin2cPath = m_configHelper.m_solutionDirectory + "bin2c.exe"; + if (!writeToFile(bin2cPath, bin2cContent, true)) { + outputError("Failed to copy bin2c.exe to project directory"); + return; + } + + // Copy cuda_bin2c.props to project directory + string propsContent; + if (!loadFromResourceFile(CUDA_BIN2C_PROPS_ID, propsContent)) { + outputError("Failed to load cuda_bin2c.props from resources"); + return; + } + string propsPath = m_configHelper.m_solutionDirectory + "cuda_bin2c.props"; + if (!writeToFile(propsPath, propsContent, true)) { + outputError("Failed to copy cuda_bin2c.props to project directory"); + return; + } + + // Copy cuda_bin2c.targets to project directory + string targetsContent; + if (!loadFromResourceFile(CUDA_BIN2C_TARGETS_ID, targetsContent)) { + outputError("Failed to load cuda_bin2c.targets from resources"); + return; + } + string targetsPath = m_configHelper.m_solutionDirectory + "cuda_bin2c.targets"; + if (!writeToFile(targetsPath, targetsContent, true)) { + outputError("Failed to copy cuda_bin2c.targets to project directory"); + return; + } + + // Copy cuda_bin2c.xml to project directory + string xmlContent; + if (!loadFromResourceFile(CUDA_BIN2C_XML_ID, xmlContent)) { + outputError("Failed to load cuda_bin2c.xml from resources"); + return; + } + string xmlPath = m_configHelper.m_solutionDirectory + "cuda_bin2c.xml"; + if (!writeToFile(xmlPath, xmlContent, true)) { + outputError("Failed to copy cuda_bin2c.xml to project directory"); + return; + } + + // Add CUDA build customisation imports + string propsCUDA = "\r\n\ + \r\n\ + \r\n\ + "; + string targetsCUDA = "\r\n\ + \r\n\ + \r\n\ + "; + + const string findProps = R"()"; + const string findTargets = R"()"; + + // Add cuda props import (after first ) + uint findPos = projectTemplate.find(findProps) + findProps.length(); + projectTemplate.insert(findPos, propsCUDA); + // Add cuda targets import (after last ) + findPos = projectTemplate.rfind(findTargets) + findTargets.length(); + projectTemplate.insert(findPos, targetsCUDA); + } +} + +void ProjectGenerator::outputOpenCLTools(string& projectTemplate) const +{ + if (m_configHelper.isOpenCLEnabled() && (m_includesCL.size() > 0)) { + // Copy source2c.exe to project directory + string source2cContent; + if (!loadFromResourceFile(SOURCE2C_EXE_ID, source2cContent)) { + outputError("Failed to load source2c.exe from resources"); + return; + } + string source2cPath = m_configHelper.m_solutionDirectory + "source2c.exe"; + if (!writeToFile(source2cPath, source2cContent, true)) { + outputError("Failed to copy source2c.exe to project directory"); + return; + } + + // Copy opencl_source2c.props to project directory + string propsContent; + if (!loadFromResourceFile(OPENCL_SOURCE2C_PROPS_ID, propsContent)) { + outputError("Failed to load opencl_source2c.props from resources"); + return; + } + string propsPath = m_configHelper.m_solutionDirectory + "opencl_source2c.props"; + if (!writeToFile(propsPath, propsContent, true)) { + outputError("Failed to copy opencl_source2c.props to project directory"); + return; + } + + // Copy opencl_source2c.targets to project directory + string targetsContent; + if (!loadFromResourceFile(OPENCL_SOURCE2C_TARGETS_ID, targetsContent)) { + outputError("Failed to load opencl_source2c.targets from resources"); + return; + } + string targetsPath = m_configHelper.m_solutionDirectory + "opencl_source2c.targets"; + if (!writeToFile(targetsPath, targetsContent, true)) { + outputError("Failed to copy opencl_source2c.targets to project directory"); + return; + } + + // Copy opencl_source2c.xml to project directory + string xmlContent; + if (!loadFromResourceFile(OPENCL_SOURCE2C_XML_ID, xmlContent)) { + outputError("Failed to load opencl_source2c.xml from resources"); + return; + } + string xmlPath = m_configHelper.m_solutionDirectory + "opencl_source2c.xml"; + if (!writeToFile(xmlPath, xmlContent, true)) { + outputError("Failed to copy opencl_source2c.xml to project directory"); + return; + } + + // Add OpenCL build customisation imports + string propsOpenCL = "\r\n\ + \r\n\ + \r\n\ + "; + string targetsOpenCL = "\r\n\ + \r\n\ + \r\n\ + "; + + const string findProps = R"()"; + const string findTargets = R"()"; + + // Add opencl props import (after first ) + uint findPos = projectTemplate.find(findProps) + findProps.length(); + projectTemplate.insert(findPos, propsOpenCL); + // Add opencl targets import (after last ) + findPos = projectTemplate.rfind(findTargets) + findTargets.length(); + projectTemplate.insert(findPos, targetsOpenCL); + } +} + +void ProjectGenerator::outputSPIRVTools(string& projectTemplate) const +{ + if (m_configHelper.isSPIRVEnabled() && (m_includesCOMP.size() > 0)) { + // Copy source2c.exe to project directory (may already exist from OpenCL) + string source2cPath = m_configHelper.m_solutionDirectory + "source2c.exe"; + string source2cCheck; + if (!findFile(source2cPath, source2cCheck)) { + string source2cContent; + if (!loadFromResourceFile(SOURCE2C_EXE_ID, source2cContent)) { + outputError("Failed to load source2c.exe from resources"); + return; + } + if (!writeToFile(source2cPath, source2cContent, true)) { + outputError("Failed to copy source2c.exe to project directory"); + return; + } + } + + // Copy spirv_source2c.props to project directory + string propsContent; + if (!loadFromResourceFile(SPIRV_SOURCE2C_PROPS_ID, propsContent)) { + outputError("Failed to load spirv_source2c.props from resources"); + return; + } + string propsPath = m_configHelper.m_solutionDirectory + "spirv_source2c.props"; + if (!writeToFile(propsPath, propsContent, true)) { + outputError("Failed to copy spirv_source2c.props to project directory"); + return; + } + + // Copy spirv_source2c.targets to project directory + string targetsContent; + if (!loadFromResourceFile(SPIRV_SOURCE2C_TARGETS_ID, targetsContent)) { + outputError("Failed to load spirv_source2c.targets from resources"); + return; + } + string targetsPath = m_configHelper.m_solutionDirectory + "spirv_source2c.targets"; + if (!writeToFile(targetsPath, targetsContent, true)) { + outputError("Failed to copy spirv_source2c.targets to project directory"); + return; + } + + // Copy spirv_source2c.xml to project directory + string xmlContent; + if (!loadFromResourceFile(SPIRV_SOURCE2C_XML_ID, xmlContent)) { + outputError("Failed to load spirv_source2c.xml from resources"); + return; + } + string xmlPath = m_configHelper.m_solutionDirectory + "spirv_source2c.xml"; + if (!writeToFile(xmlPath, xmlContent, true)) { + outputError("Failed to copy spirv_source2c.xml to project directory"); + return; + } + + // Add SPIRV build customisation imports + string propsSPIRV = "\r\n\ + \r\n\ + \r\n\ + "; + string targetsSPIRV = "\r\n\ + \r\n\ + \r\n\ + "; + + const string findProps = R"()"; + const string findTargets = R"()"; + + // Add spirv props import (after first ) + uint findPos = projectTemplate.find(findProps) + findProps.length(); + projectTemplate.insert(findPos, propsSPIRV); + // Add spirv targets import (after last ) + findPos = projectTemplate.rfind(findTargets) + findTargets.length(); + projectTemplate.insert(findPos, targetsSPIRV); } } @@ -1897,7 +2151,7 @@ bool ProjectGenerator::outputDependencyLibs(string& projectTemplate, const bool StaticList addLibs, libs = m_libs; buildDependencies(libs, addLibs, winrt); - if ((libs.size() > 0) || (addLibs.size() > 0)) { + if ((libs.size() > 0) || (addLibs.size() > 0) || m_configHelper.isConfigOptionEnabled("libshaderc")) { // Create list of additional ffmpeg dependencies string addFFmpegLibs[4]; // debug, release, debugDll, releaseDll for (const auto& i : m_projectLibs[m_projectName]) { @@ -1923,10 +2177,21 @@ bool ProjectGenerator::outputDependencyLibs(string& projectTemplate, const bool addDeps[3] += (!winrt) ? ".lib;" : "_winrt.lib;"; } // Create List of additional external dependencies - string addExternDeps; + // Uses same 4-way split as addDeps: debug, release, debugDll, releaseDll + string addExternDeps[4]; for (const auto& i : addLibs) { - addExternDeps += i; - addExternDeps += ".lib;"; + addExternDeps[0] += i + ".lib;"; + addExternDeps[1] += i + ".lib;"; + addExternDeps[2] += i + ".lib;"; + addExternDeps[3] += i + ".lib;"; + } + // Vulkan SDK libs with separate static/DLL names and debug variants + if (m_configHelper.isConfigOptionEnabled("libshaderc") && + (m_projectName == "libavfilter")) { + addExternDeps[0] += "shaderc_combinedd.lib;"; + addExternDeps[1] += "shaderc_combined.lib;"; + addExternDeps[2] += "shaderc_sharedd.lib;"; + addExternDeps[3] += "shaderc_shared.lib;"; } // Add to Additional Dependencies const string libLink2[2] = {"", ""}; @@ -1977,7 +2242,8 @@ bool ProjectGenerator::outputDependencyLibs(string& projectTemplate, const bool addIndex += 2; } addString += addDeps[addIndex]; - addString += addExternDeps; + addString += addExternDeps[addIndex]; + addString += (debugRelease == 0) ? addTesseractDebug : addTesseractRelease; addString += "%(AdditionalDependencies)"; projectTemplate.insert(findPos, addString); findPos += addString.length(); diff --git a/source/projectGenerator_build.cpp b/source/projectGenerator_build.cpp index 8fe60ef..a638504 100644 --- a/source/projectGenerator_build.cpp +++ b/source/projectGenerator_build.cpp @@ -207,6 +207,14 @@ void ProjectGenerator::buildDependencies(StaticList& libs, StaticList& addLibs, addLibs.emplace_back("Advapi32"); // Add the additional required libs } else if (i == "vulkan") { // Doesn't need any additional libs + } else if (i == "libshaderc") { + // Handled separately in outputDependencyLibs (different static/DLL lib names) + } else if (i == "spirv_compiler") { + // Meta-dependency satisfied by libshaderc or libglslang, no additional libs needed + } else if (i == "libplacebo") { + lib = "libplacebo"; + } else if (i == "libtesseract" && m_configHelper.m_tesseractName != "tesseract") { + m_addCustomTesseract = true; } else { // By default just use the lib name and prefix with lib if not already if (i.find("lib") == 0) { @@ -396,7 +404,10 @@ void ProjectGenerator::buildDependencyValues(StaticList& includeDirs, StaticList } } else if (i.first == "vulkan" && !winrt) { if (findEnvironmentVariable("VULKAN_SDK")) { - includeDirs.emplace_back("$(VULKAN_SDK)/include/"); + if (find(includeDirs.begin(), includeDirs.end(), "$(VULKAN_SDK)/include/") == + includeDirs.end()) { + includeDirs.emplace_back("$(VULKAN_SDK)/include/"); + } } else { string fileName; m_configHelper.makeFileGeneratorRelative( @@ -411,6 +422,23 @@ void ProjectGenerator::buildDependencyValues(StaticList& includeDirs, StaticList outputWarning("Vulkan requires the Vulkan headers to be available in the include path.", false); } } + } else if (i.first == "libshaderc" && !winrt) { + if (findEnvironmentVariable("VULKAN_SDK")) { + if (find(includeDirs.begin(), includeDirs.end(), "$(VULKAN_SDK)/include/") == + includeDirs.end()) { + includeDirs.emplace_back("$(VULKAN_SDK)/include/"); + } + lib32Dirs.emplace_back("$(VULKAN_SDK)/Lib32"); + lib64Dirs.emplace_back("$(VULKAN_SDK)/Lib"); + } else { + outputWarning("Could not find the Vulkan SDK environment variable."); + outputWarning( + "Either the Vulkan SDK is not installed or the environment variable is missing.", false); + outputWarning("libshaderc requires the Vulkan SDK to be installed.", false); + } + } else if (i.first == "libplacebo" && !winrt) { + includeDirs.emplace_back("$(OutBaseDir)/include/libplacebo/"); + includeDirs.emplace_back("$(ProjectDir)/../../prebuilt/include/libplacebo/"); } } } @@ -539,6 +567,9 @@ void ProjectGenerator::buildProjectDependencies(map& projectDeps) projectDeps["libzimg"] = (m_projectName == "libavfilter"); projectDeps["libzmq"] = (m_projectName == "libavfilter") || (m_projectName == "libavformat"); projectDeps["libzvbi"] = (m_projectName == "libavcodec"); + projectDeps["libshaderc"] = (m_projectName == "libavfilter"); + projectDeps["libplacebo"] = (m_projectName == "libavfilter"); + projectDeps["spirv_compiler"] = (m_projectName == "libavfilter"); projectDeps["lzma"] = (m_projectName == "libavcodec"); projectDeps["mediafoundation"] = (m_projectName == "libavcodec"); projectDeps["nvdec"] = (m_projectName == "libavcodec"); From a347562c4cd09ad08bf6200af5f1666ffdb59279 Mon Sep 17 00:00:00 2001 From: softworkz Date: Fri, 20 Feb 2026 10:33:43 +0100 Subject: [PATCH 09/12] Support custom tesseract library name --- include/configGenerator.h | 1 + include/projectGenerator.h | 1 + source/configGenerator.cpp | 14 ++++++++++++++ source/projectGenerator.cpp | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/include/configGenerator.h b/include/configGenerator.h index fc56ddd..72c5759 100644 --- a/include/configGenerator.h +++ b/include/configGenerator.h @@ -72,6 +72,7 @@ class ConfigGenerator DefaultValuesList m_replaceList; DefaultValuesList m_replaceListASM; bool m_useNASM{true}; + string m_tesseractName{"tesseract"}; ConfigList m_cachedConfigLists; public: diff --git a/include/projectGenerator.h b/include/projectGenerator.h index 054448b..61afd39 100644 --- a/include/projectGenerator.h +++ b/include/projectGenerator.h @@ -71,6 +71,7 @@ class ProjectGenerator StaticList m_subDirs; map m_projectLibs; + bool m_addCustomTesseract{false}; const string m_tempDirectory = "FFVSTemp/"; diff --git a/source/configGenerator.cpp b/source/configGenerator.cpp index 5f76579..5dd841a 100644 --- a/source/configGenerator.cpp +++ b/source/configGenerator.cpp @@ -367,6 +367,8 @@ bool ConfigGenerator::changeConfig(const string& option) outputLine(" --dce-only do not output a project and only generate missing DCE files"); outputLine( " --use-yasm use YASM instead of the default NASM (this is not advised as it does not support newer instructions)"); + outputLine( + " --tesseract-name=NAME set the base name for libtesseract (e.g. tesseract55) [tesseract]"); // Add in reserved values vector reservedItems; buildReservedValues(reservedItems); @@ -450,6 +452,18 @@ bool ConfigGenerator::changeConfig(const string& option) } else if (option == "--use-yasm") { // This has no parameters and just sets internal value m_useNASM = false; + } else if (option.find("--tesseract-name") == 0) { + // Check for correct command syntax + if (option.at(16) != '=') { + outputError("Incorrect tesseract-name syntax (" + option + ")"); + outputError("Expected syntax (--tesseract-name=NAME)", false); + return false; + } + m_tesseractName = option.substr(17); + if (m_tesseractName.empty()) { + outputError("Empty tesseract name specified"); + return false; + } } else if (option.find("--use-existing-config") == 0) { // A input config file has been specified m_usingExistingConfig = true; diff --git a/source/projectGenerator.cpp b/source/projectGenerator.cpp index 8a9cc09..0f608ce 100644 --- a/source/projectGenerator.cpp +++ b/source/projectGenerator.cpp @@ -2193,6 +2193,13 @@ bool ProjectGenerator::outputDependencyLibs(string& projectTemplate, const bool addExternDeps[2] += "shaderc_sharedd.lib;"; addExternDeps[3] += "shaderc_shared.lib;"; } + // Add tesseract with custom name if specified via --tesseract-name + string addTesseractDebug, addTesseractRelease; + if (m_addCustomTesseract) { + m_addCustomTesseract = false; + addTesseractDebug = m_configHelper.m_tesseractName + "d.lib;"; + addTesseractRelease = m_configHelper.m_tesseractName + ".lib;"; + } // Add to Additional Dependencies const string libLink2[2] = {"", ""}; for (uint linkLib = 0; linkLib < (!program ? 2U : 1U); linkLib++) { From 6ced8b302d54caee5d35a022c708205e7146b287 Mon Sep 17 00:00:00 2001 From: softworkz Date: Mon, 23 Feb 2026 12:47:38 +0100 Subject: [PATCH 10/12] Detect artifacts from configure in the ffmpeg tree --- source/projectGenerator.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/projectGenerator.cpp b/source/projectGenerator.cpp index 0f608ce..1936556 100644 --- a/source/projectGenerator.cpp +++ b/source/projectGenerator.cpp @@ -50,6 +50,22 @@ bool ProjectGenerator::passAllMake() { + // Check for stale files left by running configure in the source directory + const string staleFiles[] = {"config.h", "config.asm", "config_components.h"}; + string found; + for (const auto& file : staleFiles) { + if (findFile(m_configHelper.m_rootDirectory + file, found)) { + outputError("The source directory contains a '" + file + "' file generated by configure."); + outputError( + "These files conflict with the Visual Studio project generator and must be removed.", false); + outputError("Please delete the following files from the source directory and try again:", false); + for (const auto& f : staleFiles) { + outputError(" " + m_configHelper.m_rootDirectory + f, false); + } + return false; + } + } + // Copy the required props files to output directory string propsFile, propsFileWinRT; if (!loadFromResourceFile(TEMPLATE_PROPS_ID, propsFile) || From 5f3797243237557695c784cec8aa7cf8731eb5ad Mon Sep 17 00:00:00 2001 From: softworkz Date: Mon, 23 Feb 2026 11:11:08 +0100 Subject: [PATCH 11/12] Add support for libplacebo --- include/projectGenerator.h | 5 ++ source/projectGenerator.cpp | 72 ++++++++++++++++++++++++++++ source/projectGenerator_build.cpp | 27 ++++++++++- source/projectGenerator_compiler.cpp | 8 ++-- 4 files changed, 106 insertions(+), 6 deletions(-) diff --git a/include/projectGenerator.h b/include/projectGenerator.h index 61afd39..1eff6c1 100644 --- a/include/projectGenerator.h +++ b/include/projectGenerator.h @@ -433,6 +433,11 @@ class ProjectGenerator void outputDefines(const StaticList& definesShared, const StaticList& definesStatic, string& projectTemplate, bool program = false); + /** + * Comment out preprocessor directives inside macro arguments that MSVC cannot handle. + */ + void sanitizeSourceFiles(); + /** * Output asm tools to project template. * @remark Either yasm or nasm tools will be used based on current configuration. diff --git a/source/projectGenerator.cpp b/source/projectGenerator.cpp index 1936556..59a3cd7 100644 --- a/source/projectGenerator.cpp +++ b/source/projectGenerator.cpp @@ -222,6 +222,75 @@ void ProjectGenerator::errorFunc(const bool cleanupFiles) exit(1); } +void ProjectGenerator::sanitizeSourceFiles() +{ + if (!m_configHelper.isConfigOptionEnabled("libplacebo")) { + return; + } + for (const auto& file : m_includesC) { + if (file.find("vf_libplacebo.c") == string::npos) { + continue; + } + string fullPath = file; + m_configHelper.makeFileGeneratorRelative(fullPath, fullPath); + string contents; + if (!loadFromFile(fullPath, contents, false, false)) { + continue; + } + if (contents.find("#if PL_API_VER") == string::npos) { + continue; + } + // Split into lines + vector lines; + size_t pos = 0; + while (pos < contents.size()) { + size_t eol = contents.find('\n', pos); + if (eol == string::npos) eol = contents.size(); + lines.push_back(contents.substr(pos, eol - pos)); + pos = eol + 1; + } + // Track parenthesis nesting; comment out #if PL_API_VER / #endif inside macro args + int parenDepth = 0; + int skipEndifCount = 0; + bool modified = false; + for (auto& line : lines) { + string trimmed = line; + size_t firstNonWS = trimmed.find_first_not_of(" \t\r"); + if (firstNonWS != string::npos) trimmed = trimmed.substr(firstNonWS); + if (parenDepth > 0 && trimmed.find("#if PL_API_VER") == 0 && + line.find("////") == string::npos) { + line = "////" + line; + skipEndifCount++; + modified = true; + } else if (skipEndifCount > 0 && (trimmed == "#endif" || trimmed == "#endif\r") && + line.find("////") == string::npos) { + line = "////" + line; + skipEndifCount--; + modified = true; + } else { + if (trimmed.empty() || trimmed[0] != '#') { + bool inString = false; + for (char c : line) { + if (c == '"') inString = !inString; + if (!inString) { + if (c == '(') parenDepth++; + else if (c == ')') parenDepth--; + } + } + } + } + } + if (modified) { + string result; + for (size_t i = 0; i < lines.size(); i++) { + result += lines[i]; + if (i + 1 < lines.size()) result += '\n'; + } + writeToFile(fullPath, result); + } + } +} + bool ProjectGenerator::outputProject() { // Check all files are correctly located @@ -237,6 +306,9 @@ bool ProjectGenerator::outputProject() StaticList definesStatic; buildDependencyValues(includeDirs, lib32Dirs, lib64Dirs, definesShared, definesStatic, false); + // Comment out #if/#endif inside macro arguments that MSVC cannot handle + sanitizeSourceFiles(); + // Create missing definitions of functions removed by DCE if (!outputProjectDCE(includeDirs)) { return false; diff --git a/source/projectGenerator_build.cpp b/source/projectGenerator_build.cpp index a638504..abcfc73 100644 --- a/source/projectGenerator_build.cpp +++ b/source/projectGenerator_build.cpp @@ -73,6 +73,10 @@ void ProjectGenerator::buildDependencies(StaticList& libs, StaticList& addLibs, if (m_projectName == "libavformat" && !winrt) { addLibs.emplace_back("ws2_32"); // Add the additional required libs } + // libplacebo statically links into libavfilter which requires vulkan-1 at link time + if (m_configHelper.isConfigOptionEnabled("libplacebo") && !winrt) { + addLibs.emplace_back("vulkan-1"); + } // Determine only those dependencies that are valid for current project map projectDeps; @@ -291,6 +295,21 @@ void ProjectGenerator::buildDependencyValues(StaticList& includeDirs, StaticList includeDirs.push_back(projRoot + m_projectName + '/'); } + // libplacebo requires Vulkan SDK include and lib dirs for all projects that link against it + if (m_configHelper.isConfigOptionEnabled("libplacebo") && !winrt) { + definesStatic.emplace_back("PL_STATIC"); + definesShared.emplace_back("PL_STATIC"); + if (findEnvironmentVariable("VULKAN_SDK")) { + if (find(includeDirs.begin(), includeDirs.end(), "$(VULKAN_SDK)/include/") == includeDirs.end()) { + includeDirs.emplace_back("$(VULKAN_SDK)/include/"); + } + if (find(lib32Dirs.begin(), lib32Dirs.end(), "$(VULKAN_SDK)/Lib32") == lib32Dirs.end()) { + lib32Dirs.emplace_back("$(VULKAN_SDK)/Lib32"); + lib64Dirs.emplace_back("$(VULKAN_SDK)/Lib"); + } + } + } + // Determine only those dependencies that are valid for current project map projectDeps; buildProjectDependencies(projectDeps); @@ -437,8 +456,12 @@ void ProjectGenerator::buildDependencyValues(StaticList& includeDirs, StaticList outputWarning("libshaderc requires the Vulkan SDK to be installed.", false); } } else if (i.first == "libplacebo" && !winrt) { - includeDirs.emplace_back("$(OutBaseDir)/include/libplacebo/"); - includeDirs.emplace_back("$(ProjectDir)/../../prebuilt/include/libplacebo/"); + includeDirs.emplace_back("$(OutBaseDir)/include/"); + includeDirs.emplace_back("$(ProjectDir)/../../prebuilt/include/"); + if (findEnvironmentVariable("VULKAN_SDK")) { + lib32Dirs.emplace_back("$(VULKAN_SDK)/Lib32"); + lib64Dirs.emplace_back("$(VULKAN_SDK)/Lib"); + } } } } diff --git a/source/projectGenerator_compiler.cpp b/source/projectGenerator_compiler.cpp index 319b0f8..c4ac6ae 100644 --- a/source/projectGenerator_compiler.cpp +++ b/source/projectGenerator_compiler.cpp @@ -207,14 +207,14 @@ popd\n"; } } } - launchBat += "cl.exe "; - launchBat += extraCl + extraExtraCl + + string clCommand = "cl.exe "; + clCommand += extraCl + extraExtraCl + R"( /D"_DEBUG" /D"WIN32" /D"_WINDOWS" /D"HAVE_AV_CONFIG_H" /D"_USE_MATH_DEFINES" /D"_UCRT_NOISY_NAN" )" + runCommands + " /c /MP /w /nologo /utf-8"; for (const auto& file : compileFiles) { - launchBat += " \"" + file + "\""; + clCommand += " \"" + file + "\""; } - launchBat += " > ffvs_log.txt 2>&1\nif %errorlevel% neq 0 goto exitFail\n"; + launchBat += clCommand + " > ffvs_log.txt 2>&1\nif %errorlevel% neq 0 goto exitFail\n"; } if (runType == 1) { launchBat += "move *.i " + dirName + "/ >nul 2>&1\n"; From 64a9b8ec2357851c82ddb6af56454ffb1b21961d Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 24 Feb 2026 02:32:35 +0100 Subject: [PATCH 12/12] Update ReadMe --- README.md | 27 ++++++++++++++++++++++++++- project_generate.sln | 5 +++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7243fe1..21c7597 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,31 @@ FFVS-Project-Generator [![GitHub issues](https://img.shields.io/github/issues/ShiftMediaProject/FFVS-Project-Generator.svg)](https://github.com/ShiftMediaProject/FFVS-Project-Generator/issues) [![license](https://img.shields.io/github/license/ShiftMediaProject/FFVS-Project-Generator.svg)](https://github.com/ShiftMediaProject/FFVS-Project-Generator) [![donate](https://img.shields.io/badge/donate-link-brightgreen.svg)](https://shiftmediaproject.github.io/8-donate/) + +## Major Update - Supports FFmpeg 8.x and beyond + +**Changes** + +- **Adds support for compilations of fftools/resources via bin2c.exe** + (supersedes #83) +- **Adds a `smp_common.props` file** + This is imported by all projects and allows to apply changes easily and in a persistent way - i.e. your modifications do not get lost when regenerating the projects +- **Adds support for libvpl (OneVPL)** + This is the new dispatcher for Intel QSV hardware acceleration, which replaces libmfx +- **Adds support for shaderc dependency** +- **Adds support for shader (.comp) file conversion to C strings** +- **Adds support for OpenCL (.cl) file conversion to C strings** +- **Adds support for CUDA PTX compile via NVCC and conversion to C strings** + (supersedes #82) +- **New option to specify a custom tesseract library name** + (tesseract library naming is messy) +- **Detect artifacts from configure in the ffmpeg tree** + The generator doesn't work properly when configure has been run in the FFmpeg source dir. + Added detection for this case and warning will be shown +- **Adds support for Vulkan (filters) and libplacebo** + A repo will be provided with an adapted libplacebo which can be compiled on Windows without MSYS2 + + ## About The FFmpeg VS Project Generator is a standalone program that can be used to create a custom Visual Studio project within a FFmpeg source code distribution. This program allows for the created Visual Studio project to be customised using virtually any of the options supported by FFmpegs default configure script. This allows for selecting which dependency libraries and codec/format support should be built into the created project file. With the output project FFmpeg libraries and programs can be built and debugged directly within Visual Studio. @@ -107,4 +132,4 @@ https://github.com/ShiftMediaProject/VSYASM/releases/latest ## License -FFVS-Project-Generator itself is released under [LGPLv2](https://www.gnu.org/licenses/lgpl-2.0.html). The generated output project(s) and source can be used with existing FFmpeg source code such that any resultant binaries created by the generated projects will still conform to the license of the FFmpeg source code itself. This means the output binaries are licensed based on the command line specified when generating the projects (i.e. --enable-gpl etc.). \ No newline at end of file +FFVS-Project-Generator itself is released under [LGPLv2](https://www.gnu.org/licenses/lgpl-2.0.html). The generated output project(s) and source can be used with existing FFmpeg source code such that any resultant binaries created by the generated projects will still conform to the license of the FFmpeg source code itself. This means the output binaries are licensed based on the command line specified when generating the projects (i.e. --enable-gpl etc.). diff --git a/project_generate.sln b/project_generate.sln index 01a5d27..f6e2426 100644 --- a/project_generate.sln +++ b/project_generate.sln @@ -1,13 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.37012.4 d17.14 +# Visual Studio Version 18 +VisualStudioVersion = 18.3.11512.155 d18.3 MinimumVisualStudioVersion = 12.0.30501.0 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "project_generate", "project_generate.vcxproj", "{FA1D2C31-D809-4021-9DE4-7552704175EE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "!Config", "!Config", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" ProjectSection(SolutionItems) = preProject newtask\OpenCL_Build.md = newtask\OpenCL_Build.md + README.md = README.md EndProjectSection EndProject Global