web-dev-qa-db-ja.com

iconutilを使用してicnsファイルを手動で作成する方法は?

アプリを検証しているときに、次のエラーが表示されます。

アプリケーションバンドルには、512x512512x512@2xイメージの両方を含むICNS形式のアイコンは含まれていません。

Img2icns appを使用してicnsアイコンを作成し、今日まで常に適切に機能していました。しかし、今私はそのエラーを受け取っており、それを機能させる方法はありません。 Img2icns で2つのPNGファイル(512x512および1024x1024)を一緒にしようとしましたが、常にそのエラーが発生します。 AppleのOS Xヒューマンインターフェイスガイドラインの指示に従うことも試みましたが、アイコンセットを作成しようとすると、この端末エラーが発生します。

-bash:予期しないトークン 'newline'の近くの構文エラー

私は端末コマンドがあまり得意ではないので、何か間違ったことをしているのかもしれません。私が書いた:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

誰か助けていただければ幸いです。ありがとう、マッシー。

95
Blue

次の指示を確認してください( link ):

iconutilを使用して、icnsファイルを手動で作成します

iconutilコマンドラインツールは、iconsetフォルダーを展開可能な高解像度のicnsファイルに変換します。 (ターミナルでman iconutilと入力すると、このツールの完全なドキュメントを見つけることができます。)このツールを使用すると、結果のicnsファイルも圧縮されるため、追加の圧縮を実行する必要はありません。

アイコンのセットをicnsファイルに変換するには

ターミナルウィンドウに次のコマンドを入力します。

iconutil -c icns <iconset filename>

ここで、<iconset filename>は、icnsに変換するアイコンのセットを含むフォルダーへのパスです。出力は、次のように出力ファイルを指定しない限り、iconset fileと同じ場所に書き込まれます。

iconutil -c icns -o <icon filename> <iconset filename>

つまり、<iconset filename>をパスで置き換える必要があります。

/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset

パスにはスペースが含まれているため、次のように二重引用符を使用する必要があります。

iconutil -c icns "/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset"

このコマンドは正常に機能するはずです。

57
Anne

以下は、1024x1024 png( "Icon1024.png"という名前)を必要なicnsファイルに変換するスクリプトです。 PNGファイルがターミナル「cd」で同じフォルダーにあるフォルダーの「CreateICNS.src」というファイルに保存し、「source CreateICNS.src」と入力して呼び出します。

mkdir MyIcon.iconset
sips -z 16 16     Icon1024.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64     Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 128 128   Icon1024.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/[email protected]
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset
247
Aidan

PNGファイルをアイコンセットディレクトリに変換するすべての作業を行うコマンドラインノードモジュールがあります。

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
18
Zeke

あらゆる種類のスクリプトを使用して高解像度のPNG画像をさまざまな低解像度のコピーに変換するのは便利に思えるかもしれませんが(実際はそうです)、この種の自動サイズ変更が知覚的に不完全になることを忘れないでください画像。

解像度が低いほど、アイコンがぼやけます!

代わりに、たとえばSVGのように、デザイナーからベクトル形式のロゴを常にリクエストする必要があります。これにより、必要なすべての解像度で完全なPNGファイルを手動で準備し、単一の.icnsファイルを作成できます。これにより、携帯電話から一部のハイエンドRetinaまで、すべての画面でアプリのアイコンが美しく見えます最新のiMacの表示。

2016年現在の最新の Appleガイドライン から、次のPNGファイルを準備する必要があります。

+---------------------+--------------------+--------------+
|      filename       | resolution, pixels | density, PPI |
+---------------------+--------------------+--------------+
| icon_16x16.png      | 16x16              |           72 |
| [email protected]   | 32x32              |          144 |
| icon_32x32.png      | 32x32              |           72 |
| [email protected]   | 64x64              |          144 |
| icon_128x128.png    | 128x128            |           72 |
| [email protected] | 256x256            |          144 |
| icon_256x256.png    | 256x256            |           72 |
| [email protected] | 512x512            |          144 |
| icon_512x512.png    | 512x512            |           72 |
| [email protected] | 1024x1024          |          144 |
+---------------------+--------------------+--------------+

すべてのPNGファイルが準備されたら、.iconset拡張子(たとえば、Logos.iconset)を持つディレクトリに配置し、ターミナルから次を実行します。

iconutil --convert icns Logos.iconset

このコマンドの実行後にエラーが発生しなかった場合、すべてのファイルが適切に処理され、同じディレクトリにあるLogos.icnsファイルが取得されました。 2017年。

14

これらのコマンド(ターミナルに入力)は、古いicnsファイルを新しい形式に変換するために私のために働きました:

