CreateHardLink() public static method

public static CreateHardLink ( string destFileName, string sourceFileName ) : bool
destFileName string
sourceFileName string
return bool
Exemplo n.º 1
0
        public override bool Build(CompileMessages errors, bool forceRebuild)
        {
            if (!base.Build(errors, forceRebuild))
            {
                return(false);
            }
            string compiledDir      = AGSEditor.OUTPUT_DIRECTORY;
            string baseGameFileName = Factory.AGSEditor.BaseGameFileName;
            string newExeName       = GetCompiledPath(baseGameFileName + ".exe");
            string sourceEXE        = Path.Combine(Factory.AGSEditor.EditorDirectory, AGSEditor.ENGINE_EXE_FILE_NAME);

            File.Copy(sourceEXE, newExeName, true);
            UpdateWindowsEXE(newExeName, errors);
            CreateCompiledSetupProgram();
            Environment.CurrentDirectory = Factory.AGSEditor.CurrentGame.DirectoryPath;
            foreach (string fileName in Utilities.GetDirectoryFileList(compiledDir, "*"))
            {
                if (fileName.EndsWith(".ags"))
                {
                    using (FileStream ostream = File.Open(GetCompiledPath(baseGameFileName + ".exe"), FileMode.Append,
                                                          FileAccess.Write))
                    {
                        int startPosition = (int)ostream.Position;
                        using (FileStream istream = File.Open(fileName, FileMode.Open, FileAccess.Read))
                        {
                            const int bufferSize = 4096;
                            byte[]    buffer     = new byte[bufferSize];
                            for (int count = istream.Read(buffer, 0, bufferSize); count > 0;
                                 count = istream.Read(buffer, 0, bufferSize))
                            {
                                ostream.Write(buffer, 0, count);
                            }
                        }
                        // write the offset into the EXE where the first data file resides
                        ostream.Write(BitConverter.GetBytes(startPosition), 0, 4);
                        // write the CLIB end signature so the engine knows this is a valid EXE
                        ostream.Write(Encoding.UTF8.GetBytes(NativeConstants.CLIB_END_SIGNATURE.ToCharArray()), 0,
                                      NativeConstants.CLIB_END_SIGNATURE.Length);
                    }
                }
                else if (!fileName.EndsWith(AGSEditor.CONFIG_FILE_NAME))
                {
                    Utilities.CreateHardLink(GetCompiledPath(Path.GetFileName(fileName)), fileName, true);
                }
            }
            // Update config file with current game parameters
            Factory.AGSEditor.WriteConfigFile(GetCompiledPath());
            // Copy Windows plugins
            CopyPlugins(errors);
            return(true);
        }
Exemplo n.º 2
0
        public override bool Build(CompileMessages errors, bool forceRebuild)
        {
            if (!base.Build(errors, forceRebuild))
            {
                return(false);
            }
            if (!CheckPluginsHaveSharedLibraries())
            {
                errors.Add(new CompileError("Could not build for Linux due to missing plugins."));
                return(false);
            }
            foreach (string fileName in Directory.GetFiles(AGSEditor.OUTPUT_DIRECTORY))
            {
                if ((!fileName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) &&
                    (!Path.GetFileName(fileName).Equals("winsetup.exe", StringComparison.OrdinalIgnoreCase)) &&
                    (!Path.GetFileName(fileName).Equals(AGSEditor.CONFIG_FILE_NAME, StringComparison.OrdinalIgnoreCase)))
                {
                    Utilities.CreateHardLink(GetCompiledPath(LINUX_DATA_DIR, Path.GetFileName(fileName)), fileName, true);
                }
            }
            // Update config file with current game parameters
            Factory.AGSEditor.WriteConfigFile(GetCompiledPath(LINUX_DATA_DIR));

            foreach (KeyValuePair <string, string> pair in GetRequiredLibraryPaths())
            {
                string fileName = pair.Value;
                if (!fileName.EndsWith(pair.Key))
                {
                    fileName = Path.Combine(fileName, pair.Key);
                }
                string folderName = null;
                if ((!fileName.EndsWith("ags32")) && (!fileName.EndsWith("ags64")))
                {
                    // the engine files belong in the LINUX_DATA_DIR, but the other libs
                    // should have lib32 or lib64 subdirectories as part of their name
                    folderName = Path.GetFileName(Path.GetDirectoryName(fileName).TrimEnd(Path.DirectorySeparatorChar));
                }
                Utilities.CreateHardLink(GetCompiledPath(LINUX_DATA_DIR, folderName, Path.GetFileName(fileName)),
                                         fileName, true);
            }
            string linuxDataLib32Dir   = GetCompiledPath(LINUX_DATA_DIR, LINUX_LIB32_DIR);
            string linuxDataLib64Dir   = GetCompiledPath(LINUX_DATA_DIR, LINUX_LIB64_DIR);
            string editorLinuxDir      = Path.Combine(Factory.AGSEditor.EditorDirectory, LINUX_DIR);
            string editorLinuxLib32Dir = Path.Combine(editorLinuxDir, LINUX_LIB32_DIR);
            string editorLinuxLib64Dir = Path.Combine(editorLinuxDir, LINUX_LIB64_DIR);

            foreach (string soName in _plugins)
            {
                Utilities.CreateHardLink(Path.Combine(linuxDataLib32Dir, soName),
                                         Path.Combine(editorLinuxLib32Dir, soName), true);
                Utilities.CreateHardLink(Path.Combine(linuxDataLib64Dir, soName),
                                         Path.Combine(editorLinuxLib64Dir, soName), true);
            }
            string scriptFileName = GetCompiledPath(Factory.AGSEditor.BaseGameFileName.Replace(" ", "")); // strip whitespace from script name
            string scriptText     =
                @"#!/bin/sh
SCRIPTPATH=""$(dirname ""$(readlink -f $0)"")""

if test ""x$@"" = ""x-h"" -o ""x$@"" = ""x--help""
  then
    echo ""Usage:"" ""$(basename ""$(readlink -f $0)"")"" ""[<ags options>]""
    echo """"
fi

if test $(uname -m) = x86_64
  then" + GetSymLinkScriptForEachPlugin(true) +
                @"
  else" + GetSymLinkScriptForEachPlugin(false) +
                @"
fi
";

            scriptText = scriptText.Replace("\r\n", "\n"); // make sure script has UNIX line endings
            FileStream stream = File.Create(scriptFileName);

            byte[] bytes = Encoding.UTF8.GetBytes(scriptText);
            stream.Write(bytes, 0, bytes.Length);
            stream.Close();
            return(true);
        }