#include "builder.h" #include "ld.h" #include "c.h" class CProjectBuilder : public IProjectBuilder { public: virtual BuildFile_t *BuildProject( const char *szProjectName, const char *szPath ) override; BuildFile_t *m_pBuildFiles = NULL; }; static CProjectBuilder s_projectBuilder; EXPOSE_INTERFACE_GLOBALVAR(CProjectBuilder, IProjectBuilder, PROJECT_BUILDER_INTERFACE_NAME, s_projectBuilder) IProjectBuilder *ProjectBuilder() { return &s_projectBuilder; }; BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const char *szPath ) { CProject_t stCompileProject = {}; LinkProject_t stLinkProject = {}; CUtlString szBuildLibrary; void *pLibrary; CreateInterfaceFn pBuildFactory; BuildFileInfo_t *pBuildFileInfo; BuildFileInfo_t stBuildFileInfo; BuildFile_t *pBuildFile = NULL; CUtlString szWd = CUtlString(szPath).GetDirectory(); Plat_SetWorkingDir(szWd); stCompileProject.m_szName = szProjectName; stCompileProject.files = { szPath, }; stCompileProject.includeDirectories = {CUtlString("%s/public",filesystem2->OwnDirectory()),CUtlString("%s/public", filesystem2->BuildDirectory()), CUtlString("%s/../public",filesystem2->OwnDirectory()),CUtlString("%s/../public", filesystem2->BuildDirectory())}; stCompileProject.bFPIC = true; stCompileProject.m_target = Target_t::HostTarget(); stLinkProject = ccompiler->Compile(&stCompileProject); stLinkProject.linkType = ELINK_DYNAMIC_LIBRARY; stLinkProject.m_target = Target_t::HostTarget(); stLinkProject.objects.AppendHead({CUtlString("%s/libfpcbuild.a",filesystem2->OwnDirectory())}); stLinkProject.objects.AppendHead({CUtlString("%s/libtier2.a",filesystem2->OwnDirectory())}); stLinkProject.objects.AppendHead({CUtlString("%s/libtier1.a",filesystem2->OwnDirectory())}); szBuildLibrary = linker->Link(&stLinkProject); pLibrary = Plat_LoadLibrary(szBuildLibrary); if ( !pLibrary ) return NULL; pBuildFactory = Sys_GetFactory(pLibrary); if (!pBuildFactory) { V_printf("Failed to find CreateInterface\n"); Plat_UnloadLibrary(szBuildLibrary); return NULL; } pBuildFileInfo = (BuildFileInfo_t*)pBuildFactory(BUILD_FILE_INFO_INTERFACE_NAME, NULL); if (!pBuildFileInfo) { V_printf("Failed to find build file info interface\n"); Plat_UnloadLibrary(szBuildLibrary); return NULL; } stBuildFileInfo = *pBuildFileInfo; for (auto a: stBuildFileInfo.m_dependantFiles) { BuildProject("something", CUtlString("%s/build.cpp",a)); } Plat_SetWorkingDir(szWd); for (auto &build: stBuildFileInfo.m_stages) { build->m_pMainFn(); }; pBuildFile = new BuildFile_t; pBuildFile->m_szOutputFile = szBuildLibrary; pBuildFile->m_pLibrary = pLibrary; pBuildFile->m_pNext = m_pBuildFiles; m_pBuildFiles = pBuildFile; return pBuildFile; }