Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 516 → Rev 517

/DUBwise/trunk/j2me/BUILD
0,0 → 1,733
#!/usr/bin/env ruby
 
 
####################################
# #
### build-script for DUBwise #######
# #
# Author: Marcus -LiGi- Bueschleb #
# #
# see README for further Infos #
# #
####################################
 
 
def p_usage
puts "./BUILD [options] <profile> [bin_dir]"
puts "options:
-z -> 7Zip bindir
-l -> regenerate strings
-i -> regenerate images
-d -> debug output
-o -> obfuscate"
end
 
 
@log_flag=false
def log str
puts str if @log_flag
end
 
 
start_time=Time.now
 
resdir="res/"
 
version_split=File.read("version").delete("\n\r").split(".")
version_major=version_split[0]
version_minor=version_split[1]
version_patch=version_split[2]
 
 
advzip_flags="-4"
if ARGV.include?("-f")
advzip_flags=""
ARGV.delete("-f")
end
 
zip_bindir= ARGV.include?("-z")
obfuscate= ARGV.include?("-o")
 
@log_flag= ARGV.include?("-d")
 
ARGV.delete("-d")
ARGV.delete("-z")
ARGV.delete("-o")
 
if ARGV.include?("-l")
puts "regenerating language strings"
p `cd res ; ruby lang_gen.rb ; cd ..`
ARGV.delete("-l")
end
 
if ARGV.include?("-i")
puts "regenerating images"
p `cd res ; ruby image_gen.rb ; cd ..`
ARGV.delete("-i")
end
 
 
bindir="bin"
set="test"
 
if ARGV.length==2
bindir=ARGV[1]
puts `rm -rf #{bindir}`
end
 
 
 
