Как конвертировать сложный Makefile в SConstruct - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть несколько сложный 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», определены в файле оболочки, в котором источники профиля моего терминала / оболочки, а также kos-cc, cdi4dc и sh-elf-objcopy находятся под путями в переменной PATH моего профиля.

Прямо сейчас это должнобыть в состоянии сделать kmgTest.o (kmgTest.c присутствует).Содержимое команды, когда оно вводится в обычный терминал / оболочку и выполняется, работает, но по какой-то причине я получаю странную ошибку "/ opt / toolchains / dc / kos / utils / gnu_wrappers / kos-cc: 50: exec: -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, но я не могу его найти.Заранее извиняюсь, если не уместно спрашивать здесь, я просто не знаю, где еще спросить.

1 Ответ

0 голосов
/ 22 апреля 2019

Теперь я понимаю, что "kos-cc" не исполняемый файл, это файл оболочки без расширения.А теперь, оглядываясь назад на эту ошибку "/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_')})
...