Как я могу построить программу, используя g ++ с SCons, не завися от каких-либо внешних переменных среды? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать простую программу на c ++ hello world, используя g ++ с SCons. Как я могу указать, что я хочу, чтобы SCons использовал g ++ без каких-либо зависимостей от внешних переменных среды, таких как PATH?

Вот что я пробовал:

env = Environment(CXX = 'C:/cygwin/bin/g++')
env.Program('helloworld.c++')

Это мой результат:

scons: warning: No version of Visual Studio compiler found - C/C++ 
compilers most likely not set correctly
File "C:\Python27\Scripts\scons.py", line 201, in <module>
C:/cygwin/bin/g++ /Fohelloworld.obj /c helloworld.c++ /TP /nologo
g++: error: /Fohelloworld.obj: No such file or directory
g++: error: /c: No such file or directory
g++: error: /TP: No such file or directory
g++: error: /nologo: No such file or directory
scons: *** [helloworld.obj] Error 1
scons: building terminated because of errors.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Немного чище

env = Environment(tools=['g++','gnulink'])
env['ENV']['PATH'] = ['C:/cygwin/bin']
env['CXX'] = 'g++'
env.Program('helloworld.c++')

Другой способ:

env = Environment(tools=['g++','gnulink'])
env.PrependENVPath('PATH','C:/cygwin/bin')
env.Program('helloworld.c++')
0 голосов
/ 23 января 2019

Оказывается, ответ был глядя мне прямо в лицо . Моя первая проблема заключалась в том, что первая часть этого ответа:

import os
env = Environment(ENV = {'PATH' : os.environ['PATH']})

использует ОС PATH, чего я явно хотел избежать. Вторая проблема заключалась в том, что я полностью упустил из виду ответ ниже, который был точным ответом на мой вопрос:

Чтобы гарантировать повторяемость сборки, нужно явно инициализировать PATH

path= ['/bin', '/usr/bin', '/path/to/other/compiler/bin']
env = Environment(ENV = {'PATH' : path})

Причина, по которой я не осознавал, что это было решение, заключается в том, что я просто неправильно понял, что env['ENV']['PATH'] и os.environ['PATH'] полностью отделены и различны. В то время как os.environ['PATH'], очевидно, является внешним ОС PATH, env['ENV']['PATH'] представляется внутренним эквивалентом SCons . Вы можете установить то, что вам нравится.

В конце концов, точное решение, которое я выбрал, и наиболее читаемое для меня, было:

PATH = {'PATH' : ['C:/cygwin/bin']}
env = Environment(ENV = PATH)
env['ENV'] = PATH
env['CXX'] = 'g++'
env.Program('helloworld.c++')
...