I've done some more reading of the APSL. How APSL code could be used in conjunction with other non-APSL code. There are some issues:
• APSL has a clause dealing with patent litigation. Since there are no patents involved here (that I know of, which is admittedly not much), this is a non-issue and can be deemed non-applicable to chameleon.
• APSL has "Dispute Resolution" & "Governing Law" clauses that force you into California, USA. choose a license that doesn't mention these.
• APSL has a clause compelling release of source code.
But there is a way to have your cake & eat it too (so to speak).
1.3 "Covered Code" means the Original Code, Modifications, the
combination of Original Code and any Modifications, and/or any
respective portions thereof.
1.5 "Larger Work" means a work which combines Covered Code or portions
thereof with code not governed by the terms of this License.
4. Larger Works. You may create a Larger Work by combining Covered
Code with other code not governed by the terms of this License and
distribute the Larger Work as a single product. In each such instance,
You must make sure the requirements of this License are fulfilled for
the Covered Code or any portion thereof.
This clause gives you the ability to:
• integrate all changes directly into the original files. These modifications fall under the APSLv2.
• add calling code to supplemental files. The calling code is APSLv2 governed & subjected to code release. The supplemental files are subject to its original license. This means that you can have whatever compatible license in the supplemental files, (libpng would be perfectly compatible here, even LGPL I believe if you were releaseing all the source). However, you might want to avoid those licenses which compel source code release. Why? The APSL only coverns that portion originally under the APSL. Added files not not necessarily *have* to be APSL - permissible via "Larger Work".
This gives you a number of options:
• full release of all source code. All files governed by whatever license are disclosed in the comments of each file.
• partial release of source code covered by APSL, and include the object files of any non-APSL covered files to permit the full building of chameleon. This could cause the chameleon release maintainer quite a bit of grief.
• partial release of source code covered by APSL. Say you use the opensource libpng. The license @
http://www.libpng.or...png-LICENSE.txt says that you can use/add it to chameleon, and not have to release the source:
Permission is hereby granted to use, copy, modify, and distribute this
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
1. The origin of this source code must not be misrepresented.
2. Altered versions must be plainly marked as such and must not
be misrepresented as being the original source.
3. This Copyright notice may not be removed or altered from any
source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
supporting the PNG file format in commercial products. If you use this
source code in a product, acknowledgment is not required but would be
appreciated.
**********************************
So say you have this in your code:
//covered by APSL
main (int blah) {
fprintf(stdout, "I see London.\n");
fprintf(stdout, "I see France.\n"); //modified. PeotMaster Jun 10, 2009
return 0;
}
is just as permissible as:
//covered by APSL
#include chameleon_mods.h
main (int blah) {
fprintf(stdout, "I see London.\n");
//this is a modifcation, which you are compelled to include via APSL2.0 sec1.3
chameo_fprint("I see France.\n"); //modified. PeotMaster Jun 10, 2009
return 0;
}
//chameleon_mods.c
//private, not covered by APSL; need not be released.
chameo_fprint(char* cstring) {
fprintf(stdout, "%s", cstring);
return;
}
You could work via pointers as well:
//covered by APSL:
uint64_t llonga = 1;
llonga++; //modified by chameleon team to fix bug #123456
fprintf(stdout, "$llu\n", llonga);
can be rewritten:
//covered by APSL:
uint64_t llonga = 1;
chamelAdj1(&llonga); //this line is covered by APSL & must be released as a "modification"
fprintf(stdout, "$llu\n", llonga);
//chamelFiles.c
//private file not subject to APSL or source code release
void chamelAdj1(uint64_t *llptr) {
(*llptr)++; //this fixes bug #123456
return;
}
To be clear, you can't just wholesale move code to new files now. You have released code under the APSL. APSL2.0 sec1.6 says that any APSL covered modifications are still under the APSL:
1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications...
.
You either need to rewrite the code, or only newly released code falls under the new license.
If any of your new functions contain any APSL-covered code, they fall under APSL sec1.6 "Modifications":
When code is released as a series of files, a Modification is: (a) any addition to
or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code.
As long as your chameleon_mods files have no APSL-covered code, you don't fall under the APSL. Only the modifcations to the original files that call the new functions are APSL (which isn't a big deal, so people know you have a function AAA(bStruct ccc)).
I hope that helps with derivatives. Use calling functions & find an acceptable license. Or create one of your own for your own files containing no APSL code. That way you can be in APSLv2 compliance & not release all the new enhancements.
*******************************
bs0d, on Jun 14 2009, 07:10 PM, said:
hope you find the source useful.
but any future projects i choose to work on will now be closed source.
enjoy the source.
Well, if you were of any use before, you would have read the APSL before you went criticizing. I'm still a fan of the GPL.
[edited to show how to get around APSL via pointer example]