2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MSYS2 EXE配布用プログラム

Last updated at Posted at 2021-03-13

MSYS2でコンパイルして、exeファイルは、出来たが、配布する時にDLLファイルの配布が面倒くさいので、MSYS2に付属している Pythonを使って、配布用フォルダーにDLL類を自動でコピーします。

#使い方
(1) main関数の__exePath__と__releasePath__を設定します。
(2) __Qt5__用に__setDeployQt関数__を作ったが、必要のない方は、main関数で、コメントアウトしてください。
(3) 後は、実行するだけで__MSYS2傘下__のDLLをリリース用のフォルダーにコピーします。
(4) このリリース用フォルダーを丸ごと圧縮して、配布すれば、解凍先で動くと思います。

#解説
MSYS2に付属の__LDDコマンド__を利用して、exeファイルからのリンクされたDLLを検索しています。
(1) MSYS2のフォルダーを変更している方は、getLdd関数の__msysPath__を変更してください。
(2) getLdd関数内では、__"/c/windows/"__フォルダー傘下のDLLをリストから外しています。

pyRelease.py
# This Python file uses the following encoding: utf-8
import sys
import subprocess
import os
import shutil

def setDeployQt(exePath, releasePath):
    Deploy = "WinDeployQt.exe"
    #Deploy = "MacDeployQt.exe"

    result = subprocess.run([Deploy, "--libdir", releasePath, "--plugindir", releasePath, exePath], encoding="utf-8", stdout=subprocess.PIPE)
    print(result.stdout)

def getLdd(exePath):
    result = subprocess.run(["ldd", exePath], encoding="utf-8", stdout=subprocess.PIPE)
    resultList = result.stdout.split()

    msysPath = "c:/msys64"
    lddList = []
    for item in resultList:
        if ("/" in item):
            lowItem = item.lower()
            if ("/c/windows/" in lowItem) == False:
                fullPath = msysPath + lowItem
                if os.path.isfile(fullPath):
                    lddList.append(fullPath)

    return lddList

def uniList(ListA, ListB):
    ListC = []

    ListC = ListA
    for itemB in ListB:
        notFind = True
        for itemA in ListA:
            if itemB == itemA:
                notFind = False
                break

        if notFind:
            ListC.append(itemB)

    return ListC

def copyFileList(releasePath, lddList):
    for item in lddList:
        print("copy: ", item)
        shutil.copy2(item, releasePath)

def main():
    #setting
    exePath = "C:/work/hello/hello.exe"
    releasePath = "C:/work/hello/release"

    #create Folder
    if os.path.isdir(releasePath) == False:
        os.mkdir(releasePath)

    #copy exeFile
    shutil.copy2(exePath, releasePath)

    #Qt tool xxxDeployQt.exe
    setDeployQt(exePath, releasePath)

    #ldd command
    resultList = getLdd(exePath)

    #list deduplication
    lddList = []
    lddList = uniList([], resultList)

    #copy libFile
    copyFileList(releasePath, lddList)

if __name__ == "__main__":
    main()

環境設定により、完全な動作保証は、出来ていません。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?