updated build system from manual makefile to cmake. added versioning starting at 1.0 with this commit
This commit is contained in:
parent
9d55a23e82
commit
2fe3c80a09
2
.gitignore
vendored
2
.gitignore
vendored
@ -3,3 +3,5 @@
|
||||
rexbacklight
|
||||
rexledctl
|
||||
*.swp
|
||||
build
|
||||
include/config.h
|
||||
|
||||
39
CMakeLists.txt
Normal file
39
CMakeLists.txt
Normal 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)
|
||||
50
Makefile
50
Makefile
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
2
include/config.h.in
Normal file
@ -0,0 +1,2 @@
|
||||
#define REXBACKLIGHT_VERSION_MAJOR 1
|
||||
#define REXBACKLIGHT_VERSION_MINOR 0
|
||||
29
src/cmd.c
29
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]);
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user