import semantize
private import annotation
-# Metadata associated to an Android project
+# Metadata associated to an `app.nit` project
class AppProject
- # Name of the resulting application
- var name: nullable String = null
+ # Pretty name of the resulting application
+ var name: String = mainmodule.first_real_mmodule.name is lazy
+
+ # Short project name used in `namespace` and configuration files
+ var short_name: String = mainmodule.name.replace("-", "_") is lazy
# Namespace/package used to identify the application
- var namespace: nullable String = null
+ var namespace = "org.nitlanguage.{short_name}" is lazy
# Version of the application
- var version: nullable String = null
+ var version = "0.1"
# Numerical version code of the application
- var version_code: Int = 0
+ var version_code: Int is lazy do
+
+ # Get the date and time (down to the minute) as string
+ var local_time = new Tm.localtime
+ var local_time_s = local_time.strftime("%y%m%d%H%M")
+ return local_time_s.to_i
+ end
+
+ # Extra folders where to find platform specific resource files
+ var files = new Array[String]
private var modelbuilder: ModelBuilder
private var mainmodule: MModule
init
do
var annot = modelbuilder.lookup_annotation_on_modules("app_name", mainmodule)
- if annot != null then name = annot.arg_as_string(modelbuilder)
+ if annot != null then
+ var val = annot.arg_as_string(modelbuilder)
+ if val != null then name = val
+ end
annot = modelbuilder.lookup_annotation_on_modules("app_version", mainmodule)
if annot != null then version = annot.as_version(modelbuilder)
annot = modelbuilder.lookup_annotation_on_modules("app_namespace", mainmodule)
- if annot != null then namespace = annot.arg_as_string(modelbuilder)
+ if annot != null then
+ var val = annot.arg_as_string(modelbuilder)
+ if val != null then namespace = val
+ end
- # Get the date and time (down to the minute) as string
- var local_time = new Tm.localtime
- var local_time_s = local_time.strftime("%y%m%d%H%M")
- version_code = local_time_s.to_i
+ var annots = modelbuilder.collect_annotations_on_modules("app_files", mainmodule)
+ for a in annots do files.add_all a.as_relative_paths(modelbuilder)
modelbuilder.toolcontext.check_errors
end
redef fun to_s do return """
-name: {{{name or else "null"}}}
-namespace: {{{namespace or else "null"}}}
-version: {{{version or else "null"}}}"""
+name: {{{name}}}
+namespace: {{{namespace}}}
+version: {{{version}}}"""
end
redef class AAnnotation
var args = n_args
if args.length < 1 then
- modelbuilder.error(self, "Annotation error: \"{name}\" expects at least a single argument.")
+ modelbuilder.error(self, "Syntax Error: `{name}` expects at least one argument.")
return ""
else
for arg in args do
- var format_error = "Annotation error: \"{name}\" expects its arguments to be of type Int or a call to `git_revision`"
-
var value
value = arg.as_int
if value != null then
# Get Git short revision
var proc = new ProcessReader("git", "rev-parse", "--short", "HEAD")
proc.wait
- assert proc.status == 0
+ if proc.status != 0 then
+ # Fallback if this is not a git repository or git bins are missing
+ version_fields.add "0"
+ modelbuilder.warning(self, "git_revision", "Warning: `git_revision` used outside of a git repository or git binaries not available")
+ continue
+ end
+
var lines = proc.read_all
var revision = lines.split("\n").first
continue
end
+ var format_error = "Syntax Error: `{name}` expects its arguments to be of type Int or a call to `git_revision`."
modelbuilder.error(self, format_error)
return ""
end
return version_fields.join(".")
end
+
+ # Parse all arguments as paths relative to the declaring module
+ #
+ # If no arguments are given, then use the parent directory of the module.
+ private fun as_relative_paths(modelbuilder: ModelBuilder): Array[String]
+ do
+ var paths = new Array[String]
+
+ var file = location.file
+ if file == null then return paths
+
+ var args = n_args
+ if args.is_empty then
+ paths.add file.filename.dirname
+ else
+ for arg in args do
+ var val = arg.as_string
+ if val != null then
+ paths.add file.filename.dirname/val
+ else modelbuilder.error(arg, "Syntax Error: `app_files` expects String literals as arguments.")
+ end
+ end
+
+ return paths
+ end
end