blob: 0e8aa4ee6bdb1142d20a2ed21cfb850cd7701fae [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define CHAZ_USE_SHORT_NAMES
#include "Charmonizer/Core/ConfWriter.h"
#include "Charmonizer/Core/Compiler.h"
#include "Charmonizer/Core/Dir.h"
#include "Charmonizer/Core/Util.h"
#include "Charmonizer/Core/HeaderChecker.h"
#include "Charmonizer/Probe/DirManip.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
static const char cygwin_code[] =
QUOTE(#ifndef __CYGWIN__ )
QUOTE( #error "Not Cygwin" )
QUOTE(#endif )
QUOTE(int main() { return 0; } );
void
DirManip_run(void) {
FILE *f;
char dir_sep[3];
chaz_bool_t remove_zaps_dirs = false;
chaz_bool_t has_dirent_h = HeadCheck_check_header("dirent.h");
chaz_bool_t has_direct_h = HeadCheck_check_header("direct.h");
chaz_bool_t has_dirent_d_namlen = false;
chaz_bool_t has_dirent_d_type = false;
ConfWriter_start_module("DirManip");
Dir_init();
/* Header checks. */
if (has_dirent_h) {
ConfWriter_append_conf("#define CHY_HAS_DIRENT_H\n");
}
if (has_direct_h) {
ConfWriter_append_conf("#define CHY_HAS_DIRECT_H\n");
}
/* Check for members in struct dirent. */
if (has_dirent_h) {
has_dirent_d_namlen = HeadCheck_contains_member(
"struct dirent", "d_namlen",
"#include <sys/types.h>\n#include <dirent.h>"
);
if (has_dirent_d_namlen) {
ConfWriter_append_conf("#define CHY_HAS_DIRENT_D_NAMLEN\n", dir_sep);
}
has_dirent_d_type = HeadCheck_contains_member(
"struct dirent", "d_type",
"#include <sys/types.h>\n#include <dirent.h>"
);
if (has_dirent_d_type) {
ConfWriter_append_conf("#define CHY_HAS_DIRENT_D_TYPE\n", dir_sep);
}
}
if (Dir_mkdir_num_args == 2) {
/* It's two args, but the command isn't "mkdir". */
ConfWriter_append_conf("#define chy_makedir(_dir, _mode) %s(_dir, _mode)\n",
Dir_mkdir_command);
ConfWriter_append_conf("#define CHY_MAKEDIR_MODE_IGNORED 0\n");
}
else if (Dir_mkdir_num_args == 1) {
/* It's one arg... mode arg will be ignored. */
ConfWriter_append_conf("#define chy_makedir(_dir, _mode) %s(_dir)\n",
Dir_mkdir_command);
ConfWriter_append_conf("#define CHY_MAKEDIR_MODE_IGNORED 1\n");
}
if (CC_test_compile(cygwin_code, strlen(cygwin_code))) {
strcpy(dir_sep, "/");
}
else if (HeadCheck_check_header("windows.h")) {
strcpy(dir_sep, "\\\\");
}
else {
strcpy(dir_sep, "/");
}
ConfWriter_append_conf("#define CHY_DIR_SEP \"%s\"\n", dir_sep);
/* See whether remove works on directories. */
Dir_mkdir("_charm_test_remove_me");
if (0 == remove("_charm_test_remove_me")) {
remove_zaps_dirs = true;
ConfWriter_append_conf("#define CHY_REMOVE_ZAPS_DIRS\n");
}
Dir_rmdir("_charm_test_remove_me");
/* Shorten. */
ConfWriter_start_short_names();
ConfWriter_shorten_macro("DIR_SEP");
if (has_dirent_h) { ConfWriter_shorten_macro("HAS_DIRENT_H"); }
if (has_direct_h) { ConfWriter_shorten_macro("HAS_DIRECT_H"); }
if (has_dirent_d_namlen) { ConfWriter_shorten_macro("HAS_DIRENT_D_NAMLEN"); }
if (has_dirent_d_type) { ConfWriter_shorten_macro("HAS_DIRENT_D_TYPE"); }
ConfWriter_shorten_function("makedir");
ConfWriter_shorten_macro("MAKEDIR_MODE_IGNORED");
if (remove_zaps_dirs) { ConfWriter_shorten_macro("REMOVE_ZAPS_DIRS"); }
ConfWriter_end_short_names();
ConfWriter_end_module();
}