CSP Gateway Configuration Guide
Building Apache for IBM AIX
[Back] [Next]
   
Server:docs1
Instance:LATEST
User:UnknownUser
 
-
Search:    

Note:
It is recommended that you read this whole section through, from beginning to end, before deciding to change the hosting Apache configuration and/or rebuild Apache from source.
This section is relevant to those using the CSP Gateway Dynamic Shared Object (DSO) modules with IBM AIX builds of Apache.

CSPa[n][Sys].so
mod_csp[n].so
The Apache web server and linked DSOs depend on functionality implemented in two core Apache libraries:
libapr
libaprutil
These APR libraries are built as part of the main Apache build procedure and contain the functionality responsible for implementing the Apache API (as used by add-on DSO modules such as the CSP Gateway).
On UNIX systems, these libraries are usually built as dynamically linkable shared objects:
libapr.so or libapr-1.so
libaprutil.so or libaprutil-1.so
The pre-built CSP Gateway DSO modules supplied by InterSystems are built with the expectation that these modules are present as shared objects.
However, under AIX, these libraries are often built as library archives and statically linked to the Apache core (httpd). This means that they must also be statically linked to add-on DSO modules used by Apache – which is indeed what happens if a DSO is built from source using the Apache Group’s apxs tool.
The source code to the lightweight module (mod_csp[n].so) intended to be used with the NSD component is supplied both pre-built and as source code. If static linking of the Apache libraries is required then this module can be locally built in situ.
The larger stand-alone Gateway modules (CSPa[n][Sys].so) are shipped prebuilt and cannot be used if the hosting Apache server has been statically linked to its core APR libraries. If an attempt is made to use these modules, a fatal error message is reported when Apache is started indicating that functionality provided by the Apache API is missing from the Gateway DSOs. For example:
httpd: SyntaSyntax error on line 2 of /usr/local/apache2/conf/trak.conf:
x error on line 411 of /usr/local/apache2/conf/httpd.conf:
Cannot load /opt/cspgateway/bin/CSPapSys.so into server: rtld: 0712-001
Symbol ap_table_set was referenced from module /opt/cspgateway/bin/CSPapSys.so(), 
but a runtime definition of the symbol was not found.\nrtld: 0712-001
Symbol ap_table_add was referenced from module /opt/cspgateway/bin/CSPapSys.so(), 
but a runtime definition of the symbol was not found.\nrtld: 0712-001
Symbol ap_send_http_header was referenced from module /opt/cspgateway/bin/CSPapSys.so(),  
but a runtime definition of the symbol was not found.\nrtld: 0712-001
Symbol ap_table_do was referenced from module /opt/cspgateway/bin/CSPapSys.so(), 
but a runtime definition of the symbol was not found.\nrtld: 0712-001
Symbol ap_table_get was referenced from module /opt/cspgateway/bin/CSPapSys.so(), 
but a runtime definition of the symbol was not found.\nrtld: 0712-002 fatal error: exiting.
The missing symbols are provided by the APR libraries (implemented as shared objects) and these are usually installed in the Apache /lib directory, an example listing of which is shown below:
$ ls
apr.exp      libapr-1.so        libaprutil-1.la        libexpat.a
aprutil.exp  libapr-1.so.0      libaprutil-1.so        libexpat.la
libapr-1.a   libapr-1.so.0.4.2  libaprutil-1.so.0      pkgconfig
libapr-1.la  libaprutil-1.a     libaprutil-1.so.0.3.9
In the example listing shown above, the APR libraries have been built as shared objects and the Gateway can use them. Check that the path to the shared object’s directory is included in the AIX LIBPATH environment variable and include it if it is not. For example:
export LIBPATH=/usr/local/apache2/lib:$LIBPATH
For installations where the APR shared objects are not available to the Gateway DSOs, rebuild the Apache core such that it exports (or exposes) the functions (and other symbols) on which the server API depends.
To rebuild Apache proceed as follows:
Unpack the Apache distribution and ensure that the environment is prepared for compilation and linking. For example, to build a 64-bit Apache installation the following environment variables should be set:
CFLAGS="-qarch=com -q64"
LDFLAGS="-b64"
OBJECT_MODE=64
export CFLAGS LDFLAGS OBJECT_MODE
Apache is usually built using the following three steps, but in this modified procedure there are additional steps to be undertaken between stages (1) and (2).
  1. ./configure --enable-so -–prefix=[installation_directory]
  2. make
  3. make install
