From 2fe3c80a097e4be88f688b981078d6375e1764e0 Mon Sep 17 00:00:00 2001 From: Rexy712 Date: Fri, 18 May 2018 12:26:29 -0700 Subject: [PATCH] updated build system from manual makefile to cmake. added versioning starting at 1.0 with this commit --- .gitignore | 2 ++ CMakeLists.txt | 39 +++++++++++++++++++++++++++++++++++ Makefile | 50 --------------------------------------------- include/cmd.h | 15 +++++++------- include/common.h | 1 + include/config.h.in | 2 ++ src/cmd.c | 29 ++++++++++++++++++-------- src/common.c | 7 +++++++ src/rexbacklight.c | 43 ++++++++++++++++---------------------- 9 files changed, 97 insertions(+), 91 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 Makefile create mode 100644 include/config.h.in diff --git a/.gitignore b/.gitignore index df90c65..f0a916e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ rexbacklight rexledctl *.swp +build +include/config.h diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..efacd6d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,39 @@ +include(CMakeDependentOption) +cmake_minimum_required(VERSION 3.0.2) +project(rexbacklight) +set(rexbacklight_VERSION_MAJOR 1) +set(rexbacklight_VERSION_MINOR 0) +set(INCLUDE_PATH ${CMAKE_SOURCE_DIR}/include) +configure_file( + "${INCLUDE_PATH}/config.h.in" + "${INCLUDE_PATH}/config.h" +) +include_directories("${INCLUDE_PATH}") + +option(BUILD_REXLEDCTL "Build led control program" ON) +option(BUILD_REXBACKLIGHT "Build backlight control program" ON) +CMAKE_DEPENDENT_OPTION(INSTALL_UDEV_LED_RULE "Install the udev rule to allow users of video group to control led devices" ON + "BUILD_REXLEDCTL" OFF) +CMAKE_DEPENDENT_OPTION(INSTALL_UDEV_BACKLIGHT_RULE "Install the udev rule to allow users of video group to control backlight devices" ON + "BUILD_REXBACKLIGHT" OFF) +set(UDEV_DIR "/etc/udev/rules.d" CACHE STRING "Set the output directory for udev rules") +mark_as_advanced(UDEV_DIR) + +if(BUILD_REXLEDCTL) + add_executable (rexledctl src/rexbacklight.c src/cmd.c src/common.c) + target_compile_definitions(rexledctl PRIVATE REXLEDCTL) + install(TARGETS rexledctl RUNTIME DESTINATION bin) + if(INSTALL_UDEV_LED_RULE) + install(FILES ${CMAKE_SOURCE_DIR}/rules/91-leds.rules DESTINATION ${UDEV_DIR}) + endif() +endif() +if(BUILD_REXBACKLIGHT) + add_executable (rexbacklight src/rexbacklight.c src/cmd.c src/common.c) + target_compile_definitions(rexbacklight PRIVATE REXBACKLIGHT) + install(TARGETS rexbacklight RUNTIME DESTINATION bin) + if(INSTALL_UDEV_BACKLIGHT_RULE) + install(FILES ${CMAKE_SOURCE_DIR}/rules/91-backlight.rules DESTINATION ${UDEV_DIR}) + endif() +endif() + +add_custom_target(uninstall cat install_manifest.txt | xargs rm) diff --git a/Makefile b/Makefile deleted file mode 100644 index 32c5608..0000000 --- a/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -.PHONY:all -all: obj/dep rexbacklight rexledctl - strip --strip-unneeded rexbacklight - strip --strip-unneeded rexledctl - -debug: obj/dep rexbacklight rexledctl - -CFLAGS:=-Wall -Wextra -pedantic -std=c11 -debug:CFLAGS+=-g - -rexbacklight: obj/rexbacklight.o obj/common.o obj/cmd.o - gcc -o $@ $^ - -rexledctl: obj/rexledctl.o obj/common.o obj/cmd.o - gcc -o $@ $^ - -obj/rexledctl.o: src/rexbacklight.c - gcc -c $(CFLAGS) -o $@ $< -DREXLEDCTL -I"include" -MMD -MP -MF"obj/dep/rexledctl.d" - -obj/%.o: src/%.c - gcc -c $(CFLAGS) -o $@ $< -DREXBACKLIGHT -I"include" -MMD -MP -MF"obj/dep/$*.d" - -.PHONY: install -install: all - install -m755 -o root -g root -s rexbacklight /usr/bin/rexbacklight - install -m755 -o root -g root -s rexledctl /usr/bin/rexledctl - install -m600 -o root -g root rules/91-backlight.rules /etc/udev/rules.d/91-backlight.rules - install -m600 -o root -g root rules/91-leds.rules /etc/udev/rules.d/91-leds.rules - install -m755 -o root -g root rules/rexbacklight.init /etc/init.d/rexbacklight - -.PHONY: uninstall -uninstall: - rm -f /usr/bin/rexbacklight - rm -f /usr/bin/rexledctl - rm -f /etc/udev/rules.d/91-backlight.rules - rm -f /etc/udev/rules.d/91-leds.rules - rm -f /etc/init.d/rexbacklight - -obj: - mkdir -p $@ -obj/dep: - mkdir -p $@ - -.PHONY: clean -clean: - rm -rf obj - rm -f rexbacklight - rm -f rexledctl --include $(wildcard obj/dep/*.d) - diff --git a/include/cmd.h b/include/cmd.h index a658d6b..37a00ab 100644 --- a/include/cmd.h +++ b/include/cmd.h @@ -19,13 +19,14 @@ #ifndef RECBACKLIGHT_CMD_H #define REXBACKLIGHT_CMD_H -#define OP_INC 1 -#define OP_DEC 2 -#define OP_SET 4 -#define OP_LIST 8 -#define OP_GET 128 -#define OP_NONE 0 -#define OP_USAGE 255 +#define OP_INC 1 +#define OP_DEC 2 +#define OP_SET 4 +#define OP_LIST 8 +#define OP_GET 128 +#define OP_NONE 0 +#define OP_VERSION 254 +#define OP_USAGE 255 struct cmd_arg{ const char* lopt; diff --git a/include/common.h b/include/common.h index e46ca77..a27bdc6 100644 --- a/include/common.h +++ b/include/common.h @@ -32,6 +32,7 @@ extern int return_value; void mem_error(void); +_Noreturn void version(void); _Noreturn void usage(int exit_val); diff --git a/include/config.h.in b/include/config.h.in new file mode 100644 index 0000000..71642d7 --- /dev/null +++ b/include/config.h.in @@ -0,0 +1,2 @@ +#define REXBACKLIGHT_VERSION_MAJOR 1 +#define REXBACKLIGHT_VERSION_MINOR 0 diff --git a/src/cmd.c b/src/cmd.c index 7ffeaff..533c03c 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -23,6 +23,7 @@ #include "cmd.h" #include "common.h" +#define NO_OPT NULL #define GET_LONG_OPT "--get" #define GET_SHORT_OPT "-g" #define FADE_LONG_OPT "--fade" @@ -35,17 +36,22 @@ #define LIST_SHORT_OPT "-l" #define HELP_LONG_OPT "--help" #define HELP_SHORT_OPT "-h" +#define HELP_LONG_OPT "--help" +#define HELP_SHORT_OPT "-h" +#define VERSION_LONG_OPT "--version" - +#define CHECK_SHORT_OPTION(opt, arg) (!strcmp(opt##_SHORT_OPT, arg)) +#define CHECK_LONG_OPTION(opt, arg) (!strcmp(opt##_LONG_OPT, arg)) #define CHECK_OPTION(opt, arg) (!strcmp(opt##_LONG_OPT, arg) || !strcmp(opt##_SHORT_OPT, arg)) struct cmd_arg rexbacklight_args[] = { - {DEVICE_LONG_OPT, DEVICE_SHORT_OPT, "select which device to control"}, - {FADE_LONG_OPT, FADE_SHORT_OPT, "change brightness over time interval"}, - {STEPS_LONG_OPT, STEPS_SHORT_OPT, "number of steps over which to fade"}, - {GET_LONG_OPT, GET_SHORT_OPT, "print current brightness level to stdout"}, - {LIST_LONG_OPT, LIST_SHORT_OPT, "print device names to stdout and exit"}, - {HELP_LONG_OPT, HELP_SHORT_OPT, "print this help message and exit"} + {DEVICE_LONG_OPT, DEVICE_SHORT_OPT, "select which device to control"}, + {FADE_LONG_OPT, FADE_SHORT_OPT, "change brightness over time interval"}, + {STEPS_LONG_OPT, STEPS_SHORT_OPT, "number of steps over which to fade"}, + {GET_LONG_OPT, GET_SHORT_OPT, "print current brightness level to stdout"}, + {LIST_LONG_OPT, LIST_SHORT_OPT, "print device names to stdout and exit"}, + {HELP_LONG_OPT, HELP_SHORT_OPT, "print this help message and exit"}, + {VERSION_LONG_OPT, NO_OPT, "print program version and exit"} }; int rexbacklight_args_length = sizeof(rexbacklight_args) / sizeof(rexbacklight_args[0]); @@ -128,6 +134,10 @@ struct arg_values process_cmd_args(int argc, char** argv){ free_cmd_args(&ret); return (struct arg_values){.operation = OP_USAGE}; } + else if(CHECK_LONG_OPTION(VERSION, argv[i])){ + free_cmd_args(&ret); + return (struct arg_values){.operation = OP_VERSION}; + } else if(!strcmp(argv[i], "max")){ curr->operation = OP_SET; @@ -163,12 +173,13 @@ struct arg_values process_cmd_args(int argc, char** argv){ } else{ + //check for null terminator second to properly handle empty arguments int j; for(j = 0; j < 3;++j){ - if(argv[i][j] == '\0') - break; if(argv[i][j] < '0' || argv[i][j] > '9') UNRECOGNIZED_OPTION(); + if(argv[i][j] == '\0') + break; } curr->operation = OP_SET; curr->delta = atof(argv[i]); diff --git a/src/common.c b/src/common.c index d665be9..6c8dd11 100644 --- a/src/common.c +++ b/src/common.c @@ -16,6 +16,7 @@ along with this program. If not, see . */ +#include "config.h" #include "common.h" #include "cmd.h" @@ -30,8 +31,14 @@ void mem_error(void){ //name of the program being run so that we print the correct name in the usage extern const char* executable_name; +_Noreturn void version(void){ + printf("%s version %d.%d\n", executable_name, REXBACKLIGHT_VERSION_MAJOR, REXBACKLIGHT_VERSION_MINOR); + exit(return_value); +} + _Noreturn void usage(int exit_val){ int i; + printf("%s version %d.%d\n\n", executable_name, REXBACKLIGHT_VERSION_MAJOR, REXBACKLIGHT_VERSION_MINOR); printf("Usage: %s [argument] [options] [argument]\n\n", executable_name); printf("Options:\n"); diff --git a/src/rexbacklight.c b/src/rexbacklight.c index 7c2124c..c89deb6 100644 --- a/src/rexbacklight.c +++ b/src/rexbacklight.c @@ -254,7 +254,11 @@ void individual_device_loop(struct arg_values* a){ do_get(curr->device); break; } - chdir(device_dir); + if(chdir(device_dir)){ + io_error(IO_ERROR_OPEN, IO_ERROR_DIR, device_dir); + return_value = RETVAL_INVALID_DIR; + return; + } } } @@ -272,7 +276,11 @@ void all_device_loop(struct string_array* device_names, struct arg_values* args) continue; } do_assignment(args, device_names->list[i]); - chdir(device_dir); + if(chdir(device_dir)){ + io_error(IO_ERROR_OPEN, IO_ERROR_DIR, device_dir); + return_value = RETVAL_INVALID_DIR; + return; + } } break; case OP_LIST: @@ -286,7 +294,11 @@ void all_device_loop(struct string_array* device_names, struct arg_values* args) continue; } do_get(device_names->list[i]); - chdir(device_dir); + if(chdir(device_dir)){ + io_error(IO_ERROR_OPEN, IO_ERROR_DIR, device_dir); + return_value = RETVAL_INVALID_DIR; + return; + } } break; } @@ -298,22 +310,17 @@ int main(int argc, char** argv){ struct arg_values args; //A linked list of devices and the requested settings. struct string_array device_names; //List of all led/backlight devices in sysfs. struct arg_values* curr; - int starting_dir_max_len = pathconf(".", _PC_PATH_MAX); - char* starting_dir; args = process_cmd_args(argc, argv); if(args.operation == OP_USAGE){ usage(return_value); + }else if(args.operation == OP_VERSION){ + version(); } - starting_dir = malloc(starting_dir_max_len); - if(!starting_dir){ - mem_error(); - return RETVAL_MEM_ERROR; - } device_names = get_device_sources(); //Macro for easy memory cleaning -#define CLEANUP() do{free(starting_dir);free_string_array(&device_names);free_cmd_args(&args);}while(0) +#define CLEANUP() do{free_string_array(&device_names);free_cmd_args(&args);}while(0) @@ -344,10 +351,6 @@ int main(int argc, char** argv){ continue_outer:; } - if(!getcwd(starting_dir, starting_dir_max_len)){ - fprintf(stderr, "Unable to determine starting dir!\nWill be unable to return to it on completion!\n"); - } - //Change to the base directory for all sysfs leds/backlights if(chdir(device_dir)){ io_error(IO_ERROR_READ, IO_ERROR_DIR, device_dir); @@ -362,16 +365,6 @@ int main(int argc, char** argv){ all_device_loop(&device_names, &args); } - //Return to start directory - if(chdir(starting_dir)){ - CLEANUP(); - fprintf(stderr, "Could not return to starting directory!\nWas the directory moved/deleted?\n"); - if(chdir(getenv("HOME"))){ - chdir("/"); - } - return RETVAL_INVALID_DIR; - } - CLEANUP(); return return_value; }