screensizes=["240x320"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
fileapi_modes=["on"]
devicecontrol_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["all_firmwares"]
location_modes=["no_location"]
#map_modes=["no_map","J2MEMap"]
map_modes=["no_map"]
 
#defaults={{:screensizes=>["240x320"],:voice_moes=>["en_speedy"] , :bluetooth_modes=>["on"] , :devicecontrol_modes=>["on"],:fileapi_modes=>"off"
#"loeti"=>[{:screensizes=>["176x220"],:voice_moes=>["en_speedy"] , :bluetooth_modes=>["on"] , :devicecontrol_modes=>["on"] } ] ,
 
ARGV<<"" if ARGV==[]
case ARGV[0]
when "loeti"
 
when "xda"
# screensizes=["480x640"]
screensizes=["240x320"]
# screensizes=["128x128"]
voice_modes=["no_voice"]
bluetooth_modes=["on"]
devicecontrol_modes=["off"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["no_location"]
# location_modes=["jsr179"]
map_modes=["J2MEMap"]
# map_modes=["J2MEMap","no_maps"]
 
 
when "openlapi"
screensizes=["240x320"]
# screensizes=["128x128"]
voice_modes=["de_64kbit_tts"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["off"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["openlapi"]
# location_modes=["jsr179"]
map_modes=["J2MEMap"]
 
 
when "k750"
screensizes=["176x220"]
# screensizes=["128x128"]
voice_modes=["de_tts"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["off"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["no_location"]
# location_modes=["jsr179"]
map_modes=["J2MEMap"]
 
 
when "location_test"
screensizes=["128x128"]
voice_modes=["de_64kbit_tts"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["off"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["no_location","jsr179","openlapi"]
 
when "sven"
screensizes=["128x128"]
voice_modes=["de_64kbit_tts"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["off"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
 
when "p910"
screensizes=["200x300"]
voice_modes=["en_speedy"]
bluetooth_modes=["off"]
devicecontrol_modes=["off"]
fileapi_modes=["off"]
cldc11_modes=["off"]
 
when "test"
screensizes=["240x320"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["off","on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
#firmware_modes=["fc_mk3mag_firmwares"]
#firmware_modes=["all_firmwares"]
 
firmware_modes=["no_firmwares"]
 
when "wtk"
screensizes=["240x320"]
voice_modes=["en_wav"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
#firmware_modes=["fc_mk3mag_firmwares"]
#firmware_modes=["all_firmwares"]
firmware_modes=["all_firmwares"]
 
when "gpstest"
screensizes=["240x320"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["jsr179"]
map_modes=["J2MEMap"]
 
when "gpstestola"
screensizes=["240x320"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["openlapi"]
map_modes=["J2MEMap"]
 
when "gpstestall"
screensizes=["240x320"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["jsr179","openlapi"]
map_modes=["J2MEMap","no_map"]
 
 
when "bltest"
screensizes=["240x320"]
# screensizes=["176x220"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["all_firmwares"]
# location_modes=["jsr179"]
location_modes=["no_location"]
# map_modes=["J2MEMap"]
map_modes=["no_map"]
 
when "voicetest"
screensizes=["240x320"]
# screensizes=["176x220"]
voice_modes=["new_en_speedy_tts"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["all_firmwares"]
# location_modes=["jsr179"]
location_modes=["no_location"]
# map_modes=["J2MEMap"]
map_modes=["no_map"]
 
 
when "voiceall"
 
screensizes=["176x220","200x300","240x320","340x400","480x640"]
# screensizes=["176x220"]
voice_modes=["new_en_speedy_tts"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["jsr179"]
# location_modes=["no_location"]
map_modes=["J2MEMap"]
# map_modes=["no_map"]
 
 
when "n95"
screensizes=["240x320"]
# screensizes=["176x220"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["jsr179"]
# location_modes=["no_location"]
map_modes=["J2MEMap"]
# map_modes=["no_map"]
 
 
 
when "test2"
screensizes=["176x220"]
voice_modes=["en_speedy"]
bluetooth_modes=["on"]
devicecontrol_modes=["on"]
fileapi_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["all_firmwares"]
 
when "off"
screensizes=["240x320"]
voice_modes=["en_speedy"]
bluetooth_modes=["off"]
devicecontrol_modes=["off"]
fileapi_modes=["off"]
cldc11_modes=["off"]
 
when "alloff"
screensizes=["128x128","176x220","200x300","240x320","340x400","480x640"]
voice_modes=["no_voice","de_tts","de_64kbit_tts","en_speedy","en_wav","de_wav"]
bluetooth_modes=["off"]
devicecontrol_modes=["off"]
fileapi_modes=["off"]
cldc11_modes=["off"]
 
when "n80"
bluetooth_modes=["on"]
screensizes=["340x400"]
voice_modes=["en_speedy"]
fileapi_modes=["on"]
devicecontrol_modes=["on"]
cldc11_modes=["on"]
firmware_modes=["all_firmwares"]
when "common"
screensizes=["128x128","176x220","200x300","240x320","340x400","480x640"]
voice_modes=["no_voice","de_tts","de_64kbit_tts","en_speedy","en_wav","de_wav"]
bluetooth_modes=["on","off"]
fileapi_modes=["on","off"]
devicecontrol_modes=["on","off"]
cldc11_modes=["on","off"]
firmware_modes=["all_firmwares"]
location_modes=["no_location","jsr179"]
 
when "all"
screensizes=["128x128","176x220","200x300","240x320","340x400","480x640"]
voice_modes=["no_voice","de_tts","de_64kbit_tts","en_speedy","en_wav","de_wav"]
bluetooth_modes=["on","off"]
fileapi_modes=["on","off"]
devicecontrol_modes=["on","off"]
cldc11_modes=["on","off"]
firmware_modes=["all_firmwares","no_firmwares","fc_mk3mag_firmwares"]
location_modes=["no_location","jsr179","openlapi"]
 
 
when "allinstaller"
screensizes=["128x128","176x220","200x300","240x320","340x400","480x640"]
voice_modes=["no_voice","de_tts","de_64kbit_tts","en_speedy","en_wav","de_wav"]
bluetooth_modes=["on","off"]
fileapi_modes=["on","off"]
devicecontrol_modes=["on","off"]
cldc11_modes=["on","off"]
firmware_modes=["all_firmwares","no_firmwares","fc_mk3mag_firmwares"]
location_modes=["no_location","jsr179"]
# map_modes=["no_map","J2MEMap"]
map_modes=["no_map"]
 
 
when "allwm"
screensizes=["240x320","340x400","480x640"]
voice_modes=["no_voice"]
bluetooth_modes=["on"]
fileapi_modes=["off"]
devicecontrol_modes=["off"]
cldc11_modes=["on"]
firmware_modes=["no_firmwares"]
location_modes=["no_location"]
map_modes=["J2MEMap"]
 
when "alloff"
screensizes=["128x128","176x220","200x300","240x320","340x400","480x640"]
voice_modes=["no_voice","de_tts","de_64kbit_tts","en_speedy","en_wav","de_wav"]
bluetooth_modes=["off"]
fileapi_modes=["off"]
devicecontrol_modes=["off"]
cldc11_modes=["off"]
firmware_modes=["all_firmwares","no_firmwares","fc_mk3mag_firmwares"]
location_modes=["no_location"]
 
else
# screensizes=["128x128","176x220","200x300","240x320","340x400","480x640"]
# voice_modes=["no_voice","de_tts","de_64kbit_tts","en_speedy","en_wav","de_wav"]
# bluetooth_modes=["on","off"]
# fileapi_modes=["on","off"]
# devicecontrol_modes=["on","off"]
# cldc11_modes=["on","off"]
# firmware_modes=["no_firmwares","fc_mk3mag_firmware","all_firmwares"]
puts "no valid profile given"
exit
end
 
 
puts `mv build.props build.props.bak`
puts `ant clean`
puts `mkdir #{bindir}`
 
propertys={}
allthreads=[]
 
build_count= map_modes.length*location_modes.length* firmware_modes.length* cldc11_modes.length* devicecontrol_modes.length*fileapi_modes.length* bluetooth_modes.length* screensizes.length* voice_modes.length
puts "build_count: " + build_count.to_s
sleep 1
 
 
build=0
last_time=Time.now
new_build=true
reprocess_lib=true
puts "cleaning ressources"
p `rm -rf tmp/res `
p `mkdir tmp/res `
p `cp -v res/langpacks/* tmp/res/`
 
cldc11_modes.each { |cldc11|
reprocess_lib=true
### modifiers from here wont affect the communicator-lib
map_modes.each { |map_mode|
location_modes.each {|location_mode|
devicecontrol_modes.each { |devicecontrol|
fileapi_modes.each { |fileapi|
bluetooth_modes.each { |bluetooth|
 
new_build=true
### modifiers from here wont affect source - just ressources
voice_modes.each { |voice_mode|
new_voice=true
 
screensizes.each { |screensize|
new_screensize=true
firmware_modes.each {|firmware|
# new_firmwares=true
build=build+1
last_time=Time.now
propertys["screensize"]=screensize
 
 
# if allthreads.length>7
 
# allthreads.each { |t|
# p "waiting for thread" + t.inspect
# t.join
# }
# allthreads=[]
# end
propertys["voice_mode"]=voice_mode
propertys["bluetooth"]=bluetooth
propertys["fileapi"]=fileapi
propertys["devicecontrol"]=devicecontrol
propertys["cldc11"]=cldc11
propertys["version_major"]=version_major
propertys["version_minor"]=version_minor
propertys["version_patch"]=version_patch
propertys["basename"]="DUBwise-#{screensize}-#{voice_mode}-#{firmware}"
if location_mode=="jsr179"
propertys["basename"]+="-LocationAPI"
end
 
if location_mode=="openlapi"
propertys["basename"]+="-OpenLAPI"
end
if location_mode=="jsr179"
propertys["jsr179"]="on"
else
propertys["jsr179"]="off"
end
 
 
if location_mode=="openlapi"
propertys["openlapi"]="on"
else
propertys["openlapi"]="off"
end
 
if ((location_mode=="jsr179" ) || (location_mode=="openlapi" ))
propertys["location"]="on"
else
propertys["location"]="off"
end
 
 
propertys["basename"]+="-CLDC11" if cldc11=="on"
propertys["basename"]+="-FileAPI" if fileapi=="on"
propertys["basename"]+="-BluetoothAPI" if bluetooth=="on"
propertys["basename"]+="-DeviceControl" if devicecontrol=="on"
propertys["basename"]+="-J2MEMap" if map_mode=="J2MEMap"
 
propertys["bin_path"]="#{screensize}/#{cldc11=="on"?"cldc11":"cldc10"}/#{voice_mode}/bluetooth_#{bluetooth}/fileapi_#{fileapi}/devicecontrol_#{devicecontrol}/#{location_mode}"
 
 
if new_build
 
puts "compiling"
prefs_file= File.new("build.props","w")
propertys.each_pair {|name,value|
prefs_file << name+"="+value+"\n"
}
# prefs_file << "libs=lib/J2meMap_lib_cldc11.jar:lib/openlapi-jsr179-0.9.11.jar:lib/openlapi-0.9.11.jar\n"
# prefs_file << "classes=lib/classes_with_fileapi_and_jsr179.zip\n"
# prefs_file << "classes=lib/classes_with_fileapi.zip\n"
 
prefs_file.close
 
if reprocess_lib
puts `ant preprocess_lib`
reprocess_lib=false
end
build_params=""
build_params+=" -Dobfuscate=true" if obfuscate
build_params+=" -Dobfuscate=false" if !obfuscate
 
 
build_params+=" -Dlibs="
build_params+="lib/J2meMap_lib_cldc11.jar" if map_mode=="J2MEMap"
# build_params+=":lib/openlapi-jsr179-0.9.11.jar:lib/openlapi-0.9.11.jar" if location_mode=="openlapi"
 
build_params+=":lib/openlapi-0.9.11.jar" if location_mode=="openlapi"
 
 
if location_mode=="jsr179"
build_params+=" -Djsr179=on"
build_params+=" -Dclasses=lib/classes_with_fileapi_and_jsr179.zip"
else
build_params+=" -Dclasses=lib/classes_with_fileapi.zip"
build_params+=" -Djsr179=off"
end
 
if map_mode=="J2MEMap"
build_params+=" -Dj2memap=on"
else
build_params+=" -Dj2memap=off"
end
 
 
p propertys.inspect
`ant #{build_params} build`.each_line {
|l| puts l
exit if (l =~ /\[wtkbuild\].*error/)
}
new_build=false
`rm -rf tmp/bin`
`mkdir -p tmp/bin`
 
# `mv build/bin/#{propertys["basename"]}.jar tmp/bin`
`mv build/bin/#{propertys["basename"]}.jar tmp/bin/tmp.jar`
# `advzip -z -4 #{advzip_flags} tmp/bin/tmp.jar`
 
`rm build/bin/#{propertys["basename"]}.jad`
# `cd tmp/bin ; unzip #{propertys["basename"]}.jar ; rm #{propertys["basename"]}.jar ; cd ../..`
# else
# `ant only_jar`.each_line {
# |l| puts l
# exit if (l =~ /\[wtkbuild\].*error/)
# }
end # new build
 
# if new_firmwares
### p `rm -rf tmp/bin/*.bin `
### p `cp -v res/firmwares/#{firmware}/* tmp/bin`
 
p `cp -v tmp/bin/tmp.jar #{bindir}/#{propertys["basename"]}.jar`
#exit
# p `advzip #{advzip_flags} -a #{bindir}/#{propertys["basename"]}.jar res/images_by_screensize/#{screensize}/*`
 
# p `advzip #{advzip_flags} -a #{bindir}/#{propertys["basename"]}.jar res/voice_samples_by_name/#{voice_mode}/*`
 
# p `advzip #{advzip_flags} -a #{bindir}/#{propertys["basename"]}.jar res/firmwares/#{firmware}/*`
 
# p `advzip #{advzip_flags} -u #{bindir}/#{propertys["basename"]}.jar res/images_by_screensize/#{screensize}/* res/voice_samples_by_name/#{voice_mode}/* res/firmwares/#{firmware}/*`
 
 
# p `advzip #{advzip_flags} -u #{bindir}/#{propertys["basename"]}.jar res/images_by_screensize/#{screensize}/* res/voice_samples_by_name/#{voice_mode}/* res/firmwares/#{firmware}/*`
 
#
 
# p `7z #{advzip_flags} a -x.svn* #{bindir}/#{propertys["basename"]}.jar res/images_by_screensize/#{screensize}/* res/voice_samples_by_name/#{voice_mode}/* res/firmwares/#{firmware}/*`
 
 
# p `7z #{advzip_flags} a -x.svn* #{bindir}/#{propertys["basename"]}.jar res/images_by_screensize/#{screensize}/* res/voice_samples_by_name/#{voice_mode}/* res/firmwares/#{firmware}/*`
# allthreads<< Thread.new
#{
 
 
@basename=propertys["basename"]
# ` mkdir tmp/#{@basename} `
@screensize=screensize
@firmware=firmware
@voice_mode=voice_mode
 
 
 
log "compressing images"
log `cd res/images_by_screensize/#{@screensize} ; 7z a -x\!.svn* -w../../../tmp/ ../../../#{bindir}/#{@basename}.jar * ; cd ../../.. ` # res/images_by_screensize/#{screensize}/* res/voice_samples_by_name/#{voice_mode}/* res/firmwares/#{firmware}/*`
 
log "compressing firmwares"
log `cd res/firmwares/#{@firmware} && 7z a -x\!.svn* -w../../../tmp/ ../../../#{bindir}/#{@basename}.jar * && cd -`
log "compressing sounds"
log `cd res/voice_samples_by_name/#{@voice_mode} ; 7z a -x\!.svn* -w../../../tmp/ ../../../#{bindir}/#{@basename}.jar * ; cd ../../..`
 
 
# log "compressing images"
# log `cd res/images_by_screensize/#{@screensize} ; 7z a -w../../../tmp/#{@basename} -x\!.svn* ../../../#{bindir}/#{@basename}.jar * ; cd ../../.. ` # res/images_by_screensize/#{screensize}/* res/voice_samples_by_name/#{voice_mode}/* res/firmwares/#{firmware}/*`
 
# log "compressing firmwares"
# log `cd res/firmwares/#{@firmware} ; 7z a -x\!.svn* -w../../../tmp/#{@basename} ../../../#{bindir}/#{@basename}.jar * ; cd ../../..`
# log "compressing sounds"
# log `cd res/voice_samples_by_name/#{@voice_mode} ; 7z a -x\!.svn* -w../../../tmp/#{@basename}/ ../../../#{bindir}/#{@basename}.jar * ; cd ../../..`
 
 
# end
# new_screensize
### if new_screensize
### p `rm -rf tmp/bin/*.png `
### p `rm -rf tmp/bin/*.jpg `
### p `cp -v res/images_by_screensize/#{screensize}/* tmp/bin/`
### new_screensize=false
### end
### if new_voice
### p `rm tmp/bin/*.wav `
### p `rm tmp/bin/*.mp3 `
### p `cp -v res/voice_samples_by_name/#{voice_mode}/* tmp/bin/`
### new_voice=false
### end
# p `advzip -4 -a #{bindir}/#{propertys["basename"]}.jar tmp/bin/`
p "---------------"
# normal zip is larger than advzip and not working on e.g. N80 ( took me som time to figure out) p `cd tmp/bin ; zip ../../#{bindir}/#{propertys["basename"]}.jar -r . ; cd ../..`
 
# p `cd tmp ; advzip -4 -a ../#{bindir}/#{propertys["basename"]}.jar bin/* ; cd ..`
p "---------------"
# `cp tmp/jad/*.jad #{bindir}/#{propertys["basename"]}.jad`
# puts "#{bindir} ----+ " + Dir.pwd
jarsize=File.size("#{bindir}/#{@basename}.jar").to_s
jad_file=File.new("#{bindir}/#{@basename}.jad","w+")
jad_file << "MIDlet-Jar-URL: #{@basename}.jar\n"
jad_file << "MIDlet-Jar-Size: #{jarsize}\n"
jad_file << "MIDlet-Name: DUBwise\n"
jad_file << "MIDlet-Vendor: LiGi\n"
jad_file << "MIDlet-Version: " + version_split[0..1].join(".") + "\n"
jad_file << "MIDlet-1: DUBwise, i.png, DUBwise\n"
jad_file << "MIDletX-No-Command: true\n"
jad_file << "MIDlet-Icon: i.png\n"
jad_file << "MIDlet-Install-Notify: http://ligi.selfip.org/ligi/mail?subject=DUBWiseInstallNotify&text=jarname_#{@basename}\n"
jad_file << "MIDlet-Delete-Notify: http://ligi.selfip.org/ligi/mail?subject=DUBWiseDeleteNotify&text=jarname_#{@basename}\n"
 
jad_file.close
 
 
puts "done build # " + build.to_s + "/" + build_count.to_s + " Time:" + (Time.now-last_time ).to_s + " overall: #{((Time.now-start_time)/60).to_i.to_s}:#{((Time.now-start_time)%60).to_i.to_s}"
p "voice_mode" + voice_mode
p "Screensize " + screensize
p "size" + jarsize.to_s
# }
# `mkdir -p #{bindir}/#{propertys["bin_path"]}`
# `mv build/bin/#{propertys["basename"]}* #{bindir}/#{propertys["bin_path"]}`
##`mkdir -p #{bindir}/#{propertys["bin_path"]}`
##`mv build/bin/#{propertys["basename"]}* #{bindir}/#{propertys["bin_path"]}`
 
 
###`mkdir -p #{bindir}/`
###`mv build/bin/#{propertys["basename"]}* #{bindir}/`
 
 
# `mkdir -p #{bindir}/`
# `mv build/bin/#{propertys["basename"]}* #{bindir}/`
}
 
build_new=true if voice_mode!="no_voice"
}
}
}
}
}
}
}
}
 
sleep 3
puts "Joining all open threads (" + allthreads.length.to_s + "open)" + `pwd`
#sleep allthreads.length
allthreads.each { |t|
t.join
}
allthreads=[]
 
puts `mv -v build.props.bak build.props`
 
puts "Finished in #{((Time.now-start_time)/60).to_i.to_s}:#{((Time.now-start_time)%60).to_i.to_s}"
 
 
 
if zip_bindir
puts "Zipping bindir"
if File.exist?( "#{bindir}.7z")
puts "Zip allready there"
else
`7z a #{bindir}.7z #{bindir}`
end
end
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property