编译裁判程序 如果有已经编译好的裁判程序,则直接返回这个程序 打包的时候不会打包二进制文件,重新编译一次
(judgeResult *commonStructs.JudgeResult)
| 98 | // 如果有已经编译好的裁判程序,则直接返回这个程序 |
| 99 | // 打包的时候不会打包二进制文件,重新编译一次 |
| 100 | func (session *JudgeSession) compileJudgerProgram(judgeResult *commonStructs.JudgeResult) error { |
| 101 | // 检查是否存在已经编译好的裁判程序 |
| 102 | cType := "checker" |
| 103 | if session.JudgeConfig.SpecialJudge.Mode == 2 { |
| 104 | cType = "interactor" |
| 105 | } |
| 106 | cPath, err := utils.GetCompiledBinaryFileAbsPath(cType, session.JudgeConfig.SpecialJudge.Name, session.ConfigDir) |
| 107 | // 如果有已经编译好的裁判程序,则直接返回这个程序 |
| 108 | if err == nil { |
| 109 | if s, err := os.Stat(cPath); err == nil && !s.IsDir() { |
| 110 | session.JudgeConfig.SpecialJudge.Checker = cPath |
| 111 | return nil |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | // 如果没有,则检查checker是否被设置 |
| 116 | jCodeOrExec := path.Join(session.ConfigDir, session.JudgeConfig.SpecialJudge.Checker) |
| 117 | s, err := os.Stat(jCodeOrExec) |
| 118 | if os.IsNotExist(err) || s.IsDir() { |
| 119 | judgeResult.JudgeResult = constants.JudgeFlagSE |
| 120 | judgeResult.SeInfo = fmt.Sprintf("checker file not exists") |
| 121 | session.Logger.Error("checker file not exists") |
| 122 | return errors.Errorf(judgeResult.SeInfo) |
| 123 | } |
| 124 | |
| 125 | yes, err := utils.IsExecutableFile(jCodeOrExec) |
| 126 | if err != nil { |
| 127 | judgeResult.JudgeResult = constants.JudgeFlagSE |
| 128 | judgeResult.SeInfo = fmt.Sprintf("read checker file error") |
| 129 | session.Logger.Error(err.Error()) |
| 130 | return err |
| 131 | } else if yes { // 如果是可执行程序,直接执行 |
| 132 | session.JudgeConfig.SpecialJudge.Checker = jCodeOrExec |
| 133 | return nil |
| 134 | } |
| 135 | |
| 136 | // 编译特判程序 |
| 137 | config := session.JudgeConfig |
| 138 | binRoot, err := GetOrCreateBinaryRoot(&config) |
| 139 | if err != nil { |
| 140 | judgeResult.JudgeResult = constants.JudgeFlagSE |
| 141 | judgeResult.SeInfo = fmt.Sprintf("create checker bin root error") |
| 142 | session.Logger.Error(err.Error()) |
| 143 | return err |
| 144 | } |
| 145 | session.Logger.Infof("Complie special judge checker, Language: %s", config.SpecialJudge.CheckerLang) |
| 146 | compileTarget, err := CompileSpecialJudgeCodeFile( |
| 147 | config.SpecialJudge.Checker, |
| 148 | config.SpecialJudge.Name, |
| 149 | binRoot, |
| 150 | config.ConfigDir, |
| 151 | session.LibraryDir, |
| 152 | config.SpecialJudge.CheckerLang, |
| 153 | ) |
| 154 | if err != nil { |
| 155 | judgeResult.JudgeResult = constants.JudgeFlagSE |
| 156 | judgeResult.SeInfo = fmt.Sprintf("compile checker file error") |
| 157 | session.Logger.Error(err.Error()) |
no test coverage detected