アプリを検証しているときに、次のエラーが表示されます。
アプリケーションバンドルには、
512x512
と512x512@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>
誰か助けていただければ幸いです。ありがとう、マッシー。
次の指示を確認してください( 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"
このコマンドは正常に機能するはずです。
以下は、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
PNGファイルをアイコンセットディレクトリに変換するすべての作業を行うコマンドラインノードモジュールがあります。
npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
あらゆる種類のスクリプトを使用して高解像度の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年。
これらのコマンド(ターミナルに入力)は、古い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
追加のコメント、。icnsファイルを作成する場合、すべてのpicファイルの名前を接頭辞 "icon _"に変更する必要があります。そうしないと、iconutilはエラーメッセージで失敗します: ".iconset:error:ICNSの生成に失敗しました」これはまったく有益ではありません。
私は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で記述)を作成しました。
@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
@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
詳細情報: http://eon.codes/blog/2016/12/06/Creating-an-app-icon/
高Sierraアップデートiconutil
は、ソース.pngサイズに関してより厳密になりました。これについては、ジャンプ後のブログ投稿で詳しく説明しています。 ✌️
アプリを検証しているときに、次のエラーが表示されます。
アプリケーションバンドルには、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]
Appleの古いアイコンComposerバージョン2.2は正常に機能します。その中の.ICNSを開き、1024x1024ボタンを押して画像を追加します。
@ 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つのタスクがあります。
-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フォルダーとして、ファイル形式が受け入れられました。
その後、アーカイブして検証すると、アップロードまたは検証時にエラーは発生しません。
以下は主に 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
形式の入力画像のみを受け入れます。
こんにちは、私のニーズに合わせて、ドラッグアンドドロップアイコンのみで動作するドロップレット、またはフォルダ内で検索するアイコンを作成しました(すべてのアイコンのボリュームでの検索には時間がかかるため、フォルダに限定しました)。そのため、ドラッグアンドドロップでは、フォルダまたはアプリケーション(アイコンを含むことができるもの)をドロップできます。作成されたアイコンセットには、元のアイコンの名前が付けられ、ディレクトリ「/ 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
私はこれが必要でしたが、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 ()