Scons 和外部目录

Scons and external directories

我正在使用 scons 构建系统来构建共享库。到这部分一切都很好,但现在我遇到了一些困难。

我无法让 scons 将输出文件移动到 scons 文件夹结构之外的目录。

我唯一了解的就是这个 question here

如果我尝试编写一个 python 函数来执行此操作,该函数会在构建完成之前先运行,因此我会遇到一些找不到文件的错误。

如何让 scons 将文件移动到定义 SConstruct 文件的目录之外的目录?

import os
import shutil

Import('env')

android_files = [

    'os_android.cpp',
    'pic_android.cpp',
    'file_access_android.cpp',
    'dir_access_android.cpp',
    'audio_driver_opensl.cpp',
    'file_access_jandroid.cpp',
    'dir_access_jandroid.cpp',
    'thread_jandroid.cpp',
    'audio_driver_jandroid.cpp',
    'ifaddrs_android.cpp',
    'android_native_app_glue.c',
    'java_glue.cpp',
    'cpu-features.c',
    'java_class_wrapper.cpp'
]

env = env.Clone()

if env['target'] == "profile":
    env.Append(CPPFLAGS=['-DPROFILER_ENABLED'])

android_objects=[]
for x in android_files:
    android_objects.append( env.SharedObject( x ) )

prog = None

abspath=env.Dir(".").abspath


pp_basein = open(abspath+"/project.properties.template","rb")
pp_baseout = open(abspath+"/java/project.properties","wb")
pp_baseout.write( pp_basein.read() )

refcount=1

name="libpic"+env["SHLIBSUFFIX"]
dir="#bin/"+name
output=dir[1:]
ANDROID_HOME=os.environ.get('ANDROID_HOME')
ant_build=Dir('.').abspath+"/java/"
ANT_TARGET=ant_build+'local.properties'
ANT_SOURCES=ant_build+'build.xml'
ANDROID_HOME=os.environ.get('ANDROID_HOME')
ANT_COMMAND='ant release -Dsdk.dir='+ANDROID_HOME+' -f $SOURCE'

for x in env.android_source_modules:
    pp_baseout.write("android.library.reference."+str(refcount)+"="+x+"\n")
    refcount+=1

pp_baseout.close()


pp_basein = open(abspath+"/AndroidManifest.xml.template","rb")
pp_baseout = open(abspath+"/java/AndroidManifest.xml","wb")
manifest = pp_basein.read()
manifest = manifest.replace("$$ADD_APPLICATION_CHUNKS$$",env.android_manifest_chunk)
pp_baseout.write( manifest )


for x in env.android_source_files:
    shutil.copy(x,abspath+"/java/src/com/android/pic")  

for x in env.android_module_libraries:
    shutil.copy(x,abspath+"/java/libs") 


env.SharedLibrary("#bin/libpic",[android_objects],SHLIBSUFFIX=env["SHLIBSUFFIX"])

env.Command('#platform/android/java/libs/armeabi/libpic_android.so', dir, Copy('platform/android/java/libs/armeabi/libpic_android.so', output))

apk = env.Command(ANT_TARGET, source=ANT_SOURCES, action=ANT_COMMAND)

#env.Install('[install_dir]', apk)
#Cannot get this part to work, tried env.Install() but donno
#if env['target'] == 'release_debug'
    #copy 'platform/android/java/bin/Pic-release-unsigned.apk' to templates as 'android_debug.apk'
#else:
    #copy 'platform/android/java/bin/Pic-release-unsigned.apk' to templates as 'android_release.apk'

您应该考虑使用 SCons Install Builder。这是在 SCons 项目层次结构之外安装目标的唯一方法。