cd Folder_With_Icns_File
iconutil -c iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil -c icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset

更新

Iconutilの-cパラメーターはサポートされなくなりました。代わりに--convertを使用します。

cd Folder_With_Icns_File
iconutil --convert iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil --convert icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset
12
Aidan

追加のコメント、。icnsファイルを作成する場合、すべてのpicファイルの名前を接頭辞 "icon _"に変更する必要があります。そうしないと、iconutilはエラーメッセージで失敗します: ".iconset:error:ICNSの生成に失敗しました」これはまったく有益ではありません。

9
Bearsu

私はsvgファイルからicnsを作成するためのbashスクリプトを書きました:

#!/usr/bin/env bash 
sizes=(16 32 64 128 256 512)
largfile='[email protected]'
if [ ! -f "$largfile" ]; then
  convert -background none -resize 1024x1024 "$1" "$largfile"
fi
for s in "${sizes[@]}"; do
  echo $s
  convert -background none -resize ${s}x${s} "$largfile" "icon_${s}x$s.png"
done

cp 'icon_32x32.png'     '[email protected]'
mv 'icon_64x64.png'     '[email protected]'
cp 'icon_256x256.png'   '[email protected]'
cp 'icon_512x512.png'   '[email protected]'

mkdir icon.iconset
mv icon_*x*.png icon.iconset
iconutil -c icns icon.iconset

Macでlibrsvgサポートを使用してimagemagickがインストールされていることを確認します。

brew install imagemagick --with-librsvg

このスクリプトは非常に役立ちました。


更新

より完全な処理のために、正しいレイアウトと形式でAppIcon.appiconsetを生成するためのコマンドラインツール(Swiftで記述)を作成しました。

https://github.com/kindlychung/genicon

5
qed

@Henryのスクリプトをリファクタリングして、見栄えを良くしました。

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

更新

Iconutilの-cパラメーターはサポートされなくなりました。代わりに-—convertを使用します。

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR
5
dardo82

@Henry(上記のコメント)と同じですが、引数としてPNGファイル名を取り、同じ名前のICNSを出力します。

注: PNGファイル名は、個別の拡張子、つまりxpto.pngに対して1ポイントのみが想定されています。

したがって、PNGファイルがあるフォルダーの「CreateICNS.src」というファイルに以下のコードを保存します。

コード:

IFS='.' read -ra ADDR <<< "$1"
ICONSET=${ADDR[0]}.iconset
mkdir $ICONSET
sips -z 16 16     $1 --out $ICONSET/icon_16x16.png
sips -z 32 32     $1 --out $ICONSET/[email protected]
sips -z 32 32     $1 --out $ICONSET/icon_32x32.png
sips -z 64 64     $1 --out $ICONSET/[email protected]
sips -z 128 128   $1 --out $ICONSET/icon_128x128.png
sips -z 256 256   $1 --out $ICONSET/[email protected]
sips -z 256 256   $1 --out $ICONSET/icon_256x256.png
sips -z 512 512   $1 --out $ICONSET/[email protected]
sips -z 512 512   $1 --out $ICONSET/icon_512x512.png
cp $1 $ICONSET/[email protected]
iconutil -c icns $ICONSET
rm -R $ICONSET

使用方法:

次に、ターミナルで同じフォルダーに「cd」し、次のように入力します。

source CreateICNS.src {PNG filename}

{PNGファイル名}はPNGファイルの名前、つまりxpto.pngです。

ファイルの名前がabc.pngの場合、次を使用します。

source CreateICNS.src abc.png
4
Telmo Dias

Dead Simple .png ???? .icns

  1. ダウンロード IconMaker.app -ただの.applescriptは噛み付きません
  2. .pngを作成したIconMaker.appにドラッグアンドドロップします。

詳細情報http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

高Sierraアップデートiconutilは、ソース.pngサイズに関してより厳密になりました。これについては、ジャンプ後のブログ投稿で詳しく説明しています。 ✌️

4
eonist

アプリを検証しているときに、次のエラーが表示されます。

アプリケーションバンドルには、512x512および512x512 @ 2xイメージの両方を含むICNS形式のアイコンが含まれていません。

私は端末コマンドがあまり得意ではないので、何か間違ったことをしているのかもしれません。私が書いた:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

一つには、アンの答えに関するコメントで述べたように、おそらくiconutilを使用する必要はありません。プロジェクトにアイコンセットを追加し、ビルドの一部としてXcodeに変換させることができるはずです。

いずれにしても、これはあなたの問題かもしれません:

