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
|
rexbacklight
|
||||||
rexledctl
|
rexledctl
|
||||||
*.swp
|
*.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
|
#ifndef RECBACKLIGHT_CMD_H
|
||||||
#define REXBACKLIGHT_CMD_H
|
#define REXBACKLIGHT_CMD_H
|
||||||
|
|
||||||
#define OP_INC 1
|
#define OP_INC 1
|
||||||
#define OP_DEC 2
|
#define OP_DEC 2
|
||||||
#define OP_SET 4
|
#define OP_SET 4
|
||||||
#define OP_LIST 8
|
#define OP_LIST 8
|
||||||
#define OP_GET 128
|
#define OP_GET 128
|
||||||
#define OP_NONE 0
|
#define OP_NONE 0
|
||||||
#define OP_USAGE 255
|
#define OP_VERSION 254
|
||||||
|
#define OP_USAGE 255
|
||||||
|
|
||||||
struct cmd_arg{
|
struct cmd_arg{
|
||||||
const char* lopt;
|
const char* lopt;
|
||||||
|
|||||||
@ -32,6 +32,7 @@
|
|||||||
extern int return_value;
|
extern int return_value;
|
||||||
|
|
||||||
void mem_error(void);
|
void mem_error(void);
|
||||||
|
_Noreturn void version(void);
|
||||||
_Noreturn void usage(int exit_val);
|
_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 "cmd.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#define NO_OPT NULL
|
||||||
#define GET_LONG_OPT "--get"
|
#define GET_LONG_OPT "--get"
|
||||||
#define GET_SHORT_OPT "-g"
|
#define GET_SHORT_OPT "-g"
|
||||||
#define FADE_LONG_OPT "--fade"
|
#define FADE_LONG_OPT "--fade"
|
||||||
@ -35,17 +36,22 @@
|
|||||||
#define LIST_SHORT_OPT "-l"
|
#define LIST_SHORT_OPT "-l"
|
||||||
#define HELP_LONG_OPT "--help"
|
#define HELP_LONG_OPT "--help"
|
||||||
#define HELP_SHORT_OPT "-h"
|
#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))
|
#define CHECK_OPTION(opt, arg) (!strcmp(opt##_LONG_OPT, arg) || !strcmp(opt##_SHORT_OPT, arg))
|
||||||
|
|
||||||
struct cmd_arg rexbacklight_args[] = {
|
struct cmd_arg rexbacklight_args[] = {
|
||||||
{DEVICE_LONG_OPT, DEVICE_SHORT_OPT, "select which device to control"},
|
{DEVICE_LONG_OPT, DEVICE_SHORT_OPT, "select which device to control"},
|
||||||
{FADE_LONG_OPT, FADE_SHORT_OPT, "change brightness over time interval"},
|
{FADE_LONG_OPT, FADE_SHORT_OPT, "change brightness over time interval"},
|
||||||
{STEPS_LONG_OPT, STEPS_SHORT_OPT, "number of steps over which to fade"},
|
{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"},
|
{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"},
|
{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"}
|
{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]);
|
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);
|
free_cmd_args(&ret);
|
||||||
return (struct arg_values){.operation = OP_USAGE};
|
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")){
|
else if(!strcmp(argv[i], "max")){
|
||||||
curr->operation = OP_SET;
|
curr->operation = OP_SET;
|
||||||
@ -163,12 +173,13 @@ struct arg_values process_cmd_args(int argc, char** argv){
|
|||||||
}
|
}
|
||||||
|
|
||||||
else{
|
else{
|
||||||
|
//check for null terminator second to properly handle empty arguments
|
||||||
int j;
|
int j;
|
||||||
for(j = 0; j < 3;++j){
|
for(j = 0; j < 3;++j){
|
||||||
if(argv[i][j] == '\0')
|
|
||||||
break;
|
|
||||||
if(argv[i][j] < '0' || argv[i][j] > '9')
|
if(argv[i][j] < '0' || argv[i][j] > '9')
|
||||||
UNRECOGNIZED_OPTION();
|
UNRECOGNIZED_OPTION();
|
||||||
|
if(argv[i][j] == '\0')
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
curr->operation = OP_SET;
|
curr->operation = OP_SET;
|
||||||
curr->delta = atof(argv[i]);
|
curr->delta = atof(argv[i]);
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "cmd.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
|
//name of the program being run so that we print the correct name in the usage
|
||||||
extern const char* executable_name;
|
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){
|
_Noreturn void usage(int exit_val){
|
||||||
int i;
|
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("Usage: %s [argument] [options] [argument]\n\n", executable_name);
|
||||||
|
|
||||||
printf("Options:\n");
|
printf("Options:\n");
|
||||||
|
|||||||
@ -254,7 +254,11 @@ void individual_device_loop(struct arg_values* a){
|
|||||||
do_get(curr->device);
|
do_get(curr->device);
|
||||||
break;
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
do_assignment(args, device_names->list[i]);
|
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;
|
break;
|
||||||
case OP_LIST:
|
case OP_LIST:
|
||||||
@ -286,7 +294,11 @@ void all_device_loop(struct string_array* device_names, struct arg_values* args)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
do_get(device_names->list[i]);
|
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;
|
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 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 string_array device_names; //List of all led/backlight devices in sysfs.
|
||||||
struct arg_values* curr;
|
struct arg_values* curr;
|
||||||
int starting_dir_max_len = pathconf(".", _PC_PATH_MAX);
|
|
||||||
char* starting_dir;
|
|
||||||
args = process_cmd_args(argc, argv);
|
args = process_cmd_args(argc, argv);
|
||||||
if(args.operation == OP_USAGE){
|
if(args.operation == OP_USAGE){
|
||||||
usage(return_value);
|
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();
|
device_names = get_device_sources();
|
||||||
|
|
||||||
//Macro for easy memory cleaning
|
//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:;
|
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
|
//Change to the base directory for all sysfs leds/backlights
|
||||||
if(chdir(device_dir)){
|
if(chdir(device_dir)){
|
||||||
io_error(IO_ERROR_READ, IO_ERROR_DIR, 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);
|
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();
|
CLEANUP();
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user