updated build system from manual makefile to cmake. added versioning starting at 1.0 with this commit

This commit is contained in:
Rexy712 2018-05-18 12:26:29 -07:00
parent 9d55a23e82
commit 2fe3c80a09
9 changed files with 97 additions and 91 deletions

2
.gitignore vendored
View File

@ -3,3 +3,5 @@
rexbacklight
rexledctl
*.swp
build
include/config.h

39
CMakeLists.txt Normal file
View File

@ -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)

View File

@ -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)

View File

@ -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;

View File

@ -32,6 +32,7 @@
extern int return_value;
void mem_error(void);
_Noreturn void version(void);
_Noreturn void usage(int exit_val);

2
include/config.h.in Normal file
View File

@ -0,0 +1,2 @@
#define REXBACKLIGHT_VERSION_MAJOR 1
#define REXBACKLIGHT_VERSION_MINOR 0

View File

@ -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]);

View File

@ -16,6 +16,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#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");

View File

@ -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;
}