src/Pure/Tools/build.scala
changeset 77204 d69732bc3dbe
parent 77192 198697983eec
child 77206 6784eaef7d0c
equal deleted inserted replaced
77203:775baca8cc8a 77204:d69732bc3dbe
   207     val full_sessions =
   207     val full_sessions =
   208       Sessions.load_structure(build_options, dirs = dirs, select_dirs = select_dirs, infos = infos,
   208       Sessions.load_structure(build_options, dirs = dirs, select_dirs = select_dirs, infos = infos,
   209         augment_options = augment_options)
   209         augment_options = augment_options)
   210     val full_sessions_selection = full_sessions.imports_selection(selection)
   210     val full_sessions_selection = full_sessions.imports_selection(selection)
   211 
   211 
   212     def sources_stamp(deps: Sessions.Deps, session_name: String): String = {
       
   213       val digests =
       
   214         full_sessions(session_name).meta_digest ::
       
   215         deps.session_sources(session_name) :::
       
   216         deps.imported_sources(session_name)
       
   217       SHA1.digest_set(digests).toString
       
   218     }
       
   219 
       
   220     val build_deps = {
   212     val build_deps = {
   221       val deps0 =
   213       val deps0 =
   222         Sessions.deps(full_sessions.selection(selection),
   214         Sessions.deps(full_sessions.selection(selection),
   223           progress = progress, inlined_files = true, verbose = verbose,
   215           progress = progress, inlined_files = true, verbose = verbose,
   224           list_files = list_files, check_keywords = check_keywords).check_errors
   216           list_files = list_files, check_keywords = check_keywords).check_errors
   228           deps0.sessions_structure.build_topological_order.flatMap(name =>
   220           deps0.sessions_structure.build_topological_order.flatMap(name =>
   229             store.try_open_database(name) match {
   221             store.try_open_database(name) match {
   230               case Some(db) =>
   222               case Some(db) =>
   231                 using(db)(store.read_build(_, name)) match {
   223                 using(db)(store.read_build(_, name)) match {
   232                   case Some(build)
   224                   case Some(build)
   233                   if build.ok && build.sources == sources_stamp(deps0, name) => None
   225                   if build.ok && build.sources == deps0.sources_shasum(name) => None
   234                   case _ => Some(name)
   226                   case _ => Some(name)
   235                 }
   227                 }
   236               case None => Some(name)
   228               case None => Some(name)
   237             })
   229             })
   238 
   230 
   352             using(store.open_database(session_name, output = true))(db =>
   344             using(store.open_database(session_name, output = true))(db =>
   353               store.write_session_info(db, session_name, job.session_sources,
   345               store.write_session_info(db, session_name, job.session_sources,
   354                 build_log =
   346                 build_log =
   355                   if (process_result.timeout) build_log.error("Timeout") else build_log,
   347                   if (process_result.timeout) build_log.error("Timeout") else build_log,
   356                 build =
   348                 build =
   357                   Session_Info(sources_stamp(build_deps, session_name), input_heaps, heap_digest,
   349                   Session_Info(build_deps.sources_shasum(session_name), input_heaps, heap_digest,
   358                     process_result.rc, UUID.random().toString)))
   350                     process_result.rc, UUID.random().toString)))
   359 
   351 
   360             // messages
   352             // messages
   361             process_result.err_lines.foreach(progress.echo)
   353             process_result.err_lines.foreach(progress.echo)
   362 
   354 
   396                         case Some(build) =>
   388                         case Some(build) =>
   397                           val heap_digest = store.find_heap_digest(session_name)
   389                           val heap_digest = store.find_heap_digest(session_name)
   398                           val current =
   390                           val current =
   399                             !fresh_build &&
   391                             !fresh_build &&
   400                             build.ok &&
   392                             build.ok &&
   401                             build.sources == sources_stamp(build_deps, session_name) &&
   393                             build.sources == build_deps.sources_shasum(session_name) &&
   402                             build.input_heaps == ancestor_heaps &&
   394                             build.input_heaps == ancestor_heaps &&
   403                             build.output_heap == heap_digest &&
   395                             build.output_heap == heap_digest &&
   404                             !(do_store && heap_digest.isEmpty)
   396                             !(do_store && heap_digest.isEmpty)
   405                           (current, heap_digest)
   397                           (current, heap_digest)
   406                         case None => (false, None)
   398                         case None => (false, None)