MCPcopy Create free account
hub / github.com/LanceLRQ/deer-executor / compileJudgerProgram

Method compileJudgerProgram

executor/compile.go:100–163  ·  view source on GitHub ↗

编译裁判程序 如果有已经编译好的裁判程序,则直接返回这个程序 打包的时候不会打包二进制文件,重新编译一次

(judgeResult *commonStructs.JudgeResult)

Source from the content-addressed store, hash-verified

98// 如果有已经编译好的裁判程序,则直接返回这个程序
99// 打包的时候不会打包二进制文件,重新编译一次
100func (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())

Callers 1

RunJudgeMethod · 0.95

Calls 7

IsExecutableFileFunction · 0.92
GetOrCreateBinaryRootFunction · 0.85
ErrorfMethod · 0.80
InfofMethod · 0.80
ErrorMethod · 0.45

Tested by

no test coverage detected