2つのPNGファイル(512x512および1024x1024)を追加しようとしましたが、常にエラーが発生します。

1024 x 1024のポイントサイズはありません。 1024 x 1024ピクセル要素(Mountain Lion以前は1024ポイントだった)が512 x 512ポイント@ 2xに使用されるようになりました

PNGファイルには適切な名前を付ける必要があります:[email protected]

3
Peter Hosey

Appleの古いアイコンComposerバージョン2.2は正常に機能します。その中の.ICNSを開き、1024x1024ボタンを押して画像を追加します。

3
valexa

@ dardo82のシェルコードは適切で、機能しています。これはsh(すべての* nixの場合)でより単純なものであり、より高速です(本当に重要です)。

#!/bin/sh
#   This runs silent, be as verbose as you wish
NAME=$(basename ${1} .png)
DIR="${NAME}.iconset"
mkdir -p ${DIR}
for i in 16 32 128 256 512 ; do
    x=""
    for p in $i $(($i+$i)) ; do
        sips -z $p $p ${1} --out "${NAME}.iconset/icon_${i}x${i}${x}.png"
        x="@2x"
    done
done >/dev/null  # /dev/null in lieu of a "-s" silent option
iconutil -—convert icns $DIR
rm -r $DIR
2
MichaelT

iconutil -c icns Icon.iconsetを実行します

注意

  • Icon.iconsetはフォルダーです
  • 名前は小文字のicon_で始まります
  • Icon.icnsが正しい画像で表示されたら、それが機能することがわかります

enter image description here

2
onmyway133

2つのタスクがあります。
-10個の正しいicnsファイルを作成します
-Xcodeプロジェクトを取得して正しく使用する

これらの両方のタスクに1時間の問題があり、また何が起こっているのかを「見ない」のが気に入らないので、慎重なタスクへの道をここに示します。

10個の正しいicnsファイルを作成:
Henryの上記のスクリプトを使用しました: 'c'コマンドを含め、HighSierraおよびXcode 9.2で引き続き動作します。
私が入手したicnsファイルは、Finder/QuicklookおよびPreviewでアイコンサイズが1つだけで、10個のサイズのうち8個しか表示されませんでした。
だから、ターミナルを使用し、cdを使用してフォルダーに移動し、作成したicnsファイルでiconutil -c iconset(icns filename)コマンドを使用して、icnsファイルをiconsetフォルダーに戻します。見よ-新しく作成した10個のアイコンファイルを確認できました。アイコンセットフォルダーのクイックルックを使用して(およびスライダーでズームできるようにフルスクリーンモードを使用して)、すべてのサイズが実際に非常によく見えることを確認できました。

余談ですが、PSEでのサイズ変更の試みよりも見栄えが良かったのは、おそらくPSEのすべてのサイズ変更オプションを時間をかけてプレイしなかったためです。 PSEを使用する場合、PNGファイルがカラープロファイルなしで保存されていることを確認してください。また、無知を告白すると、私にとって256x256 @ 2ファイルは512x512ファイルと同じです-両方とも72dpiです。上記の144 dpiのコメントに従おうとしてもうまくいきませんでした。

それらを正しく使用するためにXcodeプロジェクトを入手してください:
最初に、Xcode内のすべての実りのない試みを削除し、クリーンバージョンをgitリポジトリにコミットしました(巧妙だったのは、クリーンバージョンを最初にコミットすることでした-アイコン追加オデッセイを必死に開始する前)。
また、info.plistファイルには「アイコンファイル」エントリにリンクされたポインターがなく、一般プロジェクト設定ではアプリアイコンにAppIconを選択したことも確認しました。
次に、assets.assetカタログを追加し、assetカタログ内にOS用の新しい「AppIconsおよびLaunch Images」AppIconフォルダーを追加しました。
次に、各PNG画像ファイルをiconsetフォルダーからそれぞれのAppIcon Spaceholderにコピー(オプションを押しながらドラッグアンドドロップ)しました。繰り返しになりますが、何が起こっているのかがわかりました。 Xcodeはそれをicnsファイルに変換しました。または、おそらく、icnsフォルダーから派生したiconsetフォルダーとして、ファイル形式が受け入れられました。

その後、アーカイブして検証すると、アップロードまたは検証時にエラーは発生しません。

1
Uwe

以下は主に Henryの例 に基づいた関数です(~/.bash_profileで便利です):

