| NAME |
| |
| Charmonizer - Use C to configure C. |
| |
| OVERVIEW |
| |
| Charmonizer is a tool for probing, normalizing, and testing the build |
| environment provided by a C compiler and an operating system. It works by |
| attempting to compile lots of little programs and analyzing the output |
| from those that build successfully. ` |
| |
| Charmonizer modules are ordinary ANSI C files, and the configuration |
| application that you write is an ordinary C executable. |
| |
| REQUIREMENTS |
| |
| Charmonizer's only prerequisite is an ISO C90-compliant compiler which can |
| be invoked from C via the system() command. The build system assumes you |
| have a corresponding make or nmake executable. Folks hacking on the Charmonizer |
| source need to be aware of ../devel/bin/gen_charmonizer_makefiles.pl which |
| generates the makefiles from the src tree. |
| |
| PROBING |
| |
| #include "Charmonizer/Probe.h" |
| #include "Charmonizer/Probe/Integers.h" |
| #include "Charmonizer/Probe/LargeFiles.h" |
| |
| int main() |
| { |
| /* Tell Charmonizer about your OS and compiler. */ |
| chaz_Probe_init("cc", "-I/usr/local/include", NULL); |
| |
| /* Run desired Charmonizer modules. */ |
| chaz_Integers_run(); |
| chaz_LargeFiles_run(); |
| |
| /* Tear down. */ |
| chaz_Probe_clean_up(); |
| |
| return 0; |
| } |
| |
| The purpose of Charmonizer's probing toolset is to generate a single C |
| header file called "charmony.h", gathering together information that is |
| ordinarily only available at runtime and assigning predictable names to |
| functionality which may go by many different aliases on different systems. |
| |
| One header file, "Charmonizer/Probe.h", provides the primary interface and |
| a suite of topically oriented modules -- e.g. |
| "Charmonizer/Probe/LargeFiles.h", "Charmonizer/Probe/Integers.h" -- do the |
| heavy lifting. Each topical module exports 1 main function, |
| ModuleName_run(), which runs all the relevant compiler probes and appends |
| output to charmony.h. As you run each module in turn, "charmony.h" gets |
| built up incrementally; it can be further customized by writing your own |
| content to it at any point. |
| |
| TESTING |
| |
| #include "Charmonizer/Test.h" |
| #include "Charmonizer/Test/Integers.h" |
| #include "Charmonizer/Test/Largefile.h" |
| #include "MyTest.h" |
| |
| int main() { |
| int all_tests_pass = 0; |
| |
| /* Set up. */ |
| chaz_Test_init(); |
| chaz_Integers_init_test(); |
| chaz_LargeFiles_init_test(); |
| MyTest_init_test(); |
| |
| /* Run all the tests */ |
| all_tests_pass = chaz_Test_run_all_tests(); |
| |
| /* Tear down. */ |
| chaz_Test_clean_up(); |
| |
| return all_tests_pass; |
| } |
| |
| Charmonizer provides both a general test harness for writing your own |
| tests, and a corresponding test module for each probing module. The stock |
| tests can be found within "Charmonizer/Test" -- e.g. at |
| "Charmonizer/Test/Integers.h". |
| |
| The stock tests require access to "charmony.h". Not all tests will pass |
| in every environment, and the expectation is that you will append |
| charmony.h with ifdef tests as necessary to draw in supplementary code: |
| |
| #ifndef HAS_DIRENT_H |
| #include "my/dirent.h" |
| #endif |
| |
| Charmonizer restricts itself to working with what it finds, and |
| does not supply a library of compatibility functions. |
| |
| C NAMESPACE |
| |
| The "charmony.h" header prepends a prefix onto most of the symbols it |
| exports: either "chy_" or "CHY_". For public code, such as header files, |
| this helps avoid namespace collisions. For private code, the prefixes can |
| be stripped via the CHY_USE_SHORT_NAMES symbol. |
| |
| #define CHY_USE_SHORT_NAMES |
| #ifdef HAS_LONG_LONG /* alias for CHY_HAS_LONG_LONG */ |
| |
| FILESYSTEM NAMESPACE |
| |
| Charmonizer creates a number of temporary files within the current working |
| directory while it runs. These files all begin with "_charm". |
| |