【发布时间】:2021-10-02 17:19:45
【问题描述】:
我想在 scons 中使用 COBOL 创建一个构建器。
这是一个开始:
import re
Import('env')
# Source:
# src/cpy/COPYBK1.cpy
# src/cpy/COPYBK2.cpy
# src/cpy/COPYBK3.cpy
# src/bat/PROG1.cbl
# src/bat/PROG2.cbl
# These commands would run:
# cobc -o lib/PROG1.so -Isrc/cpy src/cbl/PROG1.cbl
# cobc -o lib/PROG2.so -Isrc/cpy src/cbl/PROG2.cbl
# +-.
# +-SConstruct
# +-PROG1.cbl
# +-PROG1.so
# | +-PROG1.cbl
# | +-COPYBK1.cpy
# | +-COPYBK2.cpy
# +-PROG2.cbl
# +-PROG2.so
# | +-PROG2.cbl
# | +-COPYBK1.cpy
# | +-COPYBK3.cpy
#
# Also, PROG2 is called from PROG1 so lib/PROG2.so target should be automatically generated.
# PROG2 is dynamically loaded so it does not need to linked into PROG1 target.
"""
def getCalls(fullprogrampath):
# This needs to be modified to support multiple lines.
# This needs to be modified to support nested COPY.
theregex = r'^......]\s*CALL\s*([A-Z0-9]*)\.$'
calllist = []
with open(fullprogrampath, 'r') as f:
linenum = 0
for line in f.readlines():
linenum += 1
line = line.rstrip()
m = re.match(theregex, line, re.I)
if m:
calllist.append(m.group(1))
return(calllist)
"""
def getCopyBooks(fullprogrampath):
# This needs to be modified to support multiple lines.
# This needs to be modified to support nested COPY.
theregex = r'^...... \s*COPY\s*([A-Z0-9]*)\.$'
copybooklist = []
with open(fullprogrampath, 'r') as f:
linenum = 0
for line in f.readlines():
linenum += 1
line = line.rstrip()
m = re.match(theregex, line, re.I)
if m:
copybooklist.append(m.group(1))
return(copybooklist)
bld = Builder(action = 'cobc -o $TARGET -Icpy $SOURCE')
env.Append(BUILDERS = {'CobolProgram': bld})
env.CobolProgram('lib/PROG1.so', 'bat/PROG1.cbl')
env.Depends(target = 'lib/PROG1.so', dependency = getCopyBooks('bat/PROG1.cbl'))
env.CobolProgram('lib/PROG2.so', 'cbl/PROG2.cbl')
env.Depends(target = 'lib/PROG2.so', dependency = getCopyBooks('cbl/PROG2.cbl'))
实际运行
这里是需要补充的:
- 缓存字帖扫描,以便我们仅在文件更改时扫描字帖。 Scons 似乎对 C 文件这样做,所以它一定是可能的。
- 检测调用语句并添加目标。在 C 中没有类似的东西。
A.我该怎么做?
B.是否有一些我可以查看的示例构建器可以用来建模?
我承认 COBOL 难以扫描,而且它仅限于 COBOL 的格式化程度。将由 COBOL 的开发人员为他们的字帖和未检测到的调用语句添加 Depends 调用。
【问题讨论】:
-
仅供参考:在处理“嵌套”(或包含)程序(COBOL 85 及更高版本)时,将出现
CALL literal语句。其中一些CALL语句将引用包含的程序。此外,CALL语句是否引用这样的包含程序,取决于包含程序的范围。所有program-names对于最外面的包含程序必须是唯一的,但对于其他程序不必是唯一的。在某些情况下,相同编码的CALL literals 可能指的是两个不同的程序。