Depending on where the final Apache run-time environment is installed, it may be necessary to run the installation phase as SuperUser:
sudo make install
In order to configure the build process to create an Apache executable exporting all functions/symbols required by non-statically linked third-party DSOs, first run the ‘configure’ script as before (step 1 above).
Before running the make command (step 2), find the Makefile generated by the configure procedure (step 1) and load it into a text editor. This Makefile is located in the /server subdirectory (directly beneath the location in which the build commands are invoked).
Find the lines responsible for creating the exports list (this section is usually found towards the end of the file). For example:
# Rule to make exp file for AIX DSOs
httpd.exp: exports.c export_vars.h
    @echo "#! ." > $@
    @echo "* This file was AUTOGENERATED at build time." >> $@
    @echo "* Please do not edit by hand." >> $@
    $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | grep -v apr_ | \
           sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
    $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep -v apr_ | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
Now, add the required functions for export directly after the Please do not edit by hand line.
Note:
Important — each line specifying a function name must begin with a tab character (ASCII 9), not spaces. For convenience, the lines shown below are formatted in this way so you can copy and paste them directly into the target Makefile. Note however, that some lines are too long for this books online production system and are continued with a backslash symbol (\). Remove the backslashes and continue the line in your file.
Example:
# Rule to make exp file for AIX DSOs
httpd.exp: exports.c export_vars.h
    @echo "#! ." > $@
    @echo "* This file was AUTOGENERATED at build time." >> $@
    @echo "* Please do not edit by hand." >> $@
    @echo "apr_brigade_cleanup" >> $@
    @echo "apr_brigade_create" >> $@
    @echo "apr_bucket_type_eos" >> $@
    @echo "apr_bucket_type_flush" >> $@
    @echo "apr_create_pool" >> $@
    @echo "apr_global_mutex_unlock" >> $@
    @echo "apr_global_mutex_trylock" >> $@
    @echo "apr_global_mutex_lock" >> $@
    @echo "apr_global_mutex_create" >> $@
    @echo "apr_global_mutex_child_init" >> $@
    @echo "apr_palloc" >> $@
    @echo "apr_pcalloc" >> $@
    @echo "apr_pool_cleanup_null" >> $@
    @echo "apr_pool_cleanup_register" >> $@
    @echo "apr_pool_userdata_get" >> $@
    @echo "apr_pool_userdata_set" >> $@
    @echo "apr_pool_destroy" >> $@
    @echo "apr_pstrcat" >> $@
    @echo "apr_pstrdup" >> $@
    @echo "apr_shm_create" >> $@
    @echo "apr_shm_destroy" >> $@
    @echo "apr_shm_attach" >> $@
    @echo "apr_shm_detach" >> $@
    @echo "apr_shm_baseaddr_get" >> $@
    @echo "apr_shm_size_get" >> $@
    @echo "apr_shm_pool_get" >> $@
    @echo "apr_sleep" >> $@
    @echo "apr_table_add" >> $@
    @echo "apr_table_addn" >> $@
    @echo "apr_table_do" >> $@
    @echo "apr_table_get" >> $@
    @echo "apr_table_make" >> $@
    @echo "apr_table_set" >> $@
    @echo "apr_time_now" >> $@
 $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | grep -v apr_ | \
    sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
 $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep -v apr_ | \
    sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
The list shown above includes the bare minimum set of functions/symbols required by the CSP Gateway DSOs. The full list is shown below and can be used if there are plans to use other pre-built third party DSOs requiring functionality over and above that required by the Gateway DSOs.
# Rule to make exp file for AIX DSOs
httpd.exp: exports.c export_vars.h
    @echo "#! ." > $@
    @echo "* This file was AUTOGENERATED at build time." >> $@
    @echo "* Please do not edit by hand." >> $@
    @echo "apr_brigade_cleanup" >> $@
    @echo "apr_brigade_create" >> $@
    @echo "apr_bucket_type_eos" >> $@
    @echo "apr_bucket_type_flush" >> $@
    @echo "apr_create_pool" >> $@
    @echo "apr_global_mutex_unlock" >> $@
    @echo "apr_global_mutex_trylock" >> $@
    @echo "apr_global_mutex_lock" >> $@
    @echo "apr_global_mutex_create" >> $@
    @echo "apr_global_mutex_child_init" >> $@
    @echo "apr_palloc" >> $@
    @echo "apr_pcalloc" >> $@
    @echo "apr_pool_cleanup_null" >> $@
    @echo "apr_pool_cleanup_register" >> $@
    @echo "apr_pool_userdata_get" >> $@
    @echo "apr_pool_userdata_set" >> $@
    @echo "apr_pool_destroy" >> $@
    @echo "apr_pstrcat" >> $@
    @echo "apr_pstrdup" >> $@
    @echo "apr_shm_create" >> $@
    @echo "apr_shm_destroy" >> $@
    @echo "apr_shm_attach" >> $@
    @echo "apr_shm_detach" >> $@
    @echo "apr_shm_baseaddr_get" >> $@
    @echo "apr_shm_size_get" >> $@
    @echo "apr_shm_pool_get" >> $@
    @echo "apr_sleep" >> $@
    @echo "apr_table_add" >> $@
    @echo "apr_table_addn" >> $@
    @echo "apr_table_do" >> $@
    @echo "apr_table_get" >> $@
    @echo "apr_table_make" >> $@
    @echo "apr_table_set" >> $@
    @echo "apr_time_now" >> $@
    $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | grep -v apr_ | \
        sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
    $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep -v apr_ | \
        sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