mkicns() {
    if [[ -z "$*" ]] || [[ "${*##*.}" != "png" ]]; then
        echo "Input file invalid"
    else
        filename="${1%.*}"
        mkdir "$filename".iconset
        for i in 16 32 128 256 ; do
            n=$(( i * 2 ))
            sips -z $i $i "$1" --out "$filename".iconset/icon_${i}x${i}.png
            sips -z $n $n "$1" --out "$filename".iconset/icon_${i}x${i}@2x.png
            [[ $n -eq 512 ]] && \
            sips -z $n $n "$1" --out "$filename".iconset/icon_${n}x${n}.png
            (( i++ ))
        done
        cp "$1" "$filename".iconset/[email protected]
        iconutil -c icns "$filename".iconset
        rm -r "$filename".iconset
    fi
}

使用法

$ mkicns "filename.png"  # double-quote if spaces exist in filename

16x16から512x512@2xの10サイズを作成します。 .png形式の入力画像のみを受け入れます。

0
l'L'l

こんにちは、私のニーズに合わせて、ドラッグアンドドロップアイコンのみで動作するドロップレット、またはフォルダ内で検索するアイコンを作成しました(すべてのアイコンのボリュームでの検索には時間がかかるため、フォルダに限定しました)。そのため、ドラッグアンドドロップでは、フォルダまたはアプリケーション(アイコンを含むことができるもの)をドロップできます。作成されたアイコンセットには、元のアイコンの名前が付けられ、ディレクトリ「/ aaaicones」とアイコンのパスに配置されます。フォルダ "/ aaaicones xcode.appを送信すると、"/aaaicones/Applications/xcode.app/access.iconset "および/aaaicones/Applications/xcode.app/access.icns(再作成されたアイコン)にテキストが表示されます。アイコンの完全なパスをトレースするファイル、および対応するアイコンセットの例へのパス "/Applications/xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPlugIn.framework/Versions/A/Resources/ access.icns "" /aaaicones/Applications/xcode.app/access.iconset "の例(xcode)では、最後にフォルダーを作成できます。 (すべてのアイコンとアイコンセットを含む)サイズが214 MB。アイコンを単独で扱う場合、アイコンはディレクトリ「/ aaaicones/aIconeseule /」とその元のパスに配置されます。例:/ aaaicones/aIconeseule/Mac Elcapitan/.VolumeIcon.icnsおよび/ aaaicones/aIconeseule/Mac Elcapitan /.VolumeIcon/aaaicones/aIconeseule/Mac Elcapitan/aalisticones.txtの.iconset液滴は下にあります

on open draggedItems
    set input to draggedItems
    set fich to draggedItems


    set media to {}

    set theInfo to {}

    set n to "0"
    repeat with currentItem in draggedItems
        set dirchoisi to POSIX path of fich
        if ".icns" is not in dirchoisi then
            if "Volumes" is not in dirchoisi then

                set origi to do Shell script "echo   /aaaicones" & dirchoisi
                set fich to do Shell script "echo " & fich & " | xxd -p -c 100000 | sed 's#3a#2f#g' | xxd -r -p | sed 's#" & dirchoisi & "#" & "/aaaicones" & dirchoisi & "#g' | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"
                tell application "Finder"
                    if exists (folder fich) then
                        set nn to "0"
                        repeat with nn from 1 to 5
                            set origi to do Shell script "echo  " & origi & "/" & " | sed 's#//#" & nn & "/" & "#'"
                            set fich to do Shell script "echo " & fich & " | sed 's#:aaaicones*.*#" & origi & "#'" & " | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"

                            if not (exists folder (fich as Unicode text)) then
                                try
                                    set origi to do Shell script "echo  " & origi
                                    exit repeat
                                end try
                            end if
                        end repeat
                    end if
                end tell
                tell application "Finder"
                    if not (exists folder (fich as Unicode text)) then
                        do Shell script "mkdir -p -m 0777 " & quoted form of origi
                    end if
                end tell
                try
                    set theInfo to do Shell script "find " & (quoted form of dirchoisi) & " -name *.icns "
                end try




                set AppleScript's text item delimiters to return

                set theList to text items of theInfo

                set AppleScript's text item delimiters to ""

                set n to count theList
                repeat with i from 1 to n
                    if "Volumes" is not in item i of theList then
                        set end of media to item i of theList
                    end if
                end repeat
                set n to count media
                set cheminicns to do Shell script " > " & quoted form of (origi & "aalisticones.txt") & " |  chmod 777 " & quoted form of (origi & "aalisticones.txt")
                set cheminicns to do Shell script "ls " & quoted form of (origi & "aalisticones.txt")

                tell application "Finder"
                    set letext to (POSIX file cheminicns as alias)
                    set label index of letext to 2
                end tell



                repeat with i from 1 to n

                    set hdd to item i of media
                    try

                        set input to do Shell script "echo   " & hdd & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
                        do Shell script "echo   " & quoted form of input & " >>" & quoted form of cheminicns
                        set png to do Shell script "echo " & quoted form of input & " | sed 's#.*/##' "

                        do Shell script "cp -f " & quoted form of input & " " & quoted form of origi
                        set input to do Shell script "iconutil -c iconset  " & quoted form of (origi & png)
                        do Shell script "echo   " & quoted form of (origi & png) & " | sed 's#.icns#.iconset#' >>" & quoted form of cheminicns
                    end try
                end repeat
                tell application "Finder"
                    if exists (folder fich) then
                        open fich
                    end if
                end tell

            end if
        else

            set input to do Shell script "echo   " & dirchoisi & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
            set png to do Shell script "echo " & quoted form of input & " | sed 's#.*/##' "
            set origi to do Shell script "echo " & quoted form of ("/aaaicones/aIconeseule/" & input) & " | sed 's#/Volumes/##; s#" & quoted form of png & "##'"
            do Shell script "mkdir -p -m 0777 " & quoted form of origi
            do Shell script "echo   " & quoted form of input & " >>" & quoted form of origi & "aalisticones.txt"

            do Shell script "cp -f " & quoted form of input & " " & quoted form of origi
            set input to do Shell script "iconutil -c iconset  " & quoted form of (origi & png)
            do Shell script "echo   " & quoted form of (origi & png) & " >>" & quoted form of origi & "aalisticones.txt"
        end if
    end repeat
