我有一个稍微复杂的Makefile,我想将其转换为SConstruct,以便更好地理解SCons的工作原理并将其应用于更大的项目。我正在阅读《 SConstruct用户手册》 https://scons.org/doc/production/HTML/scons-user/index.html,问题在于它花了很长时间才能通读(我只是通读第7章的一部分,而且我已经在休息时间里阅读了几天)。我主要在处理某些我无法理解的SCons中的高级技术方面的问题。
这是我的Makefile
TARGET = kmgTest
BINS = $(TARGET).bin 1st_read.bin
SCRAMBLED = 1st_read.bin
KOS_ROMDISK_DIR = romdisk
OBJS = $(TARGET).o $(KOS_ROMDISK_DIR).o
LIBS = -lkmg -lkosutils
CFLAGS = $(KOS_CFLAGS)
all: $(TARGET).cdi
clean:
-rm -f $(TARGET).cdi $(TARGET).iso $(TARGET).elf $(TARGET).bin 1st_read.bin $(OBJS) romdisk.* romdisk/*.kmg
$(SCRAMBLED): $(TARGET).elf
sh-elf-objcopy -R .stack -O binary $(TARGET).elf $(TARGET).bin
$(KOS_BASE)/utils/scramble/scramble $(TARGET).bin $(SCRAMBLED)
$(TARGET).elf: $(OBJS)
kos-cc -o $(TARGET).elf $(OBJS) $(LIBS)
$(TARGET).cdi: $(SCRAMBLED)
mkisofs -G $(KOS_BASE)/../IP.BIN -C 0,11702 -J -l -r -o $(TARGET).iso .
cdi4dc $(TARGET).iso $(TARGET).cdi
romdisk.o: romdisk.img
$(KOS_BASE)/utils/bin2o/bin2o romdisk.img romdisk romdisk.o
romdisk.img: $(patsubst assets/RGB565/%.png,romdisk/%.kmg,$(wildcard assets/RGB565/*.png)) $(patsubst assets/ARGB4444/%.png,romdisk/%.kmg,$(wildcard assets/ARGB4444/*.png))
$(KOS_GENROMFS) -f romdisk.img -d romdisk -v
romdisk/%.kmg: assets/RGB565/%.png
$(KOS_BASE)/utils/vqenc/vqenc -v -t -q -k $<
mv assets/RGB565/$*.kmg romdisk/
romdisk/%.kmg: assets/ARGB4444/%.png
$(KOS_BASE)/utils/vqenc/vqenc -v -t -q -k -a $<
mv assets/ARGB4444/$*.kmg romdisk/
%.o: %.c
kos-cc $(CFLAGS) -c $< -o $@
这就是我对SCons的理解
import os
KOS_BASE = os.environ.get('KOS_BASE')
TARGET = Dir('.').path.rsplit('/', 1)[1] + "Test" #Executable name (First part gets the name of the parent dir)
BINS = TARGET + ".bin" + " 1st_read.bin" #Binaries
SCRAMBLED = "1st_read.bin" #Scrambled-file-name
KOS_ROMDISK_DIR = "romdisk"
OBJS = TARGET + ".o" + " " + KOS_ROMDISK_DIR + ".o" #Objects
LIBS = "-lkmg -lkosutils" #Libs used when making the .elf file
CFILES = ' '.join(map(str, Glob('*.c'))) #Convert from list to string
CFLAGS = os.environ.get('KOS_CFLAGS')
env_dreamcast = Environment()
env_dreamcast['ENV']['PATH'] = os.environ['PATH'] #Import my PATH variable
env_dreamcast.Replace(CFLAGS=CFLAGS) #Set the value for the environment to use
env_dreamcast.Command("kmgTest.o", "kmgTest.c","kos-cc $CFLAGS -c $SOURCE -o $TARGET") #Complains about 2nd arg
总结一下这应该做什么,我有一个自己的C编译器,叫做“ kos-cc”,用于另一种体系结构,稍后我尝试使用它和其他一些东西来构建可执行文件。像“ KOS_BASE”这样的变量是在外壳文件中定义的,该文件在我的终端/外壳的配置文件源中以及在我的配置文件的PATH变量的路径下找到了kos-cc,cdi4dc和sh-elf-objcopy。
现在它应该可以制作kmgTest.o
(存在kmgTest.c)。命令的内容在普通终端/ shell上输入并执行后可以正常工作,但是由于某种原因,我收到一个奇怪的错误“ / opt / toolchains / dc / kos / utils / gnu_wrappers / kos-cc:50:执行:-O2:未找到”。供参考,CFLAGS
是一串以-O2
开头的编译器标志。如果CFLAGS为空,则会出现相同的错误,但带有-c
。我的猜测是无法正确执行,但我不明白为什么这行不通。我也尝试了Object(),如下所示,但是它有同样的问题。
env_dreamcast = Environment(CPPPATH = ['.'], CC = 'kos-cc', CCFLAGS = CFLAGS)
env_dreamcast['ENV']['PATH'] = os.environ['PATH'] #Import PATH for us. This fiexes the "Unable to find kos-cc" thing
env_dreamcast.Object("kmgTest.o", "kmgTest.c")
通过与人交谈,我可以学到最好的东西,但是我不认识使用过或知道SCons的人。我希望将其发布在诸如SCons论坛之类的东西上,但是找不到。如果这不适合在这里问,请提前道歉,我只是不知道在哪里问。
答案 0 :(得分:0)
我现在意识到“ kos-cc”不是可执行文件,它是没有扩展名的shell文件。现在回头看一下错误"/opt/toolchains/dc/kos/utils/gnu_wrappers/kos-cc: 50: exec: -O2: not found
,这表明可执行文件中存在错误(不是SCons)。这是第50行
exec ${KOS_CC} ${KOS_CFLAGS} "$@"
发生的事情是我没有将所有配置文件环境变量导入到我的SConstruct环境中,这意味着未设置“ KOS_CC”和“ KOS_CFLAGS”,因此出现了诸如“找不到-o,-O2或-c”的错误”,因为这是它在这里看到的第一个参数,并将其视为命令。
解决方案是像这样将所有KOS配置文件变量导入到我的SConstruct环境中,现在它可以正确运行命令并进行编译
env_dreamcast['ENV'].update({k: v for k, v in os.environ.items() if k.startswith('KOS_')})