diff options
author | Dirk Baechle <dl9obn@darc.de> | 2011-07-19 19:09:01 (GMT) |
---|---|---|
committer | Dirk Baechle <dl9obn@darc.de> | 2011-07-19 19:09:01 (GMT) |
commit | f4144ac05a0e2f243414d5ebf6eef9510a5c1bc4 (patch) | |
tree | 5f3f0540a2cbbd2e9a2fc136fc203d0a54434a63 /doc/user | |
parent | b9b8b550ab11634969805c2d19ed5e3b8b6098d1 (diff) | |
download | SCons-f4144ac05a0e2f243414d5ebf6eef9510a5c1bc4.zip SCons-f4144ac05a0e2f243414d5ebf6eef9510a5c1bc4.tar.gz SCons-f4144ac05a0e2f243414d5ebf6eef9510a5c1bc4.tar.bz2 |
- improved documentation for custom Decider functions (fix for #2711)
Diffstat (limited to 'doc/user')
-rw-r--r-- | doc/user/depends.in | 55 | ||||
-rw-r--r-- | doc/user/depends.xml | 55 |
2 files changed, 108 insertions, 2 deletions
diff --git a/doc/user/depends.in b/doc/user/depends.in index 4428a63..88828fe 100644 --- a/doc/user/depends.in +++ b/doc/user/depends.in @@ -487,7 +487,7 @@ only its section of the input file. However, since the input file may contain a lot of data, we want to open the input file only if its timestamp has changed. - This could done with a custom + This could be done with a custom &Decider; function that might look something like this: </para> @@ -591,6 +591,59 @@ </para> + <para> + + Another thing to look out for, is the fact that the three + attributes above may not be present at the time of the first run. + Without any prior build, no targets got created and no + <filename>.sconsign</filename> DB file exists yet. + So, it is recommended to always check whether the + <varname>prev_ni</varname> attribute in question is available. + + </para> + + <para> + + We finally present a small example for a + <varname>csig</varname>-based decider function. Note how the + signature information for the <varname>dependency</varname> file + has to get initialized via <function>get_csig</function> + during each function call (this is mandatory!). + + </para> + + <sconstruct> + env = Environment() + + def config_file_decider(dependency, target, prev_ni): + import os.path + + # We always have to init the .csig value... + dep_csig = dependency.get_csig() + # .csig may not exist, because no target was built yet... + if 'csig' not in dir(prev_ni): + return True + # Target file may not exist yet + if not os.path.exists(str(target.abspath)): + return True + if dep_csig != prev_ni.csig: + # Some change on source file => update installed one + return True + return False + + def update_file(): + f = open("test.txt","a") + f.write("some line\n") + f.close() + + update_file() + + # Activate our own decider function + env.Decider(config_file_decider) + + env.Install("install","test.txt") + </sconstruct> + </section> <section> diff --git a/doc/user/depends.xml b/doc/user/depends.xml index 2853975..a5e84d6 100644 --- a/doc/user/depends.xml +++ b/doc/user/depends.xml @@ -488,7 +488,7 @@ only its section of the input file. However, since the input file may contain a lot of data, we want to open the input file only if its timestamp has changed. - This could done with a custom + This could be done with a custom &Decider; function that might look something like this: </para> @@ -587,6 +587,59 @@ </para> + <para> + + Another thing to look out for, is the fact that the three + attributes above may not be present at the time of the first run. + Without any prior build, no targets got created and no + <filename>.sconsign</filename> DB file exists yet. + So, it is recommended to always check whether the + <varname>prev_ni</varname> attribute in question is available. + + </para> + + <para> + + We finally present a small example for a + <varname>csig</varname>-based decider function. Note how the + signature information for the <varname>dependency</varname> file + has to get initialized via <function>get_csig</function> + during each function call (this is mandatory!). + + </para> + + <programlisting> + env = Environment() + + def config_file_decider(dependency, target, prev_ni): + import os.path + + # We always have to init the .csig value... + dep_csig = dependency.get_csig() + # .csig may not exist, because no target was built yet... + if 'csig' not in dir(prev_ni): + return True + # Target file may not exist yet + if not os.path.exists(str(target.abspath)): + return True + if dep_csig != prev_ni.csig: + # Some change on source file => update installed one + return True + return False + + def update_file(): + f = open("test.txt","a") + f.write("some line\n") + f.close() + + update_file() + + # Activate our own decider function + env.Decider(config_file_decider) + + env.Install("install","test.txt") + </programlisting> + </section> <section> |