Что эквивалентно Makefile для SConstruct? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь найти лучший способ для репликации включений Makefile в SConstruct.Я пришел к решению, но оно грязное, зависит от передачи пользователем определенных параметров командной строки и, безусловно, не может быть лучшим вариантом.

Моя файловая структура такова:

Working_Dir/
   |-> includes/
   |    |-> filename.mk
   |    |-> filename.py
   |-> Makefile
   |-> main.c
   |-> SConstruct

Это содержимое моего файла

Makefile

all: main.o
    echo "Version is: $(VERSION)"
    gcc $^ -o main

include includes/filename.mk

filename.mk

VERSION := "1.6.2"

%.o: %.c
    gcc -c -o $@ $<

SConstruct

import filename

env=Environment()
filename.Init(env)

#Create new builder
prog = Builder(action=["gcc $SOURCE -o $TARGET"])

#Add the builder
builder = { "Prog": prog}
env.Append(BUILDERS=builder)

print "Version is: " + env['VERSION']
env.Prog(target = "main", source = "main.o")

filename.py

from SCons.Script import *  # Needed so we can use scons stuff like builders

def Init(env):
    #Make builder
    obj = Builder(action="gcc -c -o $TARGET $SOURCE")

    #Add stuff
    env.Append(BUILDERS= {'Obj': obj})
    env.Append(VERSION= "1.6.2")

(не обращая внимания на тот факт, что у SCons есть собственный конструктор объектов, это просто упрощенный пример, который я использовал для изучения более крупного проекта)

Для компиляции с make-файломЯ запускаю make, а для SCons - scons --site-dir="includes", поскольку мой включенный файл не находится в стандартном пути.Насколько мне известно, опция site_dir - это единственный способ включить ваш собственный код / ​​компоновщики в scons , как показано здесь .Также обратите внимание, что файлы SConscript не являются тем, что я хочу, поскольку, когда вы вызываете их, они выполняют свои инструкции в своем собственном каталоге, а не просто загружают переменные и компоновщики в вызывающую программу.

Я хочуЭто для пользователя может просто запустить scons, и это работает.Я прочитал, что могу установить эти настройки глобально для моего профиля bash , как показано здесь в разделе 10.1.1, но я не хочу этого делать, потому что я не хочу, чтобы все проекты SCons в моей системе по умолчаниюиспользовать этот каталог.Я также взглянул на функцию SetOption(), но она ограничена и фактически не позволяет вам устанавливать этот конкретный параметр вообще.

Единственное решение, о котором я могу подумать, - это начать использовать * 1037.* и если это не каталог, который я ожидаю, я вызываю новый вызов SCons со всеми теми же параметрами, но теперь с правильной опцией site_dir.

Однако это выглядит очень гетто, и я чувствую, чтоЯ пропускаю гораздо лучшее решение.Есть ли лучшее решение?

РЕДАКТИРОВАТЬ:

Причина, по которой я использую этот каталог "includes" вместо каталога "site_scons", заключается в том, что в моем более крупном проектекаталог "includes" не находится в том же каталоге, что и проект, он находится в совершенно другом каталоге (путь к этому каталогу известен).filename.py будет использоваться для нескольких моих проектов SCons, которые зависят от него, но не каждый проект SCons на моей машине должен использовать его (т. Е. Он не должен быть глобальным).

1 Ответ

0 голосов
/ 18 мая 2019

Я понял это самостоятельно.Я только что загрузил файл как обычный модуль Python, как показано в верхнем ответе здесь .Я специально использовал ответ Python 2, так как кажется, что SCons настроен в моей системе для использования Python 2.

Благодаря этому у меня есть возможность загружать любой файл Python, включая код, связанный с scons, из любого места на моем компьютере, этоэто именно то, что я хотел.

Для тех, кому интересно, вот код, который мне нужно было добавить

file_path = "/path/to/my/file/filename.py"

import imp
extra_stuff = imp.load_source('filename', file_path)

env=Environment()
extra_stuff.Init(env)
...