end open
0
deek5

私はこれが必要でしたが、CMakeのために。また、SVGを提供するオプションも必要でした。

ここに要点があります: https://Gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

CMakeコード:

# LICENSE: CC0 - go nuts.

# Hi :) This is what I used to generate the ICNS for my game, Tide.
# Both input formats (SVG vs PNG) work just fine, but in my experience
# the SVG came out with noticeably better results (although PNG wasn't
# a catastrophe either). The logo for the game was simple enough that
# SVG was indeed an option.

# To use:
#
#    make_icns( INPUT "path/to/img.{svg,png}"
#               OUTPUT ICNS_PATH )
#
# Then add it as a custom target or use it as a
# dependency somewhere - I give you that option.
#
# For example:
#
#    add_custom_target( my-icns ALL DEPENDS "${ICNS_PATH}" )
#
# For the associated utilities:
#
# - PNG: brew install imagemagick
# - SVG: brew cask install inkscape
#
# Enjoy!

function (make_icns_from_png)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    find_program (
        convert_exe
        NAMES "convert" "convert.exe"
        DOC "Path to ImageMagick convert")
    if (NOT convert_exe)
        message (FATAL_ERROR "Could not find ImageMagick's 'convert' - is ImageMagick installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size}x${size}" "${ipath}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size2x}x${size2x}" "${ipath2x}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns_from_svg)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    set (CMAKE_FIND_APPBUNDLE NEVER) # otherwise, it'll pick up the app bundle and open a shit ton of windows
    find_program (
        inkscape_exe
        NAMES "inkscape" "inkscape.exe"
        DOC "Path to Inkscape"
        PATHS "/usr/local/bin" "/usr/bin")

    message (STATUS "Inkscape path: ${inkscape_exe}")

    if (NOT inkscape_exe)
        message (FATAL_ERROR "Could not find Inkscape - is it installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath}" -w ${size} -h ${size} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath2x}" -w ${size2x} -h ${size2x} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    if (NOT ARG_INPUT)
        message (FATAL_ERROR "INPUT is required")
    endif ()

    if (NOT IS_ABSOLUTE "${ARG_INPUT}")
        get_filename_component (ARG_INPUT "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    endif ()

    if (NOT EXISTS "${ARG_INPUT}")
        message (FATAL_ERROR "INPUT does not exist: ${ARG_INPUT}")
    endif ()

    file (RELATIVE_PATH ARG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}" "${ARG_INPUT}")

    get_filename_component (ARG_INPUT_EXT "${ARG_INPUT}" EXT)
    if ("${ARG_INPUT_EXT}" STREQUAL ".png")
        make_icns_from_png (INPUT "${ARG_INPUT}" OUTPUT child_output)
    elseif ("${ARG_INPUT_EXT}" STREQUAL ".svg")
        make_icns_from_svg (INPUT "${ARG_INPUT}" OUTPUT child_output)
    else ()
        message (FATAL_ERROR "INPUT must refer to a .png or .svg, but a ${ARG_INPUT_EXT} was provided")
    endif ()

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${child_output}" PARENT_SCOPE)
    endif ()
endfunction ()
0
Qix