используя scons для запуска сценария perl (который автоматически генерирует серию файлов), затем скомпилируйте эти файлы и создайте статическую библиотеку - PullRequest
0 голосов
/ 06 апреля 2011

Я портирую наш проект с make на scons и сталкиваюсь с несколькими проблемами.У нас есть несколько сценариев perl, которые мы запускаем через make, которые генерируют серию исходных файлов на C ++.Затем эти файлы компилируются в статическую библиотеку.

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

Также я обнаружил, что скрипт scons, кажется, не выполняется линейно.Части сценария выполняются не по порядку.

Вот мой сценарий;

// SConscript file

import platform
import os
import glob
import time
Import('directEnv')
cohEnv = directEnv.Clone()

includePath = Split("""
#Direct/include
#Direct/libsrc/liblog
#Direct/libsrc/libtime
#tools/include
#Direct/include
#Direct/engine
""")

if platform.machine() == 'i686':
    includePath = includePath + ['#tools/coh-cpp-v3.6-linux-x32/coherence-cpp/include']

else:
    includePath = includePath + ['#tools/cohe-cpp-v3.5.3b465-linux-x64/coherence cpp/include']

cohFiles = Split("""
#Direct/include/IntApi.h 
#Direct/include/MessagingApiRisk.h 
#Direct/include/MessagingApiCommon.h
""")

cohEnv.Append(CPPPATH = includePath)
cohEnv.Append(CCFLAGS = '-D_FILE_OFFSET_BITS=64 -DUTPBRIDGE -Wno-unused-variable')
cohEnv.Append(LIBS = Split('nsl m rt'))

#
# Run Perl script - this generates approx 30 c++ source files
#

Clean('.', '#Direct/coh/cpp/CohMsgObj_0.cc')
temp1 = cohEnv.RunPerl('#Direct/coh/cpp/CohMsgObj_0.cc', '#Direct/coh/BuildCohObjs.pl')
Depends(temp1, '#Direct/coh/BuildCoherenceObjs.pl')
Depends(temp1, '#Direct/include/IntApi.h')

#
# Run Perl script - this generates 3 c++ source files
#

Clean('.', '#Direct/coh/cpp/Print_BinV4.cc')
temp2 = cohEnv.RunPerl('#Direct/coh/cpp/Print_BinV4.cc', '#Direct/coh/BuildCohObjsRisk.pl')
Depends(temp2, '#Direct/coh/BuildCohObjsRisk.pl')

#
# Build the object and library
#

print os.getcwd()
os.chdir('../../cpp')
path = os.getcwd()
print path

# 
# get all the c++ source files that we need to compile
#

List = []
for infile in glob.glob(os.path.join(path, '*.cc')):
    List.append(infile)

count = 0    
suffix = ".cc"
ObjectList = []

#
# create objects for each source file
# I'm trying to create variables dynamically - incase the files which generates the 
# source files change - I don;t want to manually list everything that needs to be compiled

for item in List:
    locals()['obj%s' % count] = coherenceEnv.Object(item[:-len(suffix)] + '.o' , item)
    print "obj%s" % count
    ObjectList.append(coherenceEnv.Object(item[:-len(suffix)] + '.o' , item))
    count = count + 1

#
# create a static library using the newly created objects
#

cohLib = cohEnv.StaticLibrary(target = 'riskpo', source = [cohFiles, ObjectList])
cohEnv.Install('#/lib', [cohLib])

На данный момент это работает, однако это далеко от идеала.Есть ли лучший, более простой способ сделать это, используя основные команды scons, а также как я могу навести порядок в потоке выполнения с помощью scons.спасибо D

1 Ответ

1 голос
/ 05 апреля 2012

При переходе от Make к SCons одной из проблем, с которыми обычно сталкиваются люди, является понимание того, что с SCons вы не указываете порядок, вы сообщаете SCons, что строит, а затем SCons (обычно) соединит точки и выяснитorder.

С вашими Perl-скриптами, которые генерируют много .c файлов, проблема в том, что SCons не знает об этих сгенерированных файлах, и поэтому они не будут найдены, а это значит, что SCons не будет знатьчтобы запустить скрипт perl перед любыми шагами, которые используют его выходные данные.

Вы должны взглянуть на руководство пользователя, особенно раздел по эмиттерам для этой проблемы: http://scons.org/doc/production/HTML/scons-user/x3689.html

Вики - этодругой источник для примеров.http://scons.org/wiki/DynamicSourceGenerator и http://scons.org/wiki/ToolsForFools

Может применяться.

Является ли список созданных файлов C статическим и / или может ли он быть определен содержимым другого файла?

...