The list shown above includes the bare minimum set of functions/symbols required by the CSP Gateway DSOs. The full list is shown below and can be used if there are plans to use other pre-built third party DSOs requiring functionality over and above that required by the Gateway DSOs.
# Rule to make exp file for AIX DSOs
httpd.exp: exports.c export_vars.h
    @echo "#! ." > $@
    @echo "* File was AUTOGENERATED at build time." >> $@
    @echo "* Please do not edit by hand." >> $@
    @echo "apr_allocator_create" >> $@
    @echo "apr_allocator_destroy" >> $@
    @echo "apr_allocator_alloc" >> $@
    @echo "apr_allocator_free" >> $@
    @echo "apr_allocator_owner_set" >> $@
    @echo "apr_allocator_owner_get" >> $@
    @echo "apr_allocator_max_free_set" >> $@
    @echo "apr_allocator_mutex_set" >> $@
    @echo "apr_allocator_mutex_get" >> $@
    @echo "apr_dso_load" >> $@
    @echo "apr_dso_unload" >> $@
    @echo "apr_dso_sym" >> $@
    @echo "apr_dso_error" >> $@
    @echo "apr_env_get" >> $@
    @echo "apr_env_set" >> $@
    @echo "apr_env_delete" >> $@
    @echo "apr_strerror" >> $@
    @echo "apr_stat" >> $@
    @echo "apr_dir_open" >> $@
    @echo "apr_dir_close" >> $@
    @echo "apr_dir_read" >> $@
    @echo "apr_dir_rewind" >> $@
    @echo "apr_filepath_root" >> $@
    @echo "apr_filepath_merge" >> $@
    @echo "apr_filepath_list_split" >> $@
    @echo "apr_filepath_list_merge" >> $@
    @echo "apr_filepath_get" >> $@
    @echo "apr_filepath_set" >> $@
    @echo "apr_filepath_encoding" >> $@
    @echo "apr_file_open" >> $@
    @echo "apr_file_close" >> $@
    @echo "apr_file_remove" >> $@
    @echo "apr_file_rename" >> $@
    @echo "apr_file_copy" >> $@
    @echo "apr_file_append" >> $@
    @echo "apr_file_eof" >> $@
    @echo "apr_file_open_stder" >> $@r
    @echo "apr_file_open_stdout" >> $@
    @echo "apr_file_open_stdin" >> $@
    @echo "apr_file_read" >> $@
    @echo "apr_file_write" >> $@
    @echo "apr_file_writev" >> $@
    @echo "apr_file_read_full" >> $@
    @echo "apr_file_write_full" >> $@
    @echo "apr_file_putc" >> $@
    @echo "apr_file_getc" >> $@
    @echo "apr_file_ungetc" >> $@
    @echo "apr_file_gets" >> $@
    @echo "apr_file_puts" >> $@
    @echo "apr_file_flush" >> $@
    @echo "apr_file_dup" >> $@
    @echo "apr_file_dup2" >> $@
    @echo "apr_file_setaside" >> $@
    @echo "apr_file_seek" >> $@
    @echo "apr_file_pipe_create" >> $@
    @echo "apr_file_namedpipe_create" >> $@
    @echo "apr_file_pipe_timeout_get" >> $@
    @echo "apr_file_pipe_timeout_set" >> $@
    @echo "apr_file_lock" >> $@
    @echo "apr_file_unlock" >> $@
    @echo "apr_file_name_get" >> $@
    @echo "apr_file_data_get" >> $@
    @echo "apr_file_data_set" >> $@
    @echo "apr_file_printf" >> $@
    @echo "apr_file_perms_set" >> $@
    @echo "apr_file_attrs_set" >> $@
    @echo "apr_file_mtime_set" >> $@
    @echo "apr_dir_make" >> $@
    @echo "apr_dir_make_recursive" >> $@
    @echo "apr_dir_remove" >> $@
    @echo "apr_file_info_get" >> $@
    @echo "apr_file_trunc" >> $@
    @echo "apr_file_flags_get" >> $@
    @echo "apr_file_pool_get" >> $@
    @echo "apr_file_inherit_set" >> $@
    @echo "apr_file_inherit_unset" >> $@
    @echo "apr_file_mktemp" >> $@
    @echo "apr_temp_dir_get" >> $@
    @echo "apr_fnmatch" >> $@
    @echo "apr_fnmatch_test" >> $@
    @echo "apr_initialize" >> $@
    @echo "apr_app_initialize" >> $@
    @echo "apr_terminate" >> $@
    @echo "apr_terminate2" >> $@
    @echo "apr_generate_random_bytes" >> $@
    @echo "apr_getopt_init" >> $@
    @echo "apr_getopt" >> $@
    @echo "apr_getopt_long" >> $@
    @echo "apr_global_mutex_create" >> $@
    @echo "apr_global_mutex_child_init" >> $@
    @echo "apr_global_mutex_lock" >> $@
    @echo "apr_global_mutex_trylock" >> $@
    @echo "apr_global_mutex_unlock" >> $@
    @echo "apr_global_mutex_destroy" >> $@
    @echo "apr_global_mutex_pool_get" >> $@
    @echo "apr_hash_make" >> $@
    @echo "apr_hash_copy" >> $@
    @echo "apr_hash_set" >> $@
    @echo "apr_hash_get" >> $@
    @echo "apr_hash_first" >> $@
    @echo "apr_hash_next" >> $@
    @echo "apr_hash_this" >> $@
    @echo "apr_hash_count" >> $@
    @echo "apr_hash_overlay" >> $@
    @echo "apr_hash_merge" >> $@
    @echo "apr_hash_pool_get" >> $@
    @echo "apr_filepath_name_get" >> $@
    @echo "apr_vformatter" >> $@
    @echo "apr_password_get" >> $@
    @echo "apr_mmap_create" >> $@
    @echo "apr_mmap_dup" >> $@
    @echo "apr_mmap_delete" >> $@
    @echo "apr_mmap_offset" >> $@
    @echo "apr_socket_create" >> $@
    @echo "apr_socket_shutdown" >> $@
    @echo "apr_socket_close" >> $@
    @echo "apr_socket_bind" >> $@
    @echo "apr_socket_listen" >> $@
    @echo "apr_socket_accept" >> $@
    @echo "apr_socket_connect" >> $@
    @echo "apr_sockaddr_info_get" >> $@
    @echo "apr_getnameinfo" >> $@
    @echo "apr_parse_addr_port" >> $@
    @echo "apr_gethostname" >> $@
    @echo "apr_socket_data_get" >> $@
    @echo "apr_socket_data_set" >> $@
    @echo "apr_socket_send" >> $@
    @echo "apr_socket_sendv" >> $@
    @echo "apr_socket_sendto" >> $@
    @echo "apr_socket_recvfrom" >> $@
    @echo "apr_socket_sendfile" >> $@
    @echo "apr_socket_recv" >> $@
    @echo "apr_socket_opt_set" >> $@
    @echo "apr_socket_timeout_set" >> $@
    @echo "apr_socket_opt_get" >> $@
    @echo "apr_socket_timeout_get" >> $@
    @echo "apr_socket_atmark" >> $@
    @echo "apr_socket_addr_get" >> $@
    @echo "apr_sockaddr_ip_get" >> $@
    @echo "apr_sockaddr_equal" >> $@
    @echo "apr_getservbyname" >> $@
    @echo "apr_ipsubnet_create" >> $@
    @echo "apr_ipsubnet_test" >> $@
    @echo "apr_socket_protocol_get" >> $@
    @echo "apr_socket_inherit_set" >> $@
    @echo "apr_socket_inherit_unset" >> $@
    @echo "apr_poll" >> $@
    @echo "apr_pollset_create" >> $@
    @echo "apr_pollset_destroy" >> $@
    @echo "apr_pollset_add" >> $@
    @echo "apr_pollset_remove" >> $@
    @echo "apr_pollset_poll" >> $@
    @echo "apr_pool_initialize" >> $@
    @echo "apr_pool_terminate" >> $@
    @echo "apr_pool_create_ex" >> $@
    @echo "apr_pool_create_ex_debug" >> $@
    @echo "apr_pool_allocator_get" >> $@
    @echo "apr_pool_clear" >> $@
    @echo "apr_pool_clear_debug" >> $@
    @echo "apr_pool_destroy" >> $@
    @echo "apr_pool_destroy_debug" >> $@
    @echo "apr_palloc" >> $@
    @echo "apr_palloc_debug" >> $@
    @echo "apr_pcalloc_debug" >> $@
    @echo "apr_pool_abort_set" >> $@
    @echo "apr_pool_abort_get" >> $@
    @echo "apr_pool_parent_get" >> $@
    @echo "apr_pool_is_ancestor" >> $@
    @echo "apr_pool_tag" >> $@
    @echo "apr_pool_userdata_set" >> $@
    @echo "apr_pool_userdata_setn" >> $@
    @echo "apr_pool_userdata_get" >> $@
    @echo "apr_pool_cleanup_register" >> $@
    @echo "apr_pool_cleanup_kill" >> $@
    @echo "apr_pool_child_cleanup_set" >> $@
    @echo "apr_pool_cleanup_run" >> $@
    @echo "apr_pool_cleanup_null" >> $@
    @echo "apr_pool_cleanup_for_exec" >> $@
    @echo "apr_os_global_mutex_get" >> $@
    @echo "apr_os_file_get" >> $@
    @echo "apr_os_dir_get" >> $@
    @echo "apr_os_sock_get" >> $@
    @echo "apr_os_proc_mutex_get" >> $@
    @echo "apr_os_exp_time_get" >> $@
    @echo "apr_os_imp_time_get" >> $@
    @echo "apr_os_shm_get" >> $@
    @echo "apr_os_thread_get" >> $@
    @echo "apr_os_threadkey_get" >> $@
    @echo "apr_os_thread_put" >> $@
    @echo "apr_os_threadkey_put" >> $@
    @echo "apr_os_thread_current" >> $@
    @echo "apr_os_thread_equal" >> $@
    @echo "apr_os_file_put" >> $@
    @echo "apr_os_pipe_put" >> $@
    @echo "apr_os_pipe_put_ex" >> $@
    @echo "apr_os_dir_put" >> $@
    @echo "apr_os_sock_put" >> $@
    @echo "apr_os_sock_make" >> $@
    @echo "apr_os_proc_mutex_put" >> $@
    @echo "apr_os_imp_time_put" >> $@
    @echo "apr_os_exp_time_put" >> $@
    @echo "apr_os_shm_put" >> $@
    @echo "apr_os_dso_handle_put" >> $@
    @echo "apr_os_dso_handle_get" >> $@
    @echo "apr_os_default_encoding" >> $@
    @echo "apr_os_locale_encoding" >> $@
    @echo "apr_proc_mutex_create" >> $@
    @echo "apr_proc_mutex_child_init" >> $@
    @echo "apr_proc_mutex_lock" >> $@
    @echo "apr_proc_mutex_trylock" >> $@
    @echo "apr_proc_mutex_unlock" >> $@
    @echo "apr_proc_mutex_destroy" >> $@
    @echo "apr_proc_mutex_cleanup" >> $@
    @echo "apr_proc_mutex_lockfile" >> $@
    @echo "apr_proc_mutex_name" >> $@
    @echo "apr_proc_mutex_defname" >> $@
    @echo "apr_proc_mutex_pool_get" >> $@
    @echo "apr_shm_create" >> $@
    @echo "apr_shm_destroy" >> $@
    @echo "apr_shm_attach" >> $@
    @echo "apr_shm_detach" >> $@
    @echo "apr_shm_baseaddr_get" >> $@
    @echo "apr_shm_size_get" >> $@
    @echo "apr_shm_pool_get" >> $@
    @echo "apr_signal" >> $@
    @echo "apr_signal_description_get" >> $@
    @echo "apr_strnatcmp" >> $@
    @echo "apr_strnatcasecmp" >> $@
    @echo "apr_pstrdup" >> $@
    @echo "apr_pstrmemdup" >> $@
    @echo "apr_pstrndup" >> $@
    @echo "apr_pmemdup" >> $@
    @echo "apr_pstrcat" >> $@
    @echo "apr_pstrcatv" >> $@
    @echo "apr_pvsprintf" >> $@
    @echo "apr_psprintf" >> $@
    @echo "apr_cpystrn" >> $@
    @echo "apr_collapse_spaces" >> $@
    @echo "apr_tokenize_to_argv" >> $@
    @echo "apr_strtok" >> $@
    @echo "apr_snprintf" >> $@
    @echo "apr_vsnprintf" >> $@
    @echo "apr_itoa" >> $@
    @echo "apr_ltoa" >> $@
    @echo "apr_off_t_toa" >> $@
    @echo "apr_strtoi64" >> $@
    @echo "apr_atoi64" >> $@
    @echo "apr_strfsize" >> $@
    @echo "apr_table_elts" >> $@
    @echo "apr_is_empty_table" >> $@
    @echo "apr_is_empty_array" >> $@
    @echo "apr_array_make" >> $@
    @echo "apr_array_push" >> $@
    @echo "apr_array_pop" >> $@
    @echo "apr_array_cat" >> $@
    @echo "apr_array_copy" >> $@
    @echo "apr_array_copy_hdr" >> $@
    @echo "apr_array_append" >> $@
    @echo "apr_array_pstrcat" >> $@
    @echo "apr_table_make" >> $@
    @echo "apr_table_copy" >> $@
    @echo "apr_table_clear" >> $@
    @echo "apr_table_get" >> $@
    @echo "apr_table_set" >> $@
    @echo "apr_table_setn" >> $@
    @echo "apr_table_unset" >> $@
    @echo "apr_table_merge" >> $@
    @echo "apr_table_mergen" >> $@
    @echo "apr_table_add" >> $@
    @echo "apr_table_addn" >> $@
    @echo "apr_table_overlay" >> $@
    @echo "apr_table_do" >> $@
    @echo "apr_table_vdo" >> $@
    @echo "apr_table_overlap" >> $@
    @echo "apr_table_compress" >> $@
    @echo "apr_thread_cond_create" >> $@
    @echo "apr_thread_cond_wait" >> $@
    @echo "apr_thread_cond_timedwait" >> $@
    @echo "apr_thread_cond_signal" >> $@
    @echo "apr_thread_cond_broadcast" >> $@
    @echo "apr_thread_cond_destroy" >> $@
    @echo "apr_thread_cond_pool_get" >> $@
    @echo "apr_thread_mutex_create" >> $@
    @echo "apr_thread_mutex_lock" >> $@
    @echo "apr_thread_mutex_trylock" >> $@
    @echo "apr_thread_mutex_unlock" >> $@
    @echo "apr_thread_mutex_destroy" >> $@
    @echo "apr_thread_mutex_pool_get" >> $@
    @echo "apr_threadattr_create" >> $@
    @echo "apr_threadattr_detach_set" >> $@
    @echo "apr_threadattr_detach_get" >> $@
    @echo "apr_thread_create" >> $@
    @echo "apr_thread_exit" >> $@
    @echo "apr_thread_join" >> $@
    @echo "apr_thread_yield" >> $@
    @echo "apr_thread_once_init" >> $@
    @echo "apr_thread_once" >> $@
    @echo "apr_thread_detach" >> $@
    @echo "apr_thread_data_get" >> $@
    @echo "apr_thread_data_set" >> $@
    @echo "apr_threadkey_private_create" >> $@
    @echo "apr_threadkey_private_get" >> $@
    @echo "apr_threadkey_private_set" >> $@
    @echo "apr_threadkey_private_delete" >> $@
    @echo "apr_threadkey_data_get" >> $@
    @echo "apr_threadkey_data_set" >> $@
    @echo "apr_procattr_create" >> $@
    @echo "apr_procattr_io_set" >> $@
    @echo "apr_procattr_child_in_set" >> $@
    @echo "apr_procattr_child_out_set" >> $@
    @echo "apr_procattr_child_err_set" >> $@
    @echo "apr_procattr_dir_set" >> $@
    @echo "apr_procattr_cmdtype_set" >> $@
    @echo "apr_procattr_detach_set" >> $@
    @echo "apr_procattr_limit_set" >> $@
    @echo "apr_procattr_child_errfn_set" >> $@
    @echo "apr_procattr_error_check_set" >> $@
    @echo "apr_proc_fork" >> $@
    @echo "apr_proc_create" >> $@
    @echo "apr_proc_wait" >> $@
    @echo "apr_proc_wait_all_procs" >> $@
    @echo "apr_proc_detach" >> $@
    @echo "apr_proc_other_child_register" >> $@
    @echo "apr_proc_other_child_unregister" >> $@
    @echo "apr_proc_other_child_alert" >> $@
    @echo "apr_proc_other_child_refresh" >> $@
    @echo "apr_proc_other_child_refresh_all" >> $@
    @echo "apr_proc_kill" >> $@
    @echo "apr_pool_note_subprocess" >> $@
    @echo "apr_setup_signal_thread" >> $@
    @echo "apr_signal_thread" >> $@
    @echo "apr_thread_pool_get" >> $@
    @echo "apr_thread_rwlock_create" >> $@
    @echo "apr_thread_rwlock_rdlock" >> $@
    @echo "apr_thread_rwlock_tryrdlock" >> $@
    @echo "apr_thread_rwlock_wrlock" >> $@
    @echo "apr_thread_rwlock_trywrlock" >> $@
    @echo "apr_thread_rwlock_unlock" >> $@
    @echo "apr_thread_rwlock_destroy" >> $@
    @echo "apr_thread_rwlock_pool_get" >> $@
    @echo "apr_time_now" >> $@
    @echo "apr_time_ansi_put" >> $@
    @echo "apr_time_exp_tz" >> $@
    @echo "apr_time_exp_gmt" >> $@
    @echo "apr_time_exp_lt" >> $@
    @echo "apr_time_exp_get" >> $@
    @echo "apr_time_exp_gmt_get" >> $@
    @echo "apr_sleep" >> $@
    @echo "apr_rfc822_date" >> $@
    @echo "apr_ctime" >> $@
    @echo "apr_strftime" >> $@
    @echo "apr_time_clock_hires" >> $@
    @echo "apr_uid_current" >> $@
    @echo "apr_uid_name_get" >> $@
    @echo "apr_uid_get" >> $@
    @echo "apr_uid_homepath_get" >> $@
    @echo "apr_gid_name_get" >> $@
    @echo "apr_gid_get" >> $@
    @echo "apr_version" >> $@
    @echo "apr_version_string" >> $@
    @echo "apr_month_snames" >> $@
    @echo "apr_day_snames" >> $@
    @echo "apr_base64_encode_len" >> $@
    @echo "apr_base64_encode" >> $@
    @echo "apr_base64_encode_binary" >> $@
    @echo "apr_base64_decode_len" >> $@
    @echo "apr_base64_decode" >> $@
    @echo "apr_base64_decode_binary" >> $@
    @echo "apr_brigade_create" >> $@
    @echo "apr_brigade_destroy" >> $@
    @echo "apr_brigade_cleanup" >> $@
    @echo "apr_brigade_split" >> $@
    @echo "apr_brigade_partition" >> $@
    @echo "apr_brigade_length" >> $@
    @echo "apr_brigade_flatten" >> $@
    @echo "apr_brigade_pflatten" >> $@
    @echo "apr_brigade_split_line" >> $@
    @echo "apr_brigade_to_iovec" >> $@
    @echo "apr_brigade_vputstrs" >> $@
    @echo "apr_brigade_write" >> $@
    @echo "apr_brigade_writev" >> $@
    @echo "apr_brigade_puts" >> $@
    @echo "apr_brigade_putc" >> $@
    @echo "apr_brigade_putstrs" >> $@
    @echo "apr_brigade_printf" >> $@
    @echo "apr_brigade_vprintf" >> $@
    @echo "apr_bucket_alloc_create" >> $@
    @echo "apr_bucket_alloc_create_ex" >> $@
    @echo "apr_bucket_alloc_destroy" >> $@
    @echo "apr_bucket_alloc" >> $@
    @echo "apr_bucket_free" >> $@
    @echo "apr_bucket_setaside_noop" >> $@
    @echo "apr_bucket_setaside_notimpl" >> $@
    @echo "apr_bucket_split_notimpl" >> $@
    @echo "apr_bucket_copy_notimpl" >> $@
    @echo "apr_bucket_destroy_noop" >> $@
    @echo "apr_bucket_simple_split" >> $@
    @echo "apr_bucket_simple_copy" >> $@
    @echo "apr_bucket_shared_make" >> $@
    @echo "apr_bucket_shared_destroy" >> $@
    @echo "apr_bucket_shared_split" >> $@
    @echo "apr_bucket_shared_copy" >> $@
    @echo "apr_bucket_eos_create" >> $@
    @echo "apr_bucket_eos_make" >> $@
    @echo "apr_bucket_flush_create" >> $@
    @echo "apr_bucket_flush_make" >> $@
    @echo "apr_bucket_immortal_create" >> $@
    @echo "apr_bucket_immortal_make" >> $@
    @echo "apr_bucket_transient_create" >> $@
    @echo "apr_bucket_transient_make" >> $@
    @echo "apr_bucket_heap_create" >> $@
    @echo "apr_bucket_heap_make" >> $@
    @echo "apr_bucket_pool_create" >> $@
    @echo "apr_bucket_pool_make" >> $@
    @echo "apr_bucket_mmap_create" >> $@
    @echo "apr_bucket_mmap_make" >> $@
    @echo "apr_bucket_socket_create" >> $@
    @echo "apr_bucket_socket_make" >> $@
    @echo "apr_bucket_pipe_create" >> $@
    @echo "apr_bucket_pipe_make" >> $@
    @echo "apr_bucket_file_create" >> $@
    @echo "apr_bucket_file_make" >> $@
    @echo "apr_bucket_file_enable_mmap" >> $@
    @echo "apr_date_checkmask" >> $@
    @echo "apr_date_parse_http" >> $@
    @echo "apr_date_parse_rfc" >> $@
    @echo "apr_dbm_open_ex" >> $@
    @echo "apr_dbm_open" >> $@
    @echo "apr_dbm_close" >> $@
    @echo "apr_dbm_fetch" >> $@
    @echo "apr_dbm_store" >> $@
    @echo "apr_dbm_delete" >> $@
    @echo "apr_dbm_exists" >> $@
    @echo "apr_dbm_firstkey" >> $@
    @echo "apr_dbm_nextkey" >> $@
    @echo "apr_dbm_freedatum" >> $@
    @echo "apr_dbm_geterror" >> $@
    @echo "apr_dbm_get_usednames_ex" >> $@
    @echo "apr_dbm_get_usednames" >> $@
    @echo "apr_hook_sort_register" >> $@
    @echo "apr_hook_sort_all" >> $@
    @echo "apr_hook_debug_show" >> $@
    @echo "apr_hook_deregister_all" >> $@
    @echo "apr_md4_init" >> $@
    @echo "apr_md4_set_xlate" >> $@
    @echo "apr_md4_update" >> $@
    @echo "apr_md4_final" >> $@
    @echo "apr_md4" >> $@
    @echo "apr_md5_init" >> $@
    @echo "apr_md5_set_xlate" >> $@
    @echo "apr_md5_update" >> $@
    @echo "apr_md5_final" >> $@
    @echo "apr_md5" >> $@
    @echo "apr_md5_encode" >> $@
    @echo "apr_password_validate" >> $@
    @echo "apr_dynamic_fn_register" >> $@
    @echo "apr_dynamic_fn_retrieve" >> $@
    @echo "apr_optional_hook_add" >> $@
    @echo "apr_optional_hook_get" >> $@
    @echo "apr_queue_create" >> $@
    @echo "apr_queue_push" >> $@
    @echo "apr_queue_pop" >> $@
    @echo "apr_queue_trypush" >> $@
    @echo "apr_queue_trypop" >> $@
    @echo "apr_queue_size" >> $@
    @echo "apr_queue_interrupt_all" >> $@
    @echo "apr_queue_term" >> $@
    @echo "apr_reslist_create" >> $@
    @echo "apr_reslist_destroy" >> $@
    @echo "apr_reslist_acquire" >> $@
    @echo "apr_reslist_release" >> $@
    @echo "apr_rmm_init" >> $@
    @echo "apr_rmm_destroy" >> $@
    @echo "apr_rmm_attach" >> $@
    @echo "apr_rmm_detach" >> $@
    @echo "apr_rmm_malloc" >> $@
    @echo "apr_rmm_realloc" >> $@
    @echo "apr_rmm_calloc" >> $@
    @echo "apr_rmm_free" >> $@
    @echo "apr_rmm_addr_get" >> $@
    @echo "apr_rmm_offset_get" >> $@
    @echo "apr_rmm_overhead_get" >> $@
    @echo "apr_sdbm_open" >> $@
    @echo "apr_sdbm_close" >> $@
    @echo "apr_sdbm_lock" >> $@
    @echo "apr_sdbm_unlock" >> $@
    @echo "apr_sdbm_fetch" >> $@
    @echo "apr_sdbm_store" >> $@
    @echo "apr_sdbm_delete" >> $@
    @echo "apr_sdbm_firstkey" >> $@
    @echo "apr_sdbm_nextkey" >> $@
    @echo "apr_sdbm_rdonly" >> $@
    @echo "apr_sha1_base64" >> $@
    @echo "apr_sha1_init" >> $@
    @echo "apr_sha1_update" >> $@
    @echo "apr_sha1_update_binary" >> $@
    @echo "apr_sha1_final" >> $@
    @echo "apr_strmatch_precompile" >> $@
    @echo "apr_uri_port_of_scheme" >> $@
    @echo "apr_uri_unparse" >> $@
    @echo "apr_uri_parse" >> $@
    @echo "apr_uri_parse_hostinfo" >> $@
    @echo "apr_uuid_get" >> $@
    @echo "apr_uuid_format" >> $@
    @echo "apr_uuid_parse" >> $@
    @echo "apr_xlate_open" >> $@
    @echo "apr_xlate_sb_get" >> $@
    @echo "apr_xlate_conv_buffer" >> $@
    @echo "apr_xlate_conv_byte" >> $@
    @echo "apr_xlate_close" >> $@
    @echo "apr_text_append" >> $@
    @echo "apr_xml_parser_create" >> $@
    @echo "apr_xml_parse_file" >> $@
    @echo "apr_xml_parser_feed" >> $@
    @echo "apr_xml_parser_done" >> $@
    @echo "apr_xml_parser_geterror" >> $@
    @echo "apr_xml_to_text" >> $@
    @echo "apr_xml_empty_elem" >> $@
    @echo "apr_xml_quote_string" >> $@
    @echo "apr_xml_quote_elem" >> $@
    @echo "apr_xml_insert_uri" >> $@
    @echo "apr_bucket_type_flush" >> $@
    @echo "apr_bucket_type_eos" >> $@
    @echo "apr_bucket_type_file" >> $@
    @echo "apr_bucket_type_heap" >> $@
    @echo "apr_bucket_type_pool" >> $@
    @echo "apr_bucket_type_pipe" >> $@
    @echo "apr_bucket_type_immortal" >> $@
    @echo "apr_bucket_type_transient" >> $@
    @echo "apr_bucket_type_socket" >> $@
    @echo "apr_hook_global_pool" >> $@
    @echo "apr_global_hook_pool" >> $@
    @echo "apr_hook_debug_enabled" >> $@
    @echo "apr_debug_module_hooks" >> $@
    @echo "apr_hook_debug_current" >> $@
    @echo "apr_current_hooking_module" >> $@
    $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | grep -v apr_ | \
        sed -e 's/^.*[)]\(.*\);\$$/\1/' >> $@
    $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep -v apr_ | \
        sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
Choose whichever list is appropriate for the installation. If the requirements of the CSP Gateway are the only consideration then the first ‘minimal’ list will be sufficient.
Having modified the Makefile, proceed to the make and installation stages (steps 2 and 3). The Apache installation produced works with the pre-built Gateway DSOs supplied by